Skip to content

Commit

Permalink
add -i: allow prefix highlighting for "Add untracked" as well.
Browse files Browse the repository at this point in the history
These changes make the automatic prefix highlighting work with the "Add
untracked" subcommand in git-add--interactive by explicitly handling
arrays, hashes and strings internally (previously only arrays and hashes
were handled).

In addition, prefixes which have special meaning for list_and_choose
(things like "*" for "all" and "-" for "deselect) are explicitly
excluded (highlighting these prefixes would be misleading).

Signed-off-by: Wincent Colaiuta <win@wincent.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Wincent Colaiuta authored and Junio C Hamano committed Dec 2, 2007
1 parent 14cb503 commit 6332098
Showing 1 changed file with 30 additions and 17 deletions.
47 changes: 30 additions & 17 deletions git-add--interactive.perl
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ sub find_unique_prefixes {
if ((ref $print) eq 'ARRAY') {
$print = $print->[0];
}
else {
elsif ((ref $print) eq 'HASH') {
$print = $print->{VALUE};
}
update_trie(\%trie, $print);
Expand Down Expand Up @@ -230,12 +230,25 @@ sub find_unique_prefixes {
return @return;
}

# filters out prefixes which have special meaning to list_and_choose()
sub is_valid_prefix {
my $prefix = shift;
return (defined $prefix) &&
!($prefix =~ /[\s,]/) && # separators
!($prefix =~ /^-/) && # deselection
!($prefix =~ /^\d+/) && # selection
($prefix ne '*'); # "all" wildcard
}

# given a prefix/remainder tuple return a string with the prefix highlighted
# for now use square brackets; later might use ANSI colors (underline, bold)
sub highlight_prefix {
my $prefix = shift;
my $remainder = shift;
return (defined $prefix) ? "[$prefix]$remainder" : $remainder;
return $remainder unless defined $prefix;
return is_valid_prefix($prefix) ?
"[$prefix]$remainder" :
"$prefix$remainder";
}

sub list_and_choose {
Expand All @@ -257,21 +270,21 @@ sub list_and_choose {
for ($i = 0; $i < @stuff; $i++) {
my $chosen = $chosen[$i] ? '*' : ' ';
my $print = $stuff[$i];
if (ref $print) {
if ((ref $print) eq 'ARRAY') {
$print = @prefixes ?
highlight_prefix(@{$prefixes[$i]}) :
$print->[0];
}
else {
my $value = @prefixes ?
highlight_prefix(@{$prefixes[$i]}) :
$print->{VALUE};
$print = sprintf($status_fmt,
$print->{INDEX},
$print->{FILE},
$value);
}
my $ref = ref $print;
my $highlighted = highlight_prefix(@{$prefixes[$i]})
if @prefixes;
if ($ref eq 'ARRAY') {
$print = $highlighted || $print->[0];
}
elsif ($ref eq 'HASH') {
my $value = $highlighted || $print->{VALUE};
$print = sprintf($status_fmt,
$print->{INDEX},
$print->{FILE},
$value);
}
else {
$print = $highlighted || $print;
}
printf("%s%2d: %s", $chosen, $i+1, $print);
if (($opts->{LIST_FLAT}) &&
Expand Down

0 comments on commit 6332098

Please sign in to comment.