libgit2 — разность двух текстовых блобов

Я хотел бы запрограммировать что-то похожее на «git diff blobish blobish» с помощью libgit2

вот мой код пока

git_repository* repo;
git_repository_open(&repo, path/to/repository);
git_blob *oldBlob, *newBlob;
git_oid old_oid, new_oid;
const char* oldBlobHash = "92fd12351a4e4d6f10d30516149c624e6b9e3dc9";
git_oid_fromstr(&old_oid, oldBlobHash);
git_blob_lookup(&oldBlob, repo, &old_oid);
const char* newBlobHash = "80bf2770cdbb9580bc040d49775fccd405f534dc";
git_oid_fromstr(&new_oid, newBlobHash);
git_blob_lookup(&newBlob, repo, &new_oid);

git_diff_blobs(oldBlob,
NULL,
newBlob,
NULL,
NULL,?, ?, ?, ?); //what should I put in the question marks?

.... // how do I continue from here?

когда я запускаю «git diff 92fd1235 80bf2770» в командной строке, я получаю

diff --git a/92fd12351a4e4d6f10d30516149c624e6b9e3dc9 b/80bf2770cdbb9580bc040d49775fccd405f534dc
index 92fd123..80bf277 100644
--- a/92fd12351a4e4d6f10d30516149c624e6b9e3dc9
+++ b/80bf2770cdbb9580bc040d49775fccd405f534dc
@@ -1 +1 @@
-file1 v2
\ No newline at end of file
+file1 v4
\ No newline at end of file

Как я могу завершить мой код, чтобы получить тот же вывод, что и Git?

0

Решение

git_diff это общий интерфейс для различий на основе строк, поэтому вы бы поставили свои функции для работы с отдельными строками и файлами.

Если вы ищете что-то, что дает вам текстовый вывод, произведенный git diff и аналогичные утилиты, было бы проще пройти через git_patch API,

Ты можешь позвонить

git_patch_from_blobs()

который даст вам git_patch объект, который вы можете затем передать

git_patch_to_buf()

который запишет содержимое в унифицированном формате diff в git_buf который вы можете использовать для печати в любой файл / экран, который вы хотите.

Вы также можете сделать это вручную, предоставив некоторые обратные вызовы, которые добавят информацию к некоторой структуре данных по вашему выбору, которую вы затем сможете преобразовать в унифицированный diff или бок о бок или что-то еще, но для упомянутого вами пользовательского случая, проходя через API патча намного проще.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]