Re: [PATCH] Add path-limiting to git-add--interactive
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:53
Junio C Hamano [off-list ref] writes:
Wincent Colaiuta [off-list ref] writes:quoted
@@ -56,9 +56,14 @@ sub list_modified { my ($only) = @_; my (%data, @return); my ($add, $del, $adddel, $file); + my @tracked = grep { + defined run_cmd_pipe(qw(git ls-files + --exclude-standard --), $_) + } @ARGV; + return if $#tracked == -1 && $#ARGV != -1;Eek. why? Did you mean to say: my @tracked = run_cmd_pipe(gw(git ls-files --exclude-standard --) @ARGV); It would also make sense to use --error-unmatch and perhaps --with-tree=HEAD like git-commit.sh does.
Actually, the ls-files need to be chomped, but I'd prefer to
run -z form of the command and split with NUL. Does run_cmd_pipe()
crap^Wstuff support that?
On top of:
* refactor patch_update_cmd,
* teach builtin-add to pass multiple paths,
* add path-limiting to git-add--interacgtive (with an obvious
suggested above),
the attached patch teaches [p]atch subcommand to take multiple
selections. With these, you can do:
$ git add -i 'u*.h'
What now> p
staged unstaged path
1: unchanged +1/-0 unpack-trees.h
2: unchanged +1/-0 utf8.h
Patch update>> *
diff --git a/unpack-trees.h b/unpack-trees.h
...
Stage this hunk [y/n/a/d/?]? y
...
diff --git a/utf8.h b/utf8.h
...
-- >8 --
git-add -i: allow multiple selection in [p]atch subcommand
This allows more than one files from the list to be chosen from
the patch subcommand instead of going through the file one by
one.
This also updates the "list-and-choose" UI for usability. When
the prompt ends with ">>", if you type '*' to choose all
choices, the prompt immediately returns the choice without
requiring an extra empty line to confirm the selection.
---diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 9236ffc..372dc2c 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl@@ -256,7 +256,7 @@ sub list_and_choose { $chosen[$i] = $choose; } } - last if ($opts->{IMMEDIATE}); + last if ($opts->{IMMEDIATE} || $line eq '*'); } for ($i = 0; $i < @stuff; $i++) { if ($chosen[$i]) {
@@ -563,12 +563,12 @@ sub patch_update_cmd { @mods = grep { !($_->{BINARY}) } @mods; return if (!@mods); - my ($it) = list_and_choose({ PROMPT => 'Patch update', - SINGLETON => 1, - IMMEDIATE => 1, - HEADER => $status_head, }, - @mods); - patch_update_file($it->{VALUE}) if ($it); + my (@them) = list_and_choose({ PROMPT => 'Patch update', + HEADER => $status_head, }, + @mods); + for (@them) { + patch_update_file($_->{VALUE}); + } } sub patch_update_file {