From: unixway.drive@gmail.com
To: git@vger.kernel.org
Subject: [BUG] regarding `git add -p` and files containing wildcard characters
Date: Fri, 9 Dec 2016 04:46:49 +0300 [thread overview]
Message-ID: <c9876671-6252-5dfa-18df-a6719dc6834c@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 2937 bytes --]
`git add -p` behaves incorrectly if modified file contains any wildcard
character. Consider 'random.diff' (attached). For this, interactive
'add' would first ask to add hunk with two diff headers (or with some
"random" header at the end):
$ git add -p
diff --git a/Random * b/Random *
index 01e79c3..01f03ff 100644
--- a/Random *
+++ b/Random *
@@ -1,3 +1,5 @@
1
+ a
2
+ b
3
diff --git a/Random Crap b/Random Crap
index 01e79c3..b4373d5 100644
--- a/Random Crap
+++ b/Random Crap
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]? y
Then it will ask for some irrelevant hunk:
@@ -1,3 +1,5 @@
1
+ whoa
2
+ dude
3
Stage this hunk [y,n,q,a,d,/,K,g,s,e,?]? y
…and, if confirmed, apply it to the wildcard-named file instead of what
was confirmed for staging before:
$ git diff --cached
diff --git a/Random * b/Random *
index 01e79c3..283ac91 100644
--- a/Random *
+++ b/Random *
@@ -1,3 +1,5 @@
1
+ whoa
2
+ dude
3
Then one can just repeat this over and over again (unless safely named
files are resolved first):
$ git add -p
diff --git a/Random * b/Random *
index 283ac91..04c92f1 100644
--- a/Random *
+++ b/Random *
@@ -1,5 +1,5 @@
1
- whoa
+ a
2
- dude
+ b
3
diff --git a/Random Crap b/Random Crap
index 01e79c3..283ac91 100644
--- a/Random Crap
+++ b/Random Crap
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
The problem is that `git-diff-files` does some globbing on the 'path'
arguments on its own and has no option to disable that (and
`git-add--interactive`'s `run_cmd_pipe` already handles all other sorts
of unsafe characters like spaces and backticks well).
$ strace -f -e trace=execve git add -p
…
[pid 1713] execve("/usr/lib/git-core/git",
["git", "diff-files", "-p", "--", "Random *"],
[/* 36 vars */]) = 0
…
$ git diff-files -- 'Random *'
:100644 100644 … … M Random *
:100644 100644 … … M Random Crap
For all the eager people (although I doubt if anybody else is lazy
enough to not bother with file names like these), this could be easily
worked around like this:
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index ee3d812..358d877 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -2,3 +2,3 @@
-use 5.008;
+use 5.014;
use strict;
@@ -761,3 +761,5 @@ sub parse_diff {
}
- my @diff = run_cmd_pipe("git", @diff_cmd, "--", $path);
+ my @diff = run_cmd_pipe("git", @diff_cmd, "--", (
+ $path =~ s#[\[*?]#\\$&#gr
+ ));
my @colored = ();
(Although a `git-diff-files` option is clearly a better solution that
would cover tools other than `git-add--interactive` as well.)
[-- Attachment #2: random.diff --]
[-- Type: text/x-patch, Size: 278 bytes --]
diff --git a/Random * b/Random *
index 01e79c3..04c92f1 100644
--- a/Random *
+++ b/Random *
@@ -1,3 +1,5 @@
1
+ a
2
+ b
3
diff --git a/Random Crap b/Random Crap
index 01e79c3..283ac91 100644
--- a/Random Crap
+++ b/Random Crap
@@ -1,3 +1,5 @@
1
+ whoa
2
+ dude
3
next reply other threads:[~2016-12-09 1:47 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-09 1:46 unixway.drive [this message]
2016-12-09 5:37 ` [BUG] regarding `git add -p` and files containing wildcard characters Jeff King
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c9876671-6252-5dfa-18df-a6719dc6834c@gmail.com \
--to=unixway.drive@gmail.com \
--cc=git@vger.kernel.org \
/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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).