【问题标题】:Iterating through diff changes in LibGit2Sharp遍历 LibGit2Sharp 中的差异变化
【发布时间】:2012-06-08 07:23:00
【问题描述】:

在 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 属性已经“构建”,一种方法是解析它,但库首先构建输出然后我解析它似乎很愚蠢......我宁愿直接使用构建成分。

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

【问题讨论】:

  • 能否请您添加一个您所追求的快速示例(“我想构建我自己的差异输出,按照它们在文件中出现的正确顺序”) 什么已经可用?这将非常有帮助,因为我不确定是否清楚地理解“订购”问题...
  • @nulltoken 我已经更新了我的问题。 :)
  • 与你的问题无关,但你不应该在这样的循环中连接字符串,因为它的性能很差(O(n²))。请改用StringBuilder(或StringWriter)。

标签: c# .net libgit2 libgit2sharp


【解决方案1】:

据我所知,libgit2sharp 并未公开此信息,但在 blob 差异(但不是树差异)的情况下,它由 libgit2 提供。相关代码在ContentChanges.cs,具体在构造函数和LineCallback()方法中(树差异代码在TreeChanges.cs)。

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

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

【讨论】:

    【解决方案2】:

    @svick 是对的。没有暴露。

    open an issue/feature request 可能对进一步讨论这个话题很有帮助。实际上,公开一个完整的基于行的 diffgram 可能不适合库的当前“粒度”。但是,如果您可以提出一个可以使大多数用户受益的场景/用例,则可以进行一些研究以扩展 API。

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

    • 请参阅此 SO question 了解潜在线索
    • Neil Fraser's "Diff Strategies" paper 也是有关差异工具可能针对的策略和潜在警告的重要来源
    • DiffPlex,作为一个有效的可视化工具,也可能是鼓舞人心的
    • 再做一些工作,甚至可以实现类似于以下类型的可视化(来自 Perforce 4 查看器)


    (来源:macworld.com

    注意:为了缓解这种情况,在 C# 中公开 libgit2 diffing options 可能很有用。

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2016-03-29
      • 2023-01-24
      相关资源
      最近更新 更多