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:
Johannes Schindelin 2008-07-01 00:44:47 +01:00 коммит произвёл Junio C Hamano
Родитель 66037991d3
Коммит c4730f35cc
3 изменённых файлов: 61 добавлений и 1 удалений

Просмотреть файл

@ -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);

32
t/t4128-apply-root.sh Executable file
Просмотреть файл

@ -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