libgit2:如何在大块中暂存特定行

libgit2: how to stage particular lines in a hunk

我正在编写一个 mac 应用程序,它将允许我仅暂存包含特定文本作为子字符串的行。基本上,我尝试构建源代码树为其用户提供的功能。在大块头中暂存 selected 行。我的 selection 逻辑是 select 包含特定文本作为子字符串的行。但我无法弄清楚如何使用 libgit2.

实现这一点

我已经像这样初始化了 repo

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);

并且正在为 hunk 中的每一行调用回调。

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

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

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

顺便说一句,git CLI 允许通过此答案中给出的补丁来做到这一点。

我最终手动实现了这个。结果比我想象的要容易。

我申请帅哥的方法:

  • 将目标文件的行分割成一个数组
  • 从大佬那里收集"context"和"old"行,并确保它们与现有内容相匹配
  • 收集 "context" 和 "new" 行,并替换我的行数组中的 context/old 部分
  • 写回数据,尝试匹配现有的行结尾

应该很容易适应仅应用特定行。

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