Commit 4117a235 by Edward Thomson Committed by Edward Thomson

patch parse: dup the patch from the callers

parent 6278fbc5
...@@ -196,12 +196,6 @@ int git_patch_get_line_in_hunk( ...@@ -196,12 +196,6 @@ int git_patch_get_line_in_hunk(
static void git_patch__free(git_patch *patch) static void git_patch__free(git_patch *patch)
{ {
git_array_clear(patch->lines);
git_array_clear(patch->hunks);
git__free((char *)patch->binary.old_file.data);
git__free((char *)patch->binary.new_file.data);
if (patch->free_fn) if (patch->free_fn)
patch->free_fn(patch); patch->free_fn(patch);
} }
......
...@@ -25,6 +25,12 @@ static void patch_diff_free(git_patch *p) ...@@ -25,6 +25,12 @@ static void patch_diff_free(git_patch *p)
{ {
git_patch_diff *patch = (git_patch_diff *)p; git_patch_diff *patch = (git_patch_diff *)p;
git_array_clear(patch->base.lines);
git_array_clear(patch->base.hunks);
git__free((char *)patch->base.binary.old_file.data);
git__free((char *)patch->base.binary.new_file.data);
git_diff_file_content__clear(&patch->ofile); git_diff_file_content__clear(&patch->ofile);
git_diff_file_content__clear(&patch->nfile); git_diff_file_content__clear(&patch->nfile);
......
...@@ -10,6 +10,10 @@ typedef struct { ...@@ -10,6 +10,10 @@ typedef struct {
git_patch_options opts; git_patch_options opts;
/* the patch contents, which lines will point into. */
/* TODO: allow us to point somewhere refcounted. */
char *content;
/* the paths from the `diff --git` header, these will be used if this is not /* the paths from the `diff --git` header, these will be used if this is not
* a rename (and rename paths are specified) or if no `+++`/`---` line specify * a rename (and rename paths are specified) or if no `+++`/`---` line specify
* the paths. * the paths.
...@@ -931,6 +935,12 @@ static void patch_parsed__free(git_patch *p) ...@@ -931,6 +935,12 @@ static void patch_parsed__free(git_patch *p)
if (!patch) if (!patch)
return; return;
git__free((char *)patch->base.binary.old_file.data);
git__free((char *)patch->base.binary.new_file.data);
git_array_clear(patch->base.hunks);
git_array_clear(patch->base.lines);
git__free(patch->base.delta);
git__free(patch->old_prefix); git__free(patch->old_prefix);
git__free(patch->new_prefix); git__free(patch->new_prefix);
git__free(patch->header_old_path); git__free(patch->header_old_path);
...@@ -939,9 +949,7 @@ static void patch_parsed__free(git_patch *p) ...@@ -939,9 +949,7 @@ static void patch_parsed__free(git_patch *p)
git__free(patch->rename_new_path); git__free(patch->rename_new_path);
git__free(patch->old_path); git__free(patch->old_path);
git__free(patch->new_path); git__free(patch->new_path);
git_array_clear(patch->base.hunks); git__free(patch->content);
git_array_clear(patch->base.lines);
git__free(patch->base.delta);
git__free(patch); git__free(patch);
} }
...@@ -969,10 +977,19 @@ int git_patch_from_patchfile( ...@@ -969,10 +977,19 @@ int git_patch_from_patchfile(
patch->base.free_fn = patch_parsed__free; patch->base.free_fn = patch_parsed__free;
patch->base.delta = git__calloc(1, sizeof(git_diff_delta)); patch->base.delta = git__calloc(1, sizeof(git_diff_delta));
GITERR_CHECK_ALLOC(patch->base.delta);
patch->base.delta->status = GIT_DELTA_MODIFIED; patch->base.delta->status = GIT_DELTA_MODIFIED;
patch->base.delta->nfiles = 2; patch->base.delta->nfiles = 2;
ctx.content = content; if (content_len) {
patch->content = git__malloc(content_len);
GITERR_CHECK_ALLOC(patch->content);
memcpy(patch->content, content, content_len);
}
ctx.content = patch->content;
ctx.content_len = content_len; ctx.content_len = content_len;
ctx.remain = content_len; ctx.remain = content_len;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment