如何通过java获取svn / cvs日志记录?

时间:2010-04-11 19:53:01

标签: java svn cvs

我想将svn / cvs recods切成碎片然后放入数据库。之后,我可以轻松地使用这些数据。

任何java函数都可以记录下来吗?如何? 如果可能,请举例说明。谢谢。

3 个答案:

答案 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; }
        }
     }
  }

}