builtin-apply.c: Skip filenames without enough components
find_name() wrongly returned the whole filename for filenames without enough leading pathname components (e.g., when applying a patch to a top-level file with -p2). Include the -p value used in the error message when no filenames can be found. [jc: squashed a test from Nanako Shiraishi] Signed-off-by: Andreas Gruenbacher <agruen@suse.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
902f235378
commit
1586208727
@ -404,6 +404,9 @@ static char *squash_slash(char *name)
|
|||||||
{
|
{
|
||||||
int i = 0, j = 0;
|
int i = 0, j = 0;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
while (name[i]) {
|
while (name[i]) {
|
||||||
if ((name[j++] = name[i++]) == '/')
|
if ((name[j++] = name[i++]) == '/')
|
||||||
while (name[i] == '/')
|
while (name[i] == '/')
|
||||||
@ -416,7 +419,10 @@ static char *squash_slash(char *name)
|
|||||||
static char *find_name(const char *line, char *def, int p_value, int terminate)
|
static char *find_name(const char *line, char *def, int p_value, int terminate)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
const char *start = line;
|
const char *start = NULL;
|
||||||
|
|
||||||
|
if (p_value == 0)
|
||||||
|
start = line;
|
||||||
|
|
||||||
if (*line == '"') {
|
if (*line == '"') {
|
||||||
struct strbuf name = STRBUF_INIT;
|
struct strbuf name = STRBUF_INIT;
|
||||||
@ -1199,7 +1205,8 @@ static int find_header(char *line, unsigned long size, int *hdrsize, struct patc
|
|||||||
continue;
|
continue;
|
||||||
if (!patch->old_name && !patch->new_name) {
|
if (!patch->old_name && !patch->new_name) {
|
||||||
if (!patch->def_name)
|
if (!patch->def_name)
|
||||||
die("git diff header lacks filename information (line %d)", linenr);
|
die("git diff header lacks filename information when removing "
|
||||||
|
"%d leading pathname components (line %d)" , p_value, linenr);
|
||||||
patch->old_name = patch->new_name = patch->def_name;
|
patch->old_name = patch->new_name = patch->def_name;
|
||||||
}
|
}
|
||||||
patch->is_toplevel_relative = 1;
|
patch->is_toplevel_relative = 1;
|
||||||
|
@ -22,4 +22,9 @@ test_expect_success 'apply git diff with -p2' '
|
|||||||
git apply -p2 patch.file
|
git apply -p2 patch.file
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'apply with too large -p' '
|
||||||
|
test_must_fail git apply --stat -p3 patch.file 2>err &&
|
||||||
|
grep "removing 3 leading" err
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user