From c95c02486c4dd82f8910a8de1cb7c8f9db899995 Mon Sep 17 00:00:00 2001 From: Jean-Luc Herren Date: Wed, 26 Sep 2007 15:56:19 +0200 Subject: git-add--interactive: Allow Ctrl-D to exit Hitting Ctrl-D (EOF) is a common way to exit shell-like tools. When in a sub-menu it will still behave as if an empty line had been entered, carrying out the action on the selected items and returning to the previous menu. Signed-off-by: Jean-Luc Herren Signed-off-by: Junio C Hamano --- git-add--interactive.perl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'git-add--interactive.perl') diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 7921cde8cb..f9e9f02392 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -213,7 +213,11 @@ sub list_and_choose { print ">> "; } my $line = ; - last if (!$line); + if (!$line) { + print "\n"; + $opts->{ON_EOF}->() if $opts->{ON_EOF}; + last; + } chomp $line; my $donesomething = 0; for my $choice (split(/[\s,]+/, $line)) { @@ -791,6 +795,7 @@ sub main_loop { SINGLETON => 1, LIST_FLAT => 4, HEADER => '*** Commands ***', + ON_EOF => \&quit_cmd, IMMEDIATE => 1 }, @cmd); if ($it) { eval { -- cgit v1.2.3 From 6a6eb3d09fcbfae41978fb5223ae03e2d103968b Mon Sep 17 00:00:00 2001 From: Jean-Luc Herren Date: Wed, 26 Sep 2007 16:05:01 +0200 Subject: git-add--interactive: Improve behavior on bogus input 1) Previously, any menu would cause a perl error when entered '0', which is never a valid option. 2) Entering a bogus choice (like 998 or 4-2) surprisingly caused the same behavior as if the user had just hit 'enter', which means to carry out the selected action on the selected items. Entering such bogus input is now a no-op and the sub-menu doesn't exit. Signed-off-by: Jean-Luc Herren Signed-off-by: Junio C Hamano --- git-add--interactive.perl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'git-add--interactive.perl') diff --git a/git-add--interactive.perl b/git-add--interactive.perl index f9e9f02392..be6881496c 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -219,7 +219,7 @@ sub list_and_choose { last; } chomp $line; - my $donesomething = 0; + last if $line eq ''; for my $choice (split(/[\s,]+/, $line)) { my $choose = 1; my ($bottom, $top); @@ -251,12 +251,11 @@ sub list_and_choose { next TOPLOOP; } for ($i = $bottom-1; $i <= $top-1; $i++) { - next if (@stuff <= $i); + next if (@stuff <= $i || $i < 0); $chosen[$i] = $choose; - $donesomething++; } } - last if (!$donesomething || $opts->{IMMEDIATE}); + last if ($opts->{IMMEDIATE}); } for ($i = 0; $i < @stuff; $i++) { if ($chosen[$i]) { -- cgit v1.2.3 From 7288ed8ebdab54e5aa05400bd840e1348ffdc270 Mon Sep 17 00:00:00 2001 From: Jean-Luc Herren Date: Tue, 9 Oct 2007 21:29:26 +0200 Subject: git add -i: Fix parsing of abbreviated hunk headers The unified diff format allows one-line ranges to be abbreviated by omiting the size. The hunk header "@@ -10,1 +10,1 @@" can be expressed as "@@ -10 +10 @@", but this wasn't properly parsed in all cases. Such abbreviated hunk headers are generated when a one-line change (add, remove or modify) appears without context; for example because the file is a one-liner itself or because GIT_DIFF_OPTS was set to '-u0'. If the user then runs 'git add -i' and enters the 'patch' command for that file, perl complains about undefined variables. Signed-off-by: Jean-Luc Herren Signed-off-by: Lars Hjemli Signed-off-by: Shawn O. Pearce --- git-add--interactive.perl | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'git-add--interactive.perl') diff --git a/git-add--interactive.perl b/git-add--interactive.perl index be6881496c..15b3f5b36c 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -360,7 +360,9 @@ sub hunk_splittable { sub parse_hunk_header { my ($line) = @_; my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) = - $line =~ /^@@ -(\d+)(?:,(\d+)) \+(\d+)(?:,(\d+)) @@/; + $line =~ /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/; + $o_cnt = 1 unless defined $o_cnt; + $n_cnt = 1 unless defined $n_cnt; return ($o_ofs, $o_cnt, $n_ofs, $n_cnt); } @@ -705,9 +707,6 @@ sub patch_update_cmd { parse_hunk_header($text->[0]); if (!$_->{USE}) { - if (!defined $o_cnt) { $o_cnt = 1; } - if (!defined $n_cnt) { $n_cnt = 1; } - # We would have added ($n_cnt - $o_cnt) lines # to the postimage if we were to use this hunk, # but we didn't. So the line number that the next @@ -719,10 +718,10 @@ sub patch_update_cmd { if ($n_lofs) { $n_ofs += $n_lofs; $text->[0] = ("@@ -$o_ofs" . - ((defined $o_cnt) + (($o_cnt != 1) ? ",$o_cnt" : '') . " +$n_ofs" . - ((defined $n_cnt) + (($n_cnt != 1) ? ",$n_cnt" : '') . " @@\n"); } -- cgit v1.2.3 From 7b40a4552a0fbdc6ee9a22ce10408d79ca1599af Mon Sep 17 00:00:00 2001 From: Jean-Luc Herren Date: Tue, 9 Oct 2007 21:34:17 +0200 Subject: git add -i: Remove unused variables Signed-off-by: Jean-Luc Herren Signed-off-by: Lars Hjemli Signed-off-by: Shawn O. Pearce --- git-add--interactive.perl | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) (limited to 'git-add--interactive.perl') diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 15b3f5b36c..ac598f88e6 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -374,9 +374,8 @@ sub split_hunk { # it can be split, but we would need to take care of # overlaps later. - my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) = parse_hunk_header($text->[0]); + my ($o_ofs, undef, $n_ofs) = parse_hunk_header($text->[0]); my $hunk_start = 1; - my $next_hunk_start; OUTER: while (1) { @@ -443,8 +442,8 @@ sub split_hunk { for my $hunk (@split) { $o_ofs = $hunk->{OLD}; $n_ofs = $hunk->{NEW}; - $o_cnt = $hunk->{OCNT}; - $n_cnt = $hunk->{NCNT}; + my $o_cnt = $hunk->{OCNT}; + my $n_cnt = $hunk->{NCNT}; my $head = ("@@ -$o_ofs" . (($o_cnt != 1) ? ",$o_cnt" : '') . @@ -459,7 +458,7 @@ sub split_hunk { sub find_last_o_ctx { my ($it) = @_; my $text = $it->{TEXT}; - my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) = parse_hunk_header($text->[0]); + my ($o_ofs, $o_cnt) = parse_hunk_header($text->[0]); my $i = @{$text}; my $last_o_ctx = $o_ofs + $o_cnt; while (0 < --$i) { @@ -531,8 +530,7 @@ sub coalesce_overlapping_hunks { for (grep { $_->{USE} } @in) { my $text = $_->{TEXT}; - my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) = - parse_hunk_header($text->[0]); + my ($o_ofs) = parse_hunk_header($text->[0]); if (defined $last_o_ctx && $o_ofs <= $last_o_ctx) { merge_hunk($out[-1], $_); @@ -699,7 +697,7 @@ sub patch_update_cmd { @hunk = coalesce_overlapping_hunks(@hunk); - my ($o_lofs, $n_lofs) = (0, 0); + my $n_lofs = 0; my @result = (); for (@hunk) { my $text = $_->{TEXT}; @@ -806,8 +804,6 @@ sub main_loop { } } -my @z; - refresh(); status_cmd(); main_loop(); -- cgit v1.2.3