Получение объединяемых ревизий с помощью SharpSvn

При настройке слияния в клиенте TortoiseSvn есть замечательный флажок «Скрыть не объединяемые ревизии». Я хочу воспроизвести список ревизий, который отображается, когда он включен с помощью SharpSvn.

TortoiseSvn

В документации TortoiseSvn поясняется этот флажок:

Когда используется отслеживание слияния, в диалоговом окне журнала будут отображаться ранее объединенные ревизии и ревизии, предшествующие общей точке-предку, то есть до того, как ветвь была скопирована, выделенные серым цветом. Флажок Скрыть не объединяемые ревизии позволяет полностью отфильтровать эти ревизии, чтобы вы видели только те ревизии, которые можно объединить.

Как я могу воспроизвести эту функциональность в коде SharpSvn? Мне нужен список SvnLogEventArgs (или подобных), которые являются кандидатами на слияние.

Текущее состояние: мне удалось только получить журналы для обеих ветвей. Я не могу понять, как получить соответствующий атрибут svn:mergeinfo или что с ним делать, как только я его получу.


person Bobson    schedule 15.07.2016    source источник


Ответы (2)


Я продолжал отключаться и переходить по ссылкам, и вот что у меня получилось:

using (var client = new SvnClient())
{
    var release = SvnTarget.FromUri(new Uri(@"https://******/branches/Release"));
    var trunk = SvnTarget.FromUri(new Uri(@"https://******/trunk"));

    string trunkMergeinfo, releaseMergeinfo;
    client.GetProperty(release, "svn:mergeinfo", out releaseMergeinfo);
    client.GetProperty(trunk, "svn:mergeinfo", out trunkMergeinfo);
    var relInfos = releaseMergeinfo.Split("\n");
    var trunkInfos = trunkMergeinfo.Split("\n");

    // This is here because I don't know what will happen once I merge something into trunk.
    Debug.Assert(relInfos.Except(trunkInfos).Count() == 1,"Too many unknown merge paths");

    var trunklist = relInfos.SingleOrDefault(i => i.StartsWith("/trunk:"));
    var revisions = trunklist.Replace("/trunk:", "").Split(",").SelectMany(t =>
    {
        // If the log contains a range, break it out to it's specific revisions.
        if (t.Contains("-"))
        {
            var match = Regex.Match(t, @"(\d+)-(\d+)");
            var start = int.Parse(match.Groups[1].Value);
            var end = int.Parse(match.Groups[2].Value);
            return Enumerable.Range(start, end - start + 1).ToArray();
        }
        else
            return new[] { int.Parse(t) };
    }).Select(x => (long)x);

    Collection<SvnLogEventArgs> baseRevs;
    // Why can't this take "trunk" or a property thereof as an argument?
    client.GetLog(new Uri(@"https://******/trunk"), new SvnLogArgs { Start = 1725, End = SvnRevisionType.Head }, out baseRevs);
    baseRevs.Reverse().Where(r => !revisions.Contains(r.Revision) ).Select(x => x.LogMessage).Dump();
}

Надеюсь, это поможет кому-то еще, хотя я отмечу, что в нем не так много проверок работоспособности, которые я бы добавил в производственный код - это быстрая и грязная версия.

person Bobson    schedule 15.07.2016

Попробуйте SvnClient.ListMergesEligible: http://sharpsvn.qqn.nl/current/html/M_SharpSvn_SvnClient_ListMergesEligible_1.htm

Редактировать. SharpSVN кажется мне глючным, поэтому я выбрал cmd.

Проверь это:

    private static void mergelhetőVerziókListája()
    {
      string revíziók = cmd("svn", "mergeinfo --show-revs eligible \".../branches/dev\" \".../trunk\"");
    }

    private static string cmd(string utasítás, string paraméter)
    {
      StringBuilder eredmény = new StringBuilder();
      Process cmd = new Process()
      {
        StartInfo = new ProcessStartInfo
        {
          FileName = utasítás,
          Arguments = paraméter,
          UseShellExecute = false,
          RedirectStandardOutput = true,
          CreateNoWindow = true
        }
      };
      cmd.Start();
      while (!cmd.StandardOutput.EndOfStream)
      {
        string kimenet = cmd.StandardOutput.ReadLine();
        eredmény.AppendLine(kimenet); //...
      }
      return eredmény.ToString();
    }
person Zéiksz    schedule 29.07.2019
comment
Конечно, .../branchs/dev\ и trunk должны быть вашим путем... Я удалил свой путь из кода. - person Zéiksz; 29.07.2019