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@xxxxxx> --- Only lightly tested. Documentation/git-apply.txt | 6 +++++- builtin-apply.c | 24 ++++++++++++++++++++++++ t/t4128-apply-root.sh | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletions(-) create mode 100755 t/t4128-apply-root.sh diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt index c5ee636..7c51830 100644 --- a/Documentation/git-apply.txt +++ b/Documentation/git-apply.txt @@ -14,7 +14,7 @@ SYNOPSIS [--allow-binary-replacement | --binary] [--reject] [-z] [-pNUM] [-CNUM] [--inaccurate-eof] [--recount] [--cached] [--whitespace=<nowarn|warn|fix|error|error-all>] - [--exclude=PATH] [--verbose] [<patch>...] + [--exclude=PATH] [--root=<root>] [--verbose] [<patch>...] DESCRIPTION ----------- @@ -182,6 +182,10 @@ behavior: by inspecting the patch (e.g. after editing the patch without adjusting the hunk headers appropriately). +--root=<root>:: + Prepend <root> to all filenames. If a "-p" argument was passed, too, + it is applied before prepending the new root. + Configuration ------------- diff --git a/builtin-apply.c b/builtin-apply.c index 9fcfe39..d56d913 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -58,6 +58,8 @@ static int whitespace_error; static int squelch_whitespace_errors = 5; static int applied_after_fixing_ws; static const char *patch_input_file; +static const char *root; +static int root_len; static void parse_whitespace_option(const char *option) { @@ -340,6 +342,8 @@ static char *find_name(const char *line, char *def, int p_value, int terminate) */ strbuf_remove(&name, 0, cp - name.buf); free(def); + if (root) + strbuf_insert(&name, 0, root, root_len); return strbuf_detach(&name, NULL); } } @@ -378,6 +382,14 @@ static char *find_name(const char *line, char *def, int p_value, int terminate) 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); } @@ -3240,6 +3252,18 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix) options |= RECOUNT; 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) arg = prefix_filename(prefix, prefix_length, arg); diff --git a/t/t4128-apply-root.sh b/t/t4128-apply-root.sh new file mode 100755 index 0000000..80b5af2 --- /dev/null +++ b/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 -- 1.5.6.1.297.g148d9 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html