{"thread":{"id":"3445","subject":"[PATCH] Port git-annotate to qx{} syntax, and make default output more like CVS","startedAt":"2006-02-23T13:53:26Z","lastAt":"2006-02-23T15:08:16Z","messageCount":2,"participants":["Johannes Schindelin","Alex Riesen"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"16616","messageId":"Pine.LNX.4.63.0602231442390.24946@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"3445","inReplyTo":null,"subject":"[PATCH] Port git-annotate to qx{} syntax, and make default output more like CVS","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2006-02-23T13:53:26Z","receivedAt":"2006-02-23T13:53:26Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nThis uses the qx{} syntax Alex digged up, and it makes output without \"-l\"\nquite similar to CVS's annotate output.\n\nOh, and it ignores a dirty work file. In fact, it even ignores a clean \nwork file, but fetches a clean version from the repository.\n\nSigned-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>\n\n---\n\n git-annotate.perl |   82 +++++++++++++++++++++++++----------------------------\n 1 files changed, 38 insertions(+), 44 deletions(-)\n\ndiff --git a/git-annotate.perl b/git-annotate.perl\nindex 3800c46..e9e5a3d 100755\n--- a/git-annotate.perl\n+++ b/git-annotate.perl\n@@ -37,14 +37,14 @@ my @stack = (\n \n our (@lineoffsets, @pendinglineoffsets);\n our @filelines = ();\n-open(F,\"<\",$filename)\n-\tor die \"Failed to open filename: $!\";\n \n-while(<F>) {\n+our $blob_sha1 = qx{git-ls-tree HEAD \"$filename\"};\n+$blob_sha1 =~ s/^.*blob (\\S*).*$/$1/;\n+foreach (qx{git-cat-file blob $blob_sha1}) {\n \tchomp;\n \tpush @filelines, $_;\n }\n-close(F);\n+!$? or exit $?;\n our $leftover_lines = @filelines;\n our %revs;\n our @revqueue;\n@@ -91,13 +91,12 @@ foreach my $l (@filelines) {\n \t\tif (!$opt_l && length($rev) > 8) {\n \t\t\t$rev = substr($rev,0,8);\n \t\t}\n+\t\tprintf(\"%s\\t(%10s\\t%s):%s\\n\", $rev, $committer,\n+\t\t\tformat_date($date), $output);\n \t} else {\n-\t\t$output = $l;\n-\t\t($rev, $committer, $date) = ('unknown', 'unknown', 'unknown');\n+\t\tprintf(\"%s\\t(%10s\\t%10s\\t%d)%s\\n\", $rev, $committer,\n+\t\t\tformat_date($date), $i++, $output);\n \t}\n-\n-\tprintf(\"%s\\t(%10s\\t%10s\\t%d)%s\\n\", $rev, $committer,\n-\t\tformat_date($date), $i++, $output);\n }\n \n sub init_claim {\n@@ -143,20 +142,24 @@ sub handle_rev {\n sub git_rev_list {\n \tmy ($rev, $file) = @_;\n \n+\tmy @revs;\n \tif ($opt_S) {\n \t\topen(P, '<' . $opt_S);\n+\t\twhile(my $line = <P>) {\n+\t\t\tchomp $line;\n+\t\t\tmy ($rev, @parents) = split /\\s+/, $line;\n+\t\t\tpush @revs, [ $rev, @parents ];\n+\t\t}\n+\t\tclose(P);\n \t} else {\n-\t\topen(P,\"-|\",\"git-rev-list\",\"--parents\",\"--remove-empty\",$rev,\"--\",$file)\n-\t\t\tor die \"Failed to exec git-rev-list: $!\";\n-\t}\n-\n-\tmy @revs;\n-\twhile(my $line = <P>) {\n-\t\tchomp $line;\n-\t\tmy ($rev, @parents) = split /\\s+/, $line;\n-\t\tpush @revs, [ $rev, @parents ];\n+\t\tforeach (qx{git-rev-list --parents --remove-empty $rev -- $file}\n+) {\n+\t\t\tchomp $_;\n+\t\t\tmy ($rev, @parents) = split /\\s+/, $_;\n+\t\t\tpush @revs, [ $rev, @parents ];\n+\t\t}\n+\t\t!$? or exit $?;\n \t}\n-\tclose(P);\n \n \tprintf(\"0 revs found for rev %s (%s)\\n\", $rev, $file) if (@revs == 0);\n \treturn @revs;\n@@ -165,13 +168,11 @@ sub git_rev_list {\n sub find_parent_renames {\n \tmy ($rev, $file) = @_;\n \n-\topen(P,\"-|\",\"git-diff-tree\", \"-M50\", \"-r\",\"--name-status\", \"-z\",\"$rev\")\n-\t\tor die \"Failed to exec git-diff: $!\";\n-\n \tlocal $/ = \"\\0\";\n \tmy %bound;\n \tmy $junk = <P>;\n-\twhile (my $change = <P>) {\n+\tforeach (qx{git-diff-tree -M50 -r --name-status -z $rev}) {\n+\t\tmy $change = $_;\n \t\tchomp $change;\n \t\tmy $filename = <P>;\n \t\tchomp $filename;\n@@ -189,7 +190,7 @@ sub find_parent_renames {\n \t\t\t}\n \t\t}\n \t}\n-\tclose(P);\n+\t!$? or exit $?;\n \n \treturn \\%bound;\n }\n@@ -198,15 +199,12 @@ sub find_parent_renames {\n sub git_find_parent {\n \tmy ($rev, $filename) = @_;\n \n-\topen(REVPARENT,\"-|\",\"git-rev-list\",\"--remove-empty\", \"--parents\",\"--max-count=1\",\"$rev\",\"--\",$filename)\n-\t\tor die \"Failed to open git-rev-list to find a single parent: $!\";\n+\tmy $parentline = qx{git-rev-list --remove-empty --parents --max-count=1 $rev -- $filename};\n+\t!$? or die \"Failed to open git-rev-list to find a single parent: $!\";\n \n-\tmy $parentline = <REVPARENT>;\n \tchomp $parentline;\n \tmy ($revfound,$parent) = split m/\\s+/, $parentline;\n \n-\tclose(REVPARENT);\n-\n \treturn $parent;\n }\n \n@@ -217,17 +215,13 @@ sub git_diff_parse {\n \tmy ($parent, $rev, %revinfo) = @_;\n \n \tmy ($ri, $pi) = (0,0);\n-\topen(DIFF,\"-|\",\"git-diff-tree\",\"-M\",\"-p\",$rev,$parent,\"--\",\n-\t\t\t$revs{$rev}{'filename'}, $revs{$parent}{'filename'})\n-\t\tor die \"Failed to call git-diff for annotation: $!\";\n-\n \tmy $slines = $revs{$rev}{'lines'};\n \tmy @plines;\n \n \tmy $gotheader = 0;\n \tmy ($remstart, $remlength, $addstart, $addlength);\n \tmy ($hunk_start, $hunk_index, $hunk_adds);\n-\twhile(<DIFF>) {\n+\tforeach (qx{git-diff-tree -M -p $rev $parent -- $revs{$rev}{'filename'} $revs{$parent}{'filename'}}) {\n \t\tchomp;\n \t\tif (m/^@@ -(\\d+),(\\d+) \\+(\\d+),(\\d+)/) {\n \t\t\t($remstart, $remlength, $addstart, $addlength) = ($1, $2, $3, $4);\n@@ -279,7 +273,7 @@ sub git_diff_parse {\n \t\t}\n \t\t$hunk_index++;\n \t}\n-\tclose(DIFF);\n+\t!$? or exit $?;\n \tfor (my $i = $ri; $i < @{$slines} ; $i++) {\n \t\tpush @plines, $slines->[$ri++];\n \t}\n@@ -300,15 +294,12 @@ sub git_cat_file {\n \tmy $blobline = `git-ls-tree $parent $filename`;\n \tmy ($mode, $type, $blob, $tfilename) = split(/\\s+/, $blobline, 4);\n \n-\topen(C,\"-|\",\"git-cat-file\", \"blob\", $blob)\n-\t\tor die \"Failed to git-cat-file blob $blob (rev $parent, file $filename): \" . $!;\n-\n \tmy @lines;\n-\twhile(<C>) {\n+\tforeach (qx{git-cat-file blob $blob}) {\n \t\tchomp;\n \t\tpush @lines, $_;\n \t}\n-\tclose(C);\n+\t!$? or die \"Failed to git-cat-file blob $blob (rev $parent, file $filename).\";\n \n \treturn @lines;\n }\n@@ -325,11 +316,9 @@ sub claim_line {\n \n sub git_commit_info {\n \tmy ($rev) = @_;\n-\topen(COMMIT, \"-|\",\"git-cat-file\", \"commit\", $rev)\n-\t\tor die \"Failed to call git-cat-file: $!\";\n \n \tmy %info;\n-\twhile(<COMMIT>) {\n+\tforeach (qx{git-cat-file commit $rev}) {\n \t\tchomp;\n \t\tlast if (length $_ == 0);\n \n@@ -343,7 +332,7 @@ sub git_commit_info {\n \t\t\t$info{'committer_date'} = $3;\n \t\t}\n \t}\n-\tclose(COMMIT);\n+\t!$? or exit $?;\n \n \treturn %info;\n }\n@@ -351,6 +340,11 @@ sub git_commit_info {\n sub format_date {\n \tmy ($timestamp, $timezone) = split(' ', $_[0]);\n \n+\tif (!$opt_l) {\n+\t\treturn strftime(\"%Y-%b-%d\", gmtime($timestamp));\n+\t}\n+\n \treturn strftime(\"%Y-%m-%d %H:%M:%S \" . $timezone, gmtime($timestamp));\n }\n \n+\n"},{"id":"16620","messageId":"81b0412b0602230708y37bebe8co1bc3cdaf63302465@mail.gmail.com","threadId":"3445","inReplyTo":"Pine.LNX.4.63.0602231442390.24946@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Port git-annotate to qx{} syntax, and make default output more like CVS","fromName":"Alex Riesen","fromEmail":"raa.lkml@gmail.com","sentAt":"2006-02-23T15:08:16Z","receivedAt":"2006-02-23T15:08:16Z","isPatch":true,"sender":{"key":"raa.lkml@gmail.com","avatar":"https://avatars.githubusercontent.com/u/324101?v=4"},"body":"On 2/23/06, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n>\n> This uses the qx{} syntax Alex digged up, and it makes output without \"-l\"\n> quite similar to CVS's annotate output.\n>\n\nWorks here.\n"}]}