name = find_name(second, def_name, p_value, TERM_SPACE | TERM_TAB);
new_name = name;
} else if (is_dev_null(second)) {
is_delete = 1;
name = find_name(first, def_name, p_value);
name = find_name(first, def_name, p_value, TERM_EXIST | TERM_SPACE | TERM_TAB);
old_name = name;
} else {
name = find_name(first, def_name, p_value);
name = find_name(second, name, p_value);
name = find_name(first, def_name, p_value, TERM_EXIST | TERM_SPACE | TERM_TAB);
name = find_name(second, name, p_value, TERM_EXIST | TERM_SPACE | TERM_TAB);
old_name = new_name = name;
}
if (!name)
die("unable to find filename in patch at line %d", linenr);
old_name = name;
new_name = name;
}
static int gitdiff_hdrend(const char *line)
@ -159,15 +190,15 @@ static int gitdiff_hdrend(const char *line)
@@ -159,15 +190,15 @@ static int gitdiff_hdrend(const char *line)
static int gitdiff_oldname(const char *line)
{
if (!old_name)
old_name = find_name(line, NULL, 1);
if (!old_name && !is_new)
old_name = find_name(line, NULL, 1, 0);
return 0;
}
static int gitdiff_newname(const char *line)
{
if (!new_name)
new_name = find_name(line, NULL, 1);
if (!new_name && !is_delete)
new_name = find_name(line, NULL, 1, 0);
return 0;
}
@ -198,28 +229,28 @@ static int gitdiff_newfile(const char *line)
@@ -198,28 +229,28 @@ static int gitdiff_newfile(const char *line)
static int gitdiff_copysrc(const char *line)
{
is_copy = 1;
old_name = find_name(line, NULL, 0);
old_name = find_name(line, NULL, 0, 0);
return 0;
}
static int gitdiff_copydst(const char *line)
{
is_copy = 1;
new_name = find_name(line, NULL, 0);
new_name = find_name(line, NULL, 0, 0);
return 0;
}
static int gitdiff_renamesrc(const char *line)
{
is_rename = 1;
old_name = find_name(line, NULL, 0);
old_name = find_name(line, NULL, 0, 0);
return 0;
}
static int gitdiff_renamedst(const char *line)
{
is_rename = 1;
new_name = find_name(line, NULL, 0);
new_name = find_name(line, NULL, 0, 0);
return 0;
}
@ -228,6 +259,15 @@ static int gitdiff_similarity(const char *line)
@@ -228,6 +259,15 @@ static int gitdiff_similarity(const char *line)
return 0;
}
/*
* This is normal for a diff that doesn't change anything: we'll fall through
* into the next diff. Tell the parser to break out.
*/
static int gitdiff_unrecognized(const char *line)
{
return -1;
}
/* Verify that we recognize the lines following a git header */
static int parse_git_header(char *line, int len, unsigned int size)
{
@ -257,6 +297,7 @@ static int parse_git_header(char *line, int len, unsigned int size)
@@ -257,6 +297,7 @@ static int parse_git_header(char *line, int len, unsigned int size)
{ "rename from ", gitdiff_renamesrc },
{ "rename to ", gitdiff_renamedst },
{ "similarity index ", gitdiff_similarity },
{ "", gitdiff_unrecognized },
};
int i;
@ -270,6 +311,7 @@ static int parse_git_header(char *line, int len, unsigned int size)
@@ -270,6 +311,7 @@ static int parse_git_header(char *line, int len, unsigned int size)