Merge branch 'jk/add-i-use-pathspecs'
"git add -p <pathspec>" unnecessarily expanded the pathspec to a list of individual files that matches the pathspec by running "git ls-files <pathspec>", before feeding it to "git diff-index" to see which paths have changes, because historically the pathspec language supported by "diff-index" was weaker. These days they are equivalent and there is no reason to internally expand it. This helps both performance and avoids command line argument limit on some platforms. * jk/add-i-use-pathspecs: add--interactive: do not expand pathspecs with ls-files
This commit is contained in:
commit
153e0d762c
@ -275,20 +275,11 @@ sub list_modified {
|
||||
my ($only) = @_;
|
||||
my (%data, @return);
|
||||
my ($add, $del, $adddel, $file);
|
||||
my @tracked = ();
|
||||
|
||||
if (@ARGV) {
|
||||
@tracked = map {
|
||||
chomp $_;
|
||||
unquote_path($_);
|
||||
} run_cmd_pipe(qw(git ls-files --), @ARGV);
|
||||
return if (!@tracked);
|
||||
}
|
||||
|
||||
my $reference = get_diff_reference($patch_mode_revision);
|
||||
for (run_cmd_pipe(qw(git diff-index --cached
|
||||
--numstat --summary), $reference,
|
||||
'--', @tracked)) {
|
||||
'--', @ARGV)) {
|
||||
if (($add, $del, $file) =
|
||||
/^([-\d]+) ([-\d]+) (.*)/) {
|
||||
my ($change, $bin);
|
||||
@ -313,7 +304,7 @@ sub list_modified {
|
||||
}
|
||||
}
|
||||
|
||||
for (run_cmd_pipe(qw(git diff-files --numstat --summary --raw --), @tracked)) {
|
||||
for (run_cmd_pipe(qw(git diff-files --numstat --summary --raw --), @ARGV)) {
|
||||
if (($add, $del, $file) =
|
||||
/^([-\d]+) ([-\d]+) (.*)/) {
|
||||
$file = unquote_path($file);
|
||||
|
@ -412,4 +412,47 @@ test_expect_success 'patch-mode via -i prompts for files' '
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'add -p handles globs' '
|
||||
git reset --hard &&
|
||||
|
||||
mkdir -p subdir &&
|
||||
echo base >one.c &&
|
||||
echo base >subdir/two.c &&
|
||||
git add "*.c" &&
|
||||
git commit -m base &&
|
||||
|
||||
echo change >one.c &&
|
||||
echo change >subdir/two.c &&
|
||||
git add -p "*.c" <<-\EOF &&
|
||||
y
|
||||
y
|
||||
EOF
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
one.c
|
||||
subdir/two.c
|
||||
EOF
|
||||
git diff --cached --name-only >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'add -p does not expand argument lists' '
|
||||
git reset --hard &&
|
||||
|
||||
echo content >not-changed &&
|
||||
git add not-changed &&
|
||||
git commit -m "add not-changed file" &&
|
||||
|
||||
echo change >file &&
|
||||
GIT_TRACE=$(pwd)/trace.out git add -p . <<-\EOF &&
|
||||
y
|
||||
EOF
|
||||
|
||||
# we know that "file" must be mentioned since we actually
|
||||
# update it, but we want to be sure that our "." pathspec
|
||||
# was not expanded into the argument list of any command.
|
||||
# So look only for "not-changed".
|
||||
! grep not-changed trace.out
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user