我想将svn / cvs recods切成碎片然后放入数据库。之后,我可以轻松地使用这些数据。
任何java函数都可以记录下来吗?如何? 如果可能,请举例说明。谢谢。
答案 0 :(得分:1)
其他选项是JavaHL(Subversion绑定到Java)和SvnKit(仅使用Java的Java库)。
这两个库为您提供与使用'svn'相同的选项,但不使用外部程序。所以你可以使用函数调用提供的结构化输出。
答案 1 :(得分:0)
Subversion命令svn
具有许多子命令的--xml
选项。您可以使用它来获取XML格式的日志历史记录,然后可以使用您选择的XML解析器在Java中读取该日志历史记录。例如:
svn log --xml
答案 2 :(得分:0)
以下是我们用来查明是否需要根据文件修订进行更新的示例。它可能对你有帮助。它的C#,但我相信在Java中做同样的事情也是微不足道的。
class UpdateNeededCalculator
{
public static bool IsUpdateNeeded()
{
int newestRevisionThis, newestRevision;
GetNewestRevision(out newestRevision, out newestRevisionThis);
return !(newestRevisionThis >= newestRevision);
}
public static void GetNewestRevision(out int newestRevision, out int newestRevisionThis)
{
Process svn = new Process();
if (File.Exists(@"C:\Program Files (x86)\CollabNet Subversion Client\svn.exe"))
svn.StartInfo.FileName = @"C:\Program Files (x86)\CollabNet Subversion Client\svn.exe";
else if (File.Exists(@"C:\Program Files (x86)\CollabNet Subversion\svn.exe"))
svn.StartInfo.FileName = @"C:\Program Files (x86)\CollabNet Subversion\svn.exe";
else if (File.Exists(@"C:\Program Files\CollabNet Subversion\svn.exe"))
svn.StartInfo.FileName = @"C:\Program Files\CollabNet Subversion\svn.exe";
else if (File.Exists(@"c:\program files (x86)\subversion\bin\svn.exe"))
svn.StartInfo.FileName = @"c:\program files (x86)\subversion\bin\svn.exe";
else if (File.Exists(@"C:\Program Files (x86)\CollabNet\Subversion Client\svn.exe"))
svn.StartInfo.FileName = @"C:\Program Files (x86)\CollabNet\Subversion Client\svn.exe";
else if (File.Exists(@"c:\program files\subversion\bin\svn.exe"))
svn.StartInfo.FileName = @"c:\program files\subversion\bin\svn.exe";
else if (File.Exists(@"C:\CygWin\bin\svn.exe"))
svn.StartInfo.FileName = @"C:\CygWin\bin\svn.exe";
else
{
Console.WriteLine("You have to install the commandline svn");
throw new Exception("You have to install the commandline svn");
}
svn.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
svn.StartInfo.Arguments = "st --xml -v ..\\blabla";
svn.StartInfo.RedirectStandardOutput = true;
svn.StartInfo.UseShellExecute = false;
svn.Start();
XmlDocument svnxml = new XmlDocument();
svnxml.LoadXml(svn.StandardOutput.ReadToEnd());
svn.WaitForExit();
newestRevision = 0;
ProcessTarget(svnxml.FirstChild.NextSibling.FirstChild.ChildNodes, ref newestRevision, false);
svn.StartInfo.Arguments = "st --xml -v ";
svn.Start();
svnxml.LoadXml(svn.StandardOutput.ReadToEnd());
svn.WaitForExit();
newestRevisionThis = 0;
if (File.Exists("blabla.csproj"))
ProcessTarget(svnxml.FirstChild.NextSibling.FirstChild.ChildNodes, ref newestRevisionThis, true);
}
private static void ProcessTarget(XmlNodeList xmlNodeList, ref int newestRevision, bool allFiles)
{
foreach (XmlNode entries in xmlNodeList)
{
if (entries.Name == "target")
ProcessTarget(entries.ChildNodes, ref newestRevision, allFiles);
else
{
if (!allFiles && !entries.Attributes["path"].Value.EndsWith(".resx"))
continue;
try
{
if (entries.FirstChild.Attributes["item"].Value == "unversioned" || entries.FirstChild.Attributes["item"].Value == "added")
{
newestRevision = Int32.MaxValue;
}
else
{
int rev = Int32.Parse(entries.FirstChild.FirstChild.Attributes["revision"].Value);
if (rev > newestRevision)
newestRevision = rev;
}
}
catch { continue; }
}
}
}
}