git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] git-add--interactive: Preserve diff heading when splitting hunks

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
May 11, 2014, 16:09 UTC
Message-ID
<1399824596-4670-1-git-send-email-avarab@gmail.com>

Change the display of hunks in hunk splitting mode to preserve the diff heading, which hasn't been done ever since the hunk splitting was initially added in v1.4.4.2-270-g835b2ae.

Splitting the first hunk of this patch will now result in:
    Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]? s
    Split into 2 hunks.
    @@ -792,7 +792,7 @@ sub hunk_splittable {
    [...]
Instead of:
    Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]? s
    Split into 2 hunks.
    @@ -792,7 +792,7 @@
    [...]

This makes it easier to use the tool when you're splitting some giant hunk and can't remember in which function you are anymore.

The diff is somewhat larger than I initially expected because in order to display the headings in the same color scheme as the output from git-diff(1) itself I had to split up the code that would previously color diff output that previously consisted entirely of the fraginfo, but now consists of the fraginfo and the diff heading (the latter of which isn't colored).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 git-add--interactive.perl | 40 ++++++++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 16 deletions(-)
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 1fadd69..ed1e564 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -792,11 +792,11 @@ sub hunk_splittable {
 
 sub parse_hunk_header {
 	my ($line) = @_;
-	my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) =
-	    $line =~ /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/;
+	my ($o_ofs, $o_cnt, $n_ofs, $n_cnt, $heading) =
+	    $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);
+	return ($o_ofs, $o_cnt, $n_ofs, $n_cnt, $heading);
 }
 
 sub split_hunk {
@@ -808,8 +808,7 @@ sub split_hunk {
 	# If there are context lines in the middle of a hunk,
 	# it can be split, but we would need to take care of
 	# overlaps later.
-
-	my ($o_ofs, undef, $n_ofs) = parse_hunk_header($text->[0]);
+	my ($o_ofs, undef, $n_ofs, undef, $heading) = parse_hunk_header($text->[0]);
 	my $hunk_start = 1;
 
       OUTER:
@@ -886,17 +885,26 @@ sub split_hunk {
 		my $o_cnt = $hunk->{OCNT};
 		my $n_cnt = $hunk->{NCNT};
 
-		my $head = ("@@ -$o_ofs" .
-			    (($o_cnt != 1) ? ",$o_cnt" : '') .
-			    " +$n_ofs" .
-			    (($n_cnt != 1) ? ",$n_cnt" : '') .
-			    " @@\n");
-		my $display_head = $head;
-		unshift @{$hunk->{TEXT}}, $head;
-		if ($diff_use_color) {
-			$display_head = colored($fraginfo_color, $head);
-		}
-		unshift @{$hunk->{DISPLAY}}, $display_head;
+		my $fraginfo = join(
+			"",
+			"@@ -$o_ofs",
+			(($o_cnt != 1) ? ",$o_cnt" : ''),
+			" +$n_ofs",
+			(($n_cnt != 1) ? ",$n_cnt" : ''),
+			" @@"
+		);
+		unshift @{$hunk->{TEXT}}, join(
+			"",
+			$fraginfo,
+			$heading,
+			"\n"
+		);
+		unshift @{$hunk->{DISPLAY}}, join(
+			"",
+			$diff_use_color ? colored($fraginfo_color, $fraginfo) : $fraginfo,
+			$heading,
+			"\n"
+		);
 	}
 	return @split;
 }
-- 
2.0.0.rc0
Next: Junio C Hamano
Message 1 of 7 in “git-add--interactive: Preserve diff heading when splitting hunks”
  1. git-add--interactive: Preserve diff heading when splitting hunksÆvar Arnfjörð Bjarmason, May 11, 2014
  2. Junio C HamanoMay 11, 2014
  3. Jeff KingMay 12, 2014
  4. Ævar Arnfjörð BjarmasonMay 12, 2014
  5. Jeff KingMay 12, 2014
  6. Junio C HamanoMay 12, 2014
  7. Jeff KingMay 12, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.