From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
sbeller@google.com, mehul.jain2029@gmail.com,
sandals@crustytoothpaste.net,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 3/4] apply: add --whole to apply git patch without prefix filtering
Date: Thu, 24 Mar 2016 18:56:18 +0700 [thread overview]
Message-ID: <1458820579-31621-4-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1458820579-31621-1-git-send-email-pclouds@gmail.com>
Back in edf2e37 (git-apply: work from subdirectory. - 2005-11-25),
git-apply is made to work from a subdir of a worktree. When applying a
git patch this way, only paths in the subdir are patched, the rest is
filtered out. To apply without filtering, the user has to move back to
toplevel. Add --whole to make it more convenient to do so without moving
cwd around.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
Documentation/git-apply.txt | 8 +++++++-
builtin/apply.c | 4 +++-
t/t4111-apply-subdir.sh | 32 ++++++++++++++++++++++++++++++++
3 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt
index 8ddb207..47cea57 100644
--- a/Documentation/git-apply.txt
+++ b/Documentation/git-apply.txt
@@ -13,7 +13,7 @@ SYNOPSIS
[--apply] [--no-add] [--build-fake-ancestor=<file>] [-R | --reverse]
[--allow-binary-replacement | --binary] [--reject] [-z]
[-p<n>] [-C<n>] [--inaccurate-eof] [--recount] [--cached]
- [--ignore-space-change | --ignore-whitespace]
+ [--ignore-space-change | --ignore-whitespace] [--whole]
[--whitespace=(nowarn|warn|fix|error|error-all)]
[--exclude=<path>] [--include=<path>] [--directory=<root>]
[--verbose] [--unsafe-paths] [<patch>...]
@@ -154,6 +154,12 @@ discouraged.
flag was the way to do so. Currently we always allow binary
patch application, so this is a no-op.
+--whole::
+ Normally when running inside a subdirectory of a working area,
+ patched files outside current directory is filtered out. This option
+ makes `git apply` to apply them all. All paths are still subject
+ to `--exclude` and `--include` fitlering if present.
+
--exclude=<path-pattern>::
Don't apply changes to files matching the given path pattern. This can
be useful when importing patchsets, where you want to exclude certain
diff --git a/builtin/apply.c b/builtin/apply.c
index 42c610e..01e1d5e 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -80,6 +80,7 @@ static const char *patch_input_file;
static struct strbuf root = STRBUF_INIT;
static int read_stdin = 1;
static int options;
+static int apply_whole;
static void parse_whitespace_option(const char *option)
{
@@ -1956,7 +1957,7 @@ static int use_patch(struct patch *p)
int i;
/* Paths outside are not touched regardless of "--include" */
- if (0 < prefix_length) {
+ if (!apply_whole && 0 < prefix_length) {
int pathlen = strlen(pathname);
if (pathlen <= prefix_length ||
memcmp(prefix, pathname, prefix_length))
@@ -4565,6 +4566,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix_)
OPT_BIT(0, "recount", &options,
N_("do not trust the line counts in the hunk headers"),
RECOUNT),
+ OPT_BOOL(0, "whole", &apply_whole, N_("apply whole patch")),
{ OPTION_CALLBACK, 0, "directory", NULL, N_("root"),
N_("prepend <root> to all filenames"),
0, option_parse_directory },
diff --git a/t/t4111-apply-subdir.sh b/t/t4111-apply-subdir.sh
index 1618a6d..e5cd019 100755
--- a/t/t4111-apply-subdir.sh
+++ b/t/t4111-apply-subdir.sh
@@ -153,4 +153,36 @@ test_expect_success 'apply --cached from subdir of .git dir' '
test_cmp expected.subdir actual.subdir
'
+test_expect_success 'setup a git patch' '
+ cat >gitpatch <<-\EOF &&
+ diff --git a/file b/file
+ --- a/file
+ +++ b/file
+ @@ -1 +1,2 @@
+ 1
+ +2
+ EOF
+ gitpatch="$(pwd)/gitpatch"
+'
+
+test_expect_success 'apply a git patch from subdir of toplevel' '
+ reset_subdir other preimage &&
+ (
+ cd sub/dir &&
+ git apply "$gitpatch"
+ ) &&
+ test_cmp preimage sub/dir/file &&
+ test_cmp preimage file
+'
+
+test_expect_success 'apply the whole git patch from subdir of toplevel' '
+ reset_subdir other preimage &&
+ (
+ cd sub/dir &&
+ git apply --whole "$gitpatch"
+ ) &&
+ test_cmp preimage sub/dir/file &&
+ test_cmp postimage file
+'
+
test_done
--
2.8.0.rc0.210.gd302cd2
next prev parent reply other threads:[~2016-03-24 11:57 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-22 12:10 git-apply does not work in a sub-directory of a Git repository Mehul Jain
2016-03-22 22:14 ` Stefan Beller
2016-03-23 10:15 ` Duy Nguyen
2016-03-23 15:21 ` Junio C Hamano
2016-03-23 16:55 ` Junio C Hamano
2016-03-24 10:49 ` Duy Nguyen
2016-03-24 11:56 ` Nguyễn Thái Ngọc Duy
2016-03-24 11:56 ` [PATCH 1/4] git-apply.txt: remove a space Nguyễn Thái Ngọc Duy
2016-03-24 11:56 ` [PATCH 2/4] git-apply.txt: mention the behavior inside a subdir Nguyễn Thái Ngọc Duy
2016-03-24 11:56 ` Nguyễn Thái Ngọc Duy [this message]
2016-03-24 11:56 ` [PATCH 4/4] apply: report patch skipping in verbose mode Nguyễn Thái Ngọc Duy
2016-03-24 16:50 ` git-apply does not work in a sub-directory of a Git repository Junio C Hamano
2016-03-24 17:32 ` Junio C Hamano
2016-03-30 1:05 ` Duy Nguyen
2016-03-30 17:13 ` Junio C Hamano
2016-03-30 9:33 ` Duy Nguyen
2016-03-24 16:29 ` Junio C Hamano
2016-03-23 17:24 ` Mehul Jain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1458820579-31621-4-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mehul.jain2029@gmail.com \
--cc=sandals@crustytoothpaste.net \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.