summaryrefslogtreecommitdiff
path: root/src/patch_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/patch_parse.c')
-rw-r--r--src/patch_parse.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/patch_parse.c b/src/patch_parse.c
index 44bcf8f75..5ee09ee27 100644
--- a/src/patch_parse.c
+++ b/src/patch_parse.c
@@ -74,8 +74,8 @@ static int parse_advance_expected(
return 0;
}
-#define parse_advance_expected_s(ctx, str) \
- parse_advance_expected(ctx, str, sizeof(str) - 1)
+#define parse_advance_expected_str(ctx, str) \
+ parse_advance_expected(ctx, str, strlen(str))
static int parse_advance_ws(git_patch_parse_ctx *ctx)
{
@@ -220,7 +220,7 @@ static int parse_header_git_index(
{
if (parse_header_oid(&patch->base.delta->old_file.id,
&patch->base.delta->old_file.id_abbrev, ctx) < 0 ||
- parse_advance_expected_s(ctx, "..") < 0 ||
+ parse_advance_expected_str(ctx, "..") < 0 ||
parse_header_oid(&patch->base.delta->new_file.id,
&patch->base.delta->new_file.id_abbrev, ctx) < 0)
return -1;
@@ -336,7 +336,7 @@ static int parse_header_percent(uint16_t *out, git_patch_parse_ctx *ctx)
parse_advance_chars(ctx, (end - ctx->line));
- if (parse_advance_expected_s(ctx, "%") < 0)
+ if (parse_advance_expected_str(ctx, "%") < 0)
return -1;
if (val > 100)
@@ -379,6 +379,7 @@ static const header_git_op header_git_ops[] = {
{ "diff --git ", NULL },
{ "@@ -", NULL },
{ "GIT binary patch", NULL },
+ { "Binary files ", NULL },
{ "--- ", parse_header_git_oldpath },
{ "+++ ", parse_header_git_newpath },
{ "index ", parse_header_git_index },
@@ -404,7 +405,7 @@ static int parse_header_git(
int error = 0;
/* Parse the diff --git line */
- if (parse_advance_expected_s(ctx, "diff --git ") < 0)
+ if (parse_advance_expected_str(ctx, "diff --git ") < 0)
return parse_err("corrupt git diff header at line %d", ctx->line_num);
if (parse_header_path(&patch->header_old_path, ctx) < 0)
@@ -443,7 +444,7 @@ static int parse_header_git(
goto done;
parse_advance_ws(ctx);
- parse_advance_expected_s(ctx, "\n");
+ parse_advance_expected_str(ctx, "\n");
if (ctx->line_len > 0) {
error = parse_err("trailing data at line %d", ctx->line_num);
@@ -505,27 +506,27 @@ static int parse_hunk_header(
hunk->hunk.old_lines = 1;
hunk->hunk.new_lines = 1;
- if (parse_advance_expected_s(ctx, "@@ -") < 0 ||
+ if (parse_advance_expected_str(ctx, "@@ -") < 0 ||
parse_int(&hunk->hunk.old_start, ctx) < 0)
goto fail;
if (ctx->line_len > 0 && ctx->line[0] == ',') {
- if (parse_advance_expected_s(ctx, ",") < 0 ||
+ if (parse_advance_expected_str(ctx, ",") < 0 ||
parse_int(&hunk->hunk.old_lines, ctx) < 0)
goto fail;
}
- if (parse_advance_expected_s(ctx, " +") < 0 ||
+ if (parse_advance_expected_str(ctx, " +") < 0 ||
parse_int(&hunk->hunk.new_start, ctx) < 0)
goto fail;
if (ctx->line_len > 0 && ctx->line[0] == ',') {
- if (parse_advance_expected_s(ctx, ",") < 0 ||
+ if (parse_advance_expected_str(ctx, ",") < 0 ||
parse_int(&hunk->hunk.new_lines, ctx) < 0)
goto fail;
}
- if (parse_advance_expected_s(ctx, " @@") < 0)
+ if (parse_advance_expected_str(ctx, " @@") < 0)
goto fail;
parse_advance_line(ctx);
@@ -782,7 +783,7 @@ static int parse_patch_binary(
{
int error;
- if (parse_advance_expected_s(ctx, "GIT binary patch") < 0 ||
+ if (parse_advance_expected_str(ctx, "GIT binary patch") < 0 ||
parse_advance_nl(ctx) < 0)
return parse_err("corrupt git binary header at line %d", ctx->line_num);
@@ -804,6 +805,24 @@ static int parse_patch_binary(
return parse_err("corrupt git binary patch separator at line %d",
ctx->line_num);
+ patch->base.binary.contains_data = 1;
+ patch->base.delta->flags |= GIT_DIFF_FLAG_BINARY;
+ return 0;
+}
+
+static int parse_patch_binary_nodata(
+ git_patch_parsed *patch,
+ git_patch_parse_ctx *ctx)
+{
+ if (parse_advance_expected_str(ctx, "Binary files ") < 0 ||
+ parse_advance_expected_str(ctx, patch->header_old_path) < 0 ||
+ parse_advance_expected_str(ctx, " and ") < 0 ||
+ parse_advance_expected_str(ctx, patch->header_new_path) < 0 ||
+ parse_advance_expected_str(ctx, " differ") < 0 ||
+ parse_advance_nl(ctx) < 0)
+ return parse_err("corrupt git binary header at line %d", ctx->line_num);
+
+ patch->base.binary.contains_data = 0;
patch->base.delta->flags |= GIT_DIFF_FLAG_BINARY;
return 0;
}
@@ -840,6 +859,8 @@ static int parse_patch_body(
{
if (parse_ctx_contains_s(ctx, "GIT binary patch"))
return parse_patch_binary(patch, ctx);
+ else if (parse_ctx_contains_s(ctx, "Binary files "))
+ return parse_patch_binary_nodata(patch, ctx);
else
return parse_patch_hunks(patch, ctx);
}