summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2015-09-24 10:32:15 -0400
committerEdward Thomson <ethomson@github.com>2016-05-26 13:01:07 -0500
commit4117a2350f87456d76659d9327193bb708187ba9 (patch)
treecd15f610dda604355ec3755a2ffb0c95cc545a8d
parent6278fbc5dd5467e3f66f31dc9c4bb4a1a3519ba5 (diff)
downloadlibgit2-4117a2350f87456d76659d9327193bb708187ba9.tar.gz
patch parse: dup the patch from the callers
-rw-r--r--src/patch.c6
-rw-r--r--src/patch_diff.c6
-rw-r--r--src/patch_parse.c27
3 files changed, 28 insertions, 11 deletions
diff --git a/src/patch.c b/src/patch.c
index f05cfb21a..e14ffa9c0 100644
--- a/src/patch.c
+++ b/src/patch.c
@@ -196,12 +196,6 @@ int git_patch_get_line_in_hunk(
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)
patch->free_fn(patch);
}
diff --git a/src/patch_diff.c b/src/patch_diff.c
index 1a3aeda5e..b8adcf3e1 100644
--- a/src/patch_diff.c
+++ b/src/patch_diff.c
@@ -25,6 +25,12 @@ static void patch_diff_free(git_patch *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->nfile);
diff --git a/src/patch_parse.c b/src/patch_parse.c
index 418ed1e0c..4e4e0a68a 100644
--- a/src/patch_parse.c
+++ b/src/patch_parse.c
@@ -10,6 +10,10 @@ typedef struct {
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
* a rename (and rename paths are specified) or if no `+++`/`---` line specify
* the paths.
@@ -523,7 +527,7 @@ static int parse_hunk_body(
int newlines = hunk->hunk.new_lines;
for (;
- ctx->remain > 4 && (oldlines || newlines) &&
+ ctx->remain > 4 && (oldlines || newlines) &&
memcmp(ctx->line, "@@ -", 4) != 0;
parse_advance_line(ctx)) {
@@ -931,6 +935,12 @@ static void patch_parsed__free(git_patch *p)
if (!patch)
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->new_prefix);
git__free(patch->header_old_path);
@@ -939,9 +949,7 @@ static void patch_parsed__free(git_patch *p)
git__free(patch->rename_new_path);
git__free(patch->old_path);
git__free(patch->new_path);
- git_array_clear(patch->base.hunks);
- git_array_clear(patch->base.lines);
- git__free(patch->base.delta);
+ git__free(patch->content);
git__free(patch);
}
@@ -969,10 +977,19 @@ int git_patch_from_patchfile(
patch->base.free_fn = patch_parsed__free;
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->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.remain = content_len;