Browse Source

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>
maint
Johannes Schindelin 17 years ago committed by Junio C Hamano
parent
commit
c4730f35cc
  1. 6
      Documentation/git-apply.txt
  2. 24
      builtin-apply.c
  3. 32
      t/t4128-apply-root.sh

6
Documentation/git-apply.txt

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



24
builtin-apply.c

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

@ -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
Loading…
Cancel
Save