在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
属性已经“构建”,一种方法就是解析它,但是库首先构建输出似乎很愚蠢,然后我解析它...我宁愿直接使用建筑成分
我需要这种功能,以便能够显示变化的视觉差异,这些变化涉及的代码和逻辑比我上面给出的简单示例要多得多。
答案 0 :(得分:2)
据我所知,这个信息不是由libgit2sharp公开的,但是在blob diffs的情况下由libgit2提供(但不是树差异)。相关代码位于ContentChanges.cs
中,特别是在构造函数和LineCallback()
方法中(树差异的代码在TreeChanges.cs
中)。
因此,我认为你有两种选择:
git_diff_blobs()
内部使用的方法ContentChanges
,使用反射(它是NativeMethods
中的内部方法),或者将PInvoke签名复制到项目中。您很可能还需要Utf8Marshaler
。ContentChanges
的代码,以满足您的需求。如果你这样做,为这个改变创建一个拉取请求可能是有意义的,这样其他人也可以使用它。答案 1 :(得分:2)
@svick是对的。它没有曝光。
open an issue/feature request 可能有助于进一步讨论此主题。实际上,暴露基于完整的基于线的差异可能不适合图书馆的当前“粒度”。但是,如果您能够提出一个可以使大多数用户受益的场景/用例,可能会投入一些研究来扩展API。
除此选项外,可能还有其他解决方案:对当前生成的补丁进行后期处理
p4merge http://images.macworld.com/images/news/graphics/132450-perforce.jpg
注意:为了简化这一点,在C#中公开libgit2 diffing options 可能很有用。