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

gitweb: buggy 'commitdiff_plain' output

From
Linus Torvalds <torvalds@linux-foundation.org>
Date
Jul 10, 2009, 17:04 UTC
Message-ID
<alpine.LFD.2.01.0907100941060.3352@localhost.localdomain>

I complained to the CIFS people about their crazy duplicated commit message headers: see for example

    [torvalds@nehalem linux]$ git show --stat aeaaf253c4dee7ff9af2f3f0595f3bb66964e944
    commit aeaaf253c4dee7ff9af2f3f0595f3bb66964e944
    Author: Jeff Layton <jlayton@redhat.com>
    Date:   Thu Jul 9 01:46:39 2009 -0400
    
        cifs: remove cifsInodeInfo->inUse counter
        
        cifs: remove cifsInodeInfo->inUse counter
        
        It was purported to be a refcounter of some sort, but was never
        used that way. It never served any purpose that wasn't served equally well
        by the I_NEW flag.
        
        Signed-off-by: Jeff Layton <jlayton@redhat.com>
        Reviewed-by: Christoph Hellwig <hch@lst.de>
        Signed-off-by: Steve French <sfrench@us.ibm.com>
    
     fs/cifs/cifsfs.c   |    1 -
     fs/cifs/cifsglob.h |    1 -
     2 files changed, 0 insertions(+), 2 deletions(-)
and note the duplicated "cifs: remove cifsInodeInfo->inUse counter" line.

It turns out that that duplication is because they use gitweb as a strange patch distribution system (rather than emailing each other patches), and download the 'commitdiff_plain' version of the diff and then apply it with 'git am -s'.

Ok, so it's a really odd way of doing things, but hey, that gitweb feature clearly does try to support that exact workflow, or why would that commitdiff_plain output try to look like an email?

But gitweb is a totally buggy piece of trash when it comes to exporting commits that way.

Why? Because it first has a 'Subject:' line, and then the "body" of the email repeats the raw commit message output. So _of_course_ you get the header duplicated.

Now, I asked Steve to not use gitweb (or edit the result some way), but this really is a gitweb bug. And since I don't do perl, I can't fix it, even though I can pinpoint exactly where the bug is (lines 5732 - 5752 in gitweb/gitweb.perl).

I totally untested patch written by a monkey who doesn't actually do perl is appended as a purely theoretical pointer in the right direction. But I really have no clue about perl, so what the heck do I know? This is like my tcl programming - pattern matching rather than any real understanding.

I'm sure there are smarter ways to do this with some simple mapping function or whatever.

		Linus
---
 gitweb/gitweb.perl |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 6a1b5b5..a809768 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -5729,6 +5729,7 @@ sub git_commitdiff {
 		}
 
 	} elsif ($format eq 'plain') {
+		my $show = false;
 		my $refs = git_get_references("tags");
 		my $tagname = git_get_rev_name_tags($hash);
 		my $filename = basename($project) . "-$hash.patch";
@@ -5747,7 +5748,11 @@ sub git_commitdiff {
 		print "X-Git-Url: " . $cgi->self_url() . "\n\n";
 
 		foreach my $line (@{$co{'comment'}}) {
-			print to_utf8($line) . "\n";
+			if ($show) {
+				print to_utf8($line) . "\n";
+			} else if ($line ne "") {
+				$show = true;
+			}
 		}
 		print "---\n\n";
 	} elsif ($format eq 'patch') {
Next: Jakub Narebski
Message 1 of 6 in “gitweb: buggy 'commitdiff_plain' output”
  1. Linus TorvaldsJul 10, 2009
  2. Jakub NarebskiJul 10, 2009
  3. Giuseppe BilottaJul 10, 2009
  4. Linus TorvaldsJul 10, 2009
  5. Jakub NarebskiJul 10, 2009
  6. Giuseppe BilottaJul 10, 2009

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.