mirror of
https://github.com/git/git
synced 2024-10-30 14:03:28 +00:00
Merge branch 'js/apply-root'
* js/apply-root: git-apply --directory: make --root more similar to GNU diff apply --root: thinkofix. Teach "git apply" to prepend a prefix with "--root=<root>"
This commit is contained in:
commit
e9a9d6edee
3 changed files with 76 additions and 1 deletions
|
@ -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] [--directory=<root>] [--verbose] [<patch>...]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -182,6 +182,14 @@ behavior:
|
|||
by inspecting the patch (e.g. after editing the patch without
|
||||
adjusting the hunk headers appropriately).
|
||||
|
||||
--directory=<root>::
|
||||
Prepend <root> to all filenames. If a "-p" argument was passed, too,
|
||||
it is applied before prepending the new root.
|
||||
+
|
||||
For example, a patch that talks about updating `a/git-gui.sh` to `b/git-gui.sh`
|
||||
can be applied to the file in the working tree `modules/git-gui/git-gui.sh` by
|
||||
running `git apply --directory=modules/git-gui`.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
|
|
|
@ -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 (!prefixcmp(arg, "--directory=")) {
|
||||
arg += strlen("--directory=");
|
||||
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);
|
||||
|
||||
|
|
43
t/t4128-apply-root.sh
Executable file
43
t/t4128-apply-root.sh
Executable file
|
@ -0,0 +1,43 @@
|
|||
#!/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 &&
|
||||
git commit -m initial &&
|
||||
git tag initial
|
||||
|
||||
'
|
||||
|
||||
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 --directory -p (1)' '
|
||||
|
||||
git apply --directory=some/sub -p3 --index patch &&
|
||||
test Bello = $(git show :some/sub/dir/file) &&
|
||||
test Bello = $(cat some/sub/dir/file)
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'apply --directory -p (2) ' '
|
||||
|
||||
git reset --hard initial &&
|
||||
git apply --directory=some/sub/ -p3 --index patch &&
|
||||
test Bello = $(git show :some/sub/dir/file) &&
|
||||
test Bello = $(cat some/sub/dir/file)
|
||||
|
||||
'
|
||||
|
||||
test_done
|
Loading…
Reference in a new issue