Как получить запись журнала SVN / CVS по Java? - PullRequest
1 голос
/ 11 апреля 2010

Я хочу разрезать записи svn / cvs на части и затем поместить в базу данных. После этого я могу легко использовать эти данные.

Любая функция Java может получить запись? и как? Если возможно, приведите пример. Спасибо.

Ответы [ 3 ]

1 голос
/ 12 апреля 2010

Другими вариантами являются JavaHL (привязка Subversion к Java) и SvnKit (библиотека только для Java для использования Subversion).

Эти две библиотеки предоставляют вам те же опции, что и при использовании 'svn', но без использования внешней программы. Таким образом, вы можете просто использовать структурированный вывод, предоставляемый вызовами функций.

0 голосов
/ 12 апреля 2010

Вот пример, который мы используем, чтобы выяснить, нужно ли нам делать какие-либо обновления, основанные на ревизиях файлов. Это может помочь вам. Это 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; }
        }
     }
  }

}

0 голосов
/ 12 апреля 2010

Команда Subversion svn имеет опции --xml для многих своих подкоманд. Вы можете использовать это, чтобы получить историю журнала в формате XML, которую затем можно прочитать на Java, используя предпочитаемый XML-анализатор. Например:

svn log --xml
...