libgit2:如何在大块中放置特定行

时间:2017-03-27 09:45:48

标签: xcode atlassian-sourcetree libgit2 git-patch git-stage

我正在编写一个mac应用程序,它允许我只包含包含特定文本的行作为子字符串。基本上我尝试构建源树为其用户提供的功能。在帅哥中划分选定的行。我的选择逻辑是,选择包含特定文本作为子字符串的行。但我无法弄清楚如何用libgit2实现这一目标。

我已经像这样初步化了回购

int error = git_repository_open(&repo, gitRepoString.UTF8String);

然后我正在创建一个工作目录的差异索引,如下所示。

error = git_diff_index_to_workdir(&diff, repo, NULL, NULL);

之后,我可以使用下面的回调函数遍历每个大块中的深渊和线条。

error = git_diff_foreach(diff, each_file_cb,
                                    each_binary_cb,
                                     each_hunk_cb,
                                     each_line_cb,
                                     &d);

并且为大块中的每一行调用回调。

int each_line_cb(const git_diff_delta *delta,
                 const git_diff_hunk *hunk,
                 const git_diff_line *line,
                 void *payload)
{
    return 0;
}

现在我意识到我需要以某种方式创建一个补丁,并在差异中添加必要的行到补丁。

任何人都可以指导正确的方向吗?如果libgit2还不允许这样做,是否有任何其他库可以让我这样做。此外,atlassian源代码树似乎也在使用libgit2。他们怎么可能实现这个呢?

顺便说一下,git CLI允许通过本答复中给出的修补来实现。 https://stackoverflow.com/a/32311872/569497

1 个答案:

答案 0 :(得分:1)

我最终手动实现了这个。事实证明这比我想象的要容易。

我申请大块头的方法:

  • 将目标文件的行拆分为数组
  • 收集"上下文"和#34;老"来自大块的行,并确保它们与现有内容相匹配
  • 收集"上下文"和"新"行,并替换我的行数组中的context / old部分
  • 将数据写回,尝试匹配现有的行结尾

应该很容易适应只应用特定的行。

我的代码在这里(在Swift中,使用Objective Git):https://github.com/Uncommon/Xit/blob/369dd52d444d4650759c22414121dd2a6be282d2/Xit/XTDiffDelta.swift