迭代LibGit2Sharp中的diff变化

时间:2012-06-08 07:23:00

标签: c# .net libgit2 libgit2sharp

在LibGit2Sharp中迭代TreeChanges的最佳方法(如高效,简单)是什么?

如果我访问.Patch属性,我会检索更改的全文。这对我来说还不够......理想情况下我希望能够遍历diff行,并且每行检索行的状态(修改,添加,删除)并从中构建我自己的输出。

更新

假设我想建立自己的差异输出。我想做的是迭代更改的行,在迭代期间,我会检查更改的类型(添加,删除),并构造我的输出。

例如:

var diff = "";
foreach (LineChange line in changes) // Bogus class "LineChange"
{
    if (line.Type == LineChange.TYPE_ADDED)
        diff += "+";
    else
        diff += "-";

    diff += line.Content;
    diff += "\n";
}

以上只是一个简单的例子,我正在寻找什么样的灵活性。能够完成更改,并根据线路更改类型运行一些逻辑。 Patch属性已经“构建”,一种方法就是解析它,但是库首先构建输出似乎很愚蠢,然后我解析它...我宁愿直接使用建筑成分

我需要这种功能,以便能够显示变化的视觉差异,这些变化涉及的代码和逻辑比我上面给出的简单示例要多得多。

2 个答案:

答案 0 :(得分:2)

据我所知,这个信息不是由libgit2sharp公开的,但是在blob diffs的情况下由libgit2提供(但不是树差异)。相关代码位于ContentChanges.cs中,特别是在构造函数和LineCallback()方法中(树差异的代码在TreeChanges.cs中)。

因此,我认为你有两种选择:

  1. 调用git_diff_blobs()内部使用的方法ContentChanges,使用反射(它是NativeMethods中的内部方法),或者将PInvoke签名复制到项目中。您很可能还需要Utf8Marshaler
  2. 修改ContentChanges的代码,以满足您的需求。如果你这样做,为这个改变创建一个拉取请求可能是有意义的,这样其他人也可以使用它。

答案 1 :(得分:2)

@svick是对的。它没有曝光。

open an issue/feature request 可能有助于进一步讨论此主题。实际上,暴露基于完整的基于线的差异可能不适合图书馆的当前“粒度”。但是,如果您能够提出一个可以使大多数用户受益的场景/用例,可能会投入一些研究来扩展API。

除此选项外,可能还有其他解决方案:对当前生成的补丁进行后期处理

  • 查看此 SO question 了解潜在潜在客户
  • Neil Fraser's "Diff Strategies" paper 也是关于差异工具可能针对什么的策略和潜在警告的重要来源
  • DiffPlex ,作为一个可行的可视化工具,也可能是鼓舞人心的
  • 通过更多的工作,人们甚至可以实现类似于以下类型的可视化(来自Perforce 4查看器)

p4merge http://images.macworld.com/images/news/graphics/132450-perforce.jpg

注意:为了简化这一点,在C#中公开libgit2 diffing options 可能很有用。