Я хотел бы запрограммировать что-то похожее на «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?
git_diff
это общий интерфейс для различий на основе строк, поэтому вы бы поставили свои функции для работы с отдельными строками и файлами.
Если вы ищете что-то, что дает вам текстовый вывод, произведенный git diff
и аналогичные утилиты, было бы проще пройти через git_patch API
,
Ты можешь позвонить
git_patch_from_blobs()
который даст вам git_patch
объект, который вы можете затем передать
git_patch_to_buf()
который запишет содержимое в унифицированном формате diff в git_buf
который вы можете использовать для печати в любой файл / экран, который вы хотите.
Вы также можете сделать это вручную, предоставив некоторые обратные вызовы, которые добавят информацию к некоторой структуре данных по вашему выбору, которую вы затем сможете преобразовать в унифицированный diff или бок о бок или что-то еще, но для упомянутого вами пользовательского случая, проходя через API патча намного проще.
Других решений пока нет …