Hello!

This patch makes it possible to select or unselect files in `git add -i`
by regular expression instead of unique prefix only.

The command syntax is `/foo` for selection and `-/foo` for unselection.
I don't think the syntax will conflict with any existing use cases, but feel
free to prove me wrong.

I'm not a Perl programmer, but I've tried to follow the style of the
existing code as much as possible. :)

Note I'm currently not on the mailing list, so please cc.

Best regards,

Aarni Koskela

>From 53c12d9c9928dc93a57595e92d785ecc0b245390 Mon Sep 17 00:00:00 2001
From: Aarni Koskela <a...@iki.fi>
Date: Mon, 1 Dec 2014 11:06:10 +0200
Subject: [PATCH] git-add--interactive: allow list (un)selection by regular
 expression

Teach `list_and_choose` to allow `/regexp` and `-/regexp` syntax to
select items based on regular expression match.

For instance, `/jpg$` will select all options whose display name ends with
`jpg`.

Signed-off-by: Aarni Koskela <a...@iki.fi>
---
 git-add--interactive.perl | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 1fadd69..34cc603 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -483,6 +483,8 @@ sub is_valid_prefix {
            !($prefix =~ /[\s,]/) && # separators
            !($prefix =~ /^-/) &&    # deselection
            !($prefix =~ /^\d+/) &&  # selection
+           !($prefix =~ /^\//) &&   # regexp selection
+           !($prefix =~ /^-\//) &&  # regexp unselection
            ($prefix ne '*') &&      # "all" wildcard
            ($prefix ne '?');        # prompt help
 }
@@ -585,6 +587,28 @@ sub list_and_choose {
                            prompt_help_cmd();
                        next TOPLOOP;
                }
+               if ($line =~ /^(-)*\/(.+)$/) {
+                       my $choose = !($1 && $1 eq '-');
+                       my $re = $2;
+                       my $found = 0;
+                       for ($i = 0; $i < @stuff; $i++) {
+                               my $val = $stuff[$i];
+                               my $ref = ref $val;
+                               if ($ref eq 'ARRAY') {
+                                       $val = $val->[0];
+                               }
+                               elsif ($ref eq 'HASH') {
+                                       $val = $val->{VALUE};
+                               }
+                               if ($val =~ /$re/) {
+                                       $chosen[$i] = $choose;
+                                       $found = 1;
+                                       last if $opts->{SINGLETON};
+                               }
+                       }
+                       last if $found && ($opts->{IMMEDIATE});
+                       next TOPLOOP;
+               }
                for my $choice (split(/[\s,]+/, $line)) {
                        my $choose = 1;
                        my ($bottom, $top);
@@ -635,6 +659,7 @@ sub singleton_prompt_help_cmd {
 Prompt help:
 1          - select a numbered item
 foo        - select item based on unique prefix
+/regexp    - select item based on regular expression
            - (empty) select nothing
 EOF
 }
@@ -648,6 +673,8 @@ Prompt help:
 foo        - select item based on unique prefix
 -...       - unselect specified items
 *          - choose all items
+/regexp    - select items based on regular expression
+-/regexp   - unselect items based on regular expression
            - (empty) finish selecting
 EOF
 }
-- 
1.9.2.msysgit.0

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to