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 ($only) = @_;
|
||||||
my (%data, @return);
|
my (%data, @return);
|
||||||
my ($add, $del, $adddel, $file);
|
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);
|
my $reference = get_diff_reference($patch_mode_revision);
|
||||||
for (run_cmd_pipe(qw(git diff-index --cached
|
for (run_cmd_pipe(qw(git diff-index --cached
|
||||||
--numstat --summary), $reference,
|
--numstat --summary), $reference,
|
||||||
'--', @tracked)) {
|
'--', @ARGV)) {
|
||||||
if (($add, $del, $file) =
|
if (($add, $del, $file) =
|
||||||
/^([-\d]+) ([-\d]+) (.*)/) {
|
/^([-\d]+) ([-\d]+) (.*)/) {
|
||||||
my ($change, $bin);
|
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) =
|
if (($add, $del, $file) =
|
||||||
/^([-\d]+) ([-\d]+) (.*)/) {
|
/^([-\d]+) ([-\d]+) (.*)/) {
|
||||||
$file = unquote_path($file);
|
$file = unquote_path($file);
|
||||||
|
@ -412,4 +412,47 @@ test_expect_success 'patch-mode via -i prompts for files' '
|
|||||||
test_cmp expect actual
|
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
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user