commit 49ff05d0020e362d1d936c61fac7aad7a3a880e4
parent b7f749eb3782322e9de02f0dc6fbbc3866f4f1d2
Author: Chris Bracken <chris@bracken.jp>
Date: Tue, 17 Feb 2026 18:15:01 +0900
delta: make GitDelta.{old,new}_file_path owned copies
Diffstat:
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/src/git/delta.c b/src/git/delta.c
@@ -167,32 +167,28 @@ char status_for_delta(const git_diff_delta* delta) {
struct GitDelta {
bool is_binary;
char status;
- const char* old_file_path;
- const char* new_file_path;
+ char* old_file_path;
+ char* new_file_path;
size_t addcount;
size_t delcount;
GitHunk** hunks;
size_t hunks_len;
-
- git_patch* patch;
};
GitDelta* gitdelta_create(git_patch* patch) {
GitDelta* delta = ecalloc(1, sizeof(GitDelta));
- /* Take ownership of patch. */
- delta->patch = patch;
-
const git_diff_delta* git_delta = git_patch_get_delta(patch);
delta->status = status_for_delta(git_delta);
delta->is_binary = git_delta->flags & GIT_DIFF_FLAG_BINARY;
- delta->old_file_path = git_delta->old_file.path;
- delta->new_file_path = git_delta->new_file.path;
+ delta->old_file_path = git_delta->old_file.path ? estrdup(git_delta->old_file.path) : NULL;
+ delta->new_file_path = git_delta->new_file.path ? estrdup(git_delta->new_file.path) : NULL;
delta->addcount = 0;
delta->delcount = 0;
/* Skip stats for binary data. */
if (delta->is_binary) {
+ git_patch_free(patch);
return delta;
}
@@ -224,6 +220,7 @@ GitDelta* gitdelta_create(git_patch* patch) {
}
}
}
+ git_patch_free(patch);
return delta;
}
@@ -231,14 +228,14 @@ void gitdelta_free(GitDelta* delta) {
if (!delta) {
return;
}
+ free(delta->old_file_path);
+ free(delta->new_file_path);
for (size_t i = 0; i < delta->hunks_len; i++) {
githunk_free(delta->hunks[i]);
delta->hunks[i] = NULL;
}
free(delta->hunks);
delta->hunks = NULL;
- git_patch_free(delta->patch);
- delta->patch = NULL;
free(delta);
}