зеркало из https://github.com/microsoft/git.git
Teach "git apply" to prepend a prefix with "--root=<root>"
With "git apply --root=<root>", all file names in the patch are prepended with <root>. If a "-p" value was given, the paths are stripped _before_ prepending <root>. Wished for by HPA. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
66037991d3
Коммит
c4730f35cc
|
@ -14,7 +14,7 @@ SYNOPSIS
|
||||||
[--allow-binary-replacement | --binary] [--reject] [-z]
|
[--allow-binary-replacement | --binary] [--reject] [-z]
|
||||||
[-pNUM] [-CNUM] [--inaccurate-eof] [--cached]
|
[-pNUM] [-CNUM] [--inaccurate-eof] [--cached]
|
||||||
[--whitespace=<nowarn|warn|fix|error|error-all>]
|
[--whitespace=<nowarn|warn|fix|error|error-all>]
|
||||||
[--exclude=PATH] [--verbose] [<patch>...]
|
[--exclude=PATH] [--root=<root>] [--verbose] [<patch>...]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
@ -177,6 +177,10 @@ behavior:
|
||||||
current patch being applied will be printed. This option will cause
|
current patch being applied will be printed. This option will cause
|
||||||
additional information to be reported.
|
additional information to be reported.
|
||||||
|
|
||||||
|
--root=<root>::
|
||||||
|
Prepend <root> to all filenames. If a "-p" argument was passed, too,
|
||||||
|
it is applied before prepending the new root.
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,8 @@ static int whitespace_error;
|
||||||
static int squelch_whitespace_errors = 5;
|
static int squelch_whitespace_errors = 5;
|
||||||
static int applied_after_fixing_ws;
|
static int applied_after_fixing_ws;
|
||||||
static const char *patch_input_file;
|
static const char *patch_input_file;
|
||||||
|
static const char *root;
|
||||||
|
static int root_len;
|
||||||
|
|
||||||
static void parse_whitespace_option(const char *option)
|
static void parse_whitespace_option(const char *option)
|
||||||
{
|
{
|
||||||
|
@ -331,6 +333,8 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
|
||||||
*/
|
*/
|
||||||
strbuf_remove(&name, 0, cp - name.buf);
|
strbuf_remove(&name, 0, cp - name.buf);
|
||||||
free(def);
|
free(def);
|
||||||
|
if (root)
|
||||||
|
strbuf_insert(&name, 0, root, root_len);
|
||||||
return strbuf_detach(&name, NULL);
|
return strbuf_detach(&name, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,6 +373,14 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
|
||||||
free(def);
|
free(def);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (root) {
|
||||||
|
char *ret = xmalloc(root_len + len + 1);
|
||||||
|
strcpy(ret, root);
|
||||||
|
memcpy(ret + root_len, start, len);
|
||||||
|
ret[root_len + len] = '\0';
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return xmemdupz(start, len);
|
return xmemdupz(start, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3118,6 +3130,18 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix)
|
||||||
inaccurate_eof = 1;
|
inaccurate_eof = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strncmp(arg, "--root=", strlen("--root="))) {
|
||||||
|
arg += strlen("--root=");
|
||||||
|
root_len = strlen(arg);
|
||||||
|
if (root_len && arg[root_len + 1] != '/') {
|
||||||
|
char *new_root;
|
||||||
|
root = new_root = xmalloc(root_len + 2);
|
||||||
|
strcpy(new_root, arg);
|
||||||
|
strcpy(new_root + root_len++, "/");
|
||||||
|
} else
|
||||||
|
root = arg;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (0 < prefix_length)
|
if (0 < prefix_length)
|
||||||
arg = prefix_filename(prefix, prefix_length, arg);
|
arg = prefix_filename(prefix, prefix_length, arg);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='apply same filename'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_expect_success 'setup' '
|
||||||
|
|
||||||
|
mkdir -p some/sub/dir &&
|
||||||
|
echo Hello > some/sub/dir/file &&
|
||||||
|
git add some/sub/dir/file
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
cat > patch << EOF
|
||||||
|
diff a/bla/blub/dir/file b/bla/blub/dir/file
|
||||||
|
--- a/bla/blub/dir/file
|
||||||
|
+++ b/bla/blub/dir/file
|
||||||
|
@@ -1,1 +1,1 @@
|
||||||
|
-Hello
|
||||||
|
+Bello
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'apply --root -p --index' '
|
||||||
|
|
||||||
|
git apply --root=some/sub -p3 --index patch &&
|
||||||
|
test Bello = $(git show :some/sub/dir/file) &&
|
||||||
|
test Bello = $(cat some/sub/dir/file)
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
Загрузка…
Ссылка в новой задаче