{"thread":{"id":"5583","subject":"[PATCH] gitweb: Make git_get_refs_list do work of git_get_references","startedAt":"2006-09-17T00:26:38Z","lastAt":"2006-09-17T10:06:35Z","messageCount":10,"participants":["Jakub Narebski","Junio C Hamano","Randal L. Schwartz"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"27027","messageId":"200609170226.39330.jnareb@gmail.com","threadId":"5583","inReplyTo":null,"subject":"[PATCH] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-17T00:26:38Z","receivedAt":"2006-09-17T00:26:38Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Make git_get_refs_list do also work of git_get_references, to avoid\ncalling git-peek-remote twice. It now returns either list of refs as\nbefore in scalar context, or references hash and list of refs in list\ncontext. Change meaning of git_get_refs_list meaning: it is now type,\nand not a full path, e.g. we now use git_get_refs_list(\"heads\")\ninstead of former git_get_refs_list(\"refs/heads\").\n\nAdditionally modify git_summary to use only one call to\ngit_get_refs_list instead of one call to git_get_references and two to\ngit_get_refs_list.\n\nSigned-off-by: Jakub Narebski <jnareb@gmail.com>\n---\nThis was supposed to make gitweb performance better, by \n(in the case of git_summary) replacing three calls to git-peek-remote\n(or one reading info/refs and two calls to git-peek-remote) by only \none such a call. ApacheBench shows that after changes summary and tags \nviews are slower, while heads remains the same.\n\n  3520.593 +/- 29.2 ms after vs 3086.579 +/- 85.0 ms before (summary)\n  3137.274 +/- 26.4 ms after vs 2504.025 +/- 46.1 ms before (tags)\n\nI suspect benchmarks somewhat, but still...\n\n gitweb/gitweb.perl |   57 ++++++++++++++++++++++++++++++----------------------\n 1 files changed, 33 insertions(+), 24 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex 7908793..d5ce675 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -1077,7 +1077,8 @@ ## .....................................\n ## parse to array of hashes functions\n \n sub git_get_refs_list {\n-\tmy $ref_dir = shift;\n+\tmy $type = shift || \"\";\n+\tmy %refs;\n \tmy @reflist;\n \n \tmy @refs;\n@@ -1085,14 +1086,21 @@ sub git_get_refs_list {\n \t\tor return;\n \twhile (my $line = <$fd>) {\n \t\tchomp $line;\n-\t\tif ($line =~ m/^([0-9a-fA-F]{40})\\t$ref_dir\\/?([^\\^]+)$/) {\n-\t\t\tpush @refs, { hash => $1, name => $2 };\n-\t\t} elsif ($line =~ m/^[0-9a-fA-F]{40}\\t$ref_dir\\/?(.*)\\^\\{\\}$/ &&\n-\t\t         $1 eq $refs[-1]{'name'}) {\n-\t\t\t# most likely a tag is followed by its peeled\n-\t\t\t# (deref) one, and when that happens we know the\n-\t\t\t# previous one was of type 'tag'.\n-\t\t\t$refs[-1]{'type'} = \"tag\";\n+\t\tif ($line =~ m/^([0-9a-fA-F]{40})\\trefs\\/($type\\/?([^\\^]+))(\\^\\{\\})?$/) {\n+\t\t\tif (defined $refs{$1}) {\n+\t\t\t\tpush @{$refs{$1}}, $2;\n+\t\t\t} else {\n+\t\t\t\t$refs{$1} = [ $2 ];\n+\t\t\t}\n+\n+\t\t\tif (! $4) { # unpeeled, direct reference\n+\t\t\t\tpush @refs, { hash => $1, name => $3 }; # without type\n+\t\t\t} elsif ($1 eq $refs[-1]{'name'}) {\n+\t\t\t\t# most likely a tag is followed by its peeled\n+\t\t\t\t# (deref) one, and when that happens we know the\n+\t\t\t\t# previous one was of type 'tag'.\n+\t\t\t\t$refs[-1]{'type'} = \"tag\";\n+\t\t\t}\n \t\t}\n \t}\n \tclose $fd;\n@@ -1108,7 +1116,7 @@ sub git_get_refs_list {\n \t}\n \t# sort refs by age\n \t@reflist = sort {$b->{'epoch'} <=> $a->{'epoch'}} @reflist;\n-\treturn \\@reflist;\n+\treturn wantarray ? (\\%refs, \\@reflist) : \\@reflist;\n }\n \n ## ----------------------------------------------------------------------\n@@ -2072,14 +2080,14 @@ sub git_tags_body {\n \n sub git_heads_body {\n \t# uses global variable $project\n-\tmy ($taglist, $head, $from, $to, $extra) = @_;\n+\tmy ($headlist, $head, $from, $to, $extra) = @_;\n \t$from = 0 unless defined $from;\n-\t$to = $#{$taglist} if (!defined $to || $#{$taglist} < $to);\n+\t$to = $#{$headlist} if (!defined $to || $#{$headlist} < $to);\n \n \tprint \"<table class=\\\"heads\\\" cellspacing=\\\"0\\\">\\n\";\n \tmy $alternate = 0;\n \tfor (my $i = $from; $i <= $to; $i++) {\n-\t\tmy $entry = $taglist->[$i];\n+\t\tmy $entry = $headlist->[$i];\n \t\tmy %tag = %$entry;\n \t\tmy $curr = $tag{'id'} eq $head;\n \t\tif ($alternate) {\n@@ -2249,7 +2257,8 @@ sub git_summary {\n \n \tmy $owner = git_get_project_owner($project);\n \n-\tmy $refs = git_get_references();\n+\tmy ($refs, $reflist) = git_get_refs_list();\n+\n \tgit_header_html();\n \tgit_print_page_nav('summary','', $head);\n \n@@ -2279,17 +2288,17 @@ sub git_summary {\n \tgit_shortlog_body(\\@revlist, 0, 15, $refs,\n \t                  $cgi->a({-href => href(action=>\"shortlog\")}, \"...\"));\n \n-\tmy $taglist = git_get_refs_list(\"refs/tags\");\n-\tif (defined @$taglist) {\n+\tmy @taglist = map { s!^tags/!! } grep { m!^tags/! } @$reflist;\n+\tif (@taglist) {\n \t\tgit_print_header_div('tags');\n-\t\tgit_tags_body($taglist, 0, 15,\n+\t\tgit_tags_body(\\@taglist, 0, 15,\n \t\t              $cgi->a({-href => href(action=>\"tags\")}, \"...\"));\n \t}\n \n-\tmy $headlist = git_get_refs_list(\"refs/heads\");\n-\tif (defined @$headlist) {\n+\tmy @headlist = map { s!^heads/!! } grep { m!^heads/! } @$reflist;\n+\tif (@headlist) {\n \t\tgit_print_header_div('heads');\n-\t\tgit_heads_body($headlist, $head, 0, 15,\n+\t\tgit_heads_body(\\@headlist, $head, 0, 15,\n \t\t               $cgi->a({-href => href(action=>\"heads\")}, \"...\"));\n \t}\n \n@@ -2500,7 +2509,7 @@ sub git_tags {\n \tgit_print_page_nav('','', $head,undef,$head);\n \tgit_print_header_div('summary', $project);\n \n-\tmy $taglist = git_get_refs_list(\"refs/tags\");\n+\tmy $taglist = git_get_refs_list(\"tags\");\n \tif (defined @$taglist) {\n \t\tgit_tags_body($taglist);\n \t}\n@@ -2513,9 +2522,9 @@ sub git_heads {\n \tgit_print_page_nav('','', $head,undef,$head);\n \tgit_print_header_div('summary', $project);\n \n-\tmy $taglist = git_get_refs_list(\"refs/heads\");\n-\tif (defined @$taglist) {\n-\t\tgit_heads_body($taglist, $head);\n+\tmy $headlist = git_get_refs_list(\"heads\");\n+\tif (defined @$headlist) {\n+\t\tgit_heads_body($headlist, $head);\n \t}\n \tgit_footer_html();\n }\n-- \n1.4.2.1\n"},{"id":"27028","messageId":"200609170237.00593.jnareb@gmail.com","threadId":"5583","inReplyTo":"200609170226.39330.jnareb@gmail.com","subject":"[PATCH 1/2] gitweb: Always use git-peek-remote in git_get_references","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-17T00:37:00Z","receivedAt":"2006-09-17T00:37:00Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Instead of trying to read info/refs file, which might not be present\n(we did fallback to git-ls-remote), always use git-peek-remote in\ngit_get_references.\n\nIt is preparation for git_get_refs_info to also return references\ninfo. We cannot use info/refs for git_get_refs_info as the information\ncontained therein is usually stale.\n\nSigned-off-by: Jakub Narebski <jnareb@gmail.com>\n---\nThis patch should be before the one it is reply to, i.e.\n  gitweb:  Make git_get_refs_list do work of git_get_references\n\n gitweb/gitweb.perl |   10 ++--------\n 1 files changed, 2 insertions(+), 8 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex a81c8d4..8c3c13d 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -786,16 +786,10 @@ sub git_get_project_owner {\n sub git_get_references {\n \tmy $type = shift || \"\";\n \tmy %refs;\n-\tmy $fd;\n \t# 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c\trefs/tags/v2.6.11\n \t# c39ae07f393806ccf406ef966e9a15afc43cc36a\trefs/tags/v2.6.11^{}\n-\tif (-f \"$projectroot/$project/info/refs\") {\n-\t\topen $fd, \"$projectroot/$project/info/refs\"\n-\t\t\tor return;\n-\t} else {\n-\t\topen $fd, \"-|\", git_cmd(), \"ls-remote\", \".\"\n-\t\t\tor return;\n-\t}\n+\topen my $fd, \"-|\", $GIT, \"peek-remote\", \"$projectroot/$project/\"\n+\t\tor return;\n \n \twhile (my $line = <$fd>) {\n \t\tchomp $line;\n-- \n1.4.2.1\n"},{"id":"27030","messageId":"7vodtf8eym.fsf@assigned-by-dhcp.cox.net","threadId":"5583","inReplyTo":"200609170226.39330.jnareb@gmail.com","subject":"Re: [PATCH] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-09-17T01:22:09Z","receivedAt":"2006-09-17T01:22:09Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jakub Narebski <jnareb@gmail.com> writes:\n\n> Make git_get_refs_list do also work of git_get_references, to avoid\n> calling git-peek-remote twice. It now returns either list of refs as\n> before in scalar context, or references hash and list of refs in list\n> context.\n\nI do not think we want to have too many functions that return\ndifferent things depending on contexts.  Forcing callers to\nremember what the function does in which context is bad.  You\nseem to like writing:\n\n\tmy $value = that_function(@args)\n\nbut I'd\nrather see all callers to say:\n\n\tmy ($value) = that_function(@args);\n\neven when they expect just one value from the function.  One\nless thing to remember, and one less source of surprises.\n\nEspecially for this particular case, you are not even avoiding\nextra computation when you are only returning list, so I do not\nthink making the return value depend on the calling context is\nbuying you much.\n"},{"id":"27033","messageId":"864pv7tgmx.fsf@blue.stonehenge.com","threadId":"5583","inReplyTo":"7vodtf8eym.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Randal L. Schwartz","fromEmail":"merlyn@stonehenge.com","sentAt":"2006-09-17T01:40:22Z","receivedAt":"2006-09-17T01:40:22Z","isPatch":true,"sender":{"key":"merlyn@stonehenge.com","avatar":"https://gravatar.com/avatar/dc528d210743ff0333e6213f9ee7b33b23f1b7bc1f3c5a8c2d819074ecd7ab19?d=mp&s=160"},"body":">>>>> \"Junio\" == Junio C Hamano <junkio@cox.net> writes:\n\nJunio> Jakub Narebski <jnareb@gmail.com> writes:\n>> Make git_get_refs_list do also work of git_get_references, to avoid\n>> calling git-peek-remote twice. It now returns either list of refs as\n>> before in scalar context, or references hash and list of refs in list\n>> context.\n\nJunio> I do not think we want to have too many functions that return\nJunio> different things depending on contexts.  Forcing callers to\nJunio> remember what the function does in which context is bad.\n\nThat's even an inaccurate description, so an expert in Perl (I've\nknown a few) would just scratch his head.\n\nYou cannot ever ever return a list in a scalar context.  Ever.  Never ever.\n\nYou can return an array ref that *contains* a list of references, sure.\nPerhaps that's what you mean, as in:\n\n  return [$ref1, $ref2, $ref3, $ref4]; # scalar return\n\nBut to be sloppy about the terminology confuses me.  For example,\nI can't tell from your description if you mean the list-value return is:\n\n  return \\%some_hash, $ref1, $ref2, $ref3, $ref4; # list return: N items\n\nOr, reverse engineering your sloppiness on the other description, you\n*MIGHT* mean:\n\n  return \\%some_hash, [$ref1, $ref2, $ref3, $ref4]; # list return: 2 items\n\nPerl5 does *no* implicit referencing/dereferencing (just like C).  So yes,\nbeing precise with your language is necessary.\n\n-- \nRandal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095\n<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>\nPerl/Unix/security consulting, Technical writing, Comedy, etc. etc.\nSee PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!\n"},{"id":"27035","messageId":"7vejub8cms.fsf@assigned-by-dhcp.cox.net","threadId":"5583","inReplyTo":"864pv7tgmx.fsf@blue.stonehenge.com","subject":"Re: [PATCH] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-09-17T02:12:27Z","receivedAt":"2006-09-17T02:12:27Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"merlyn@stonehenge.com (Randal L. Schwartz) writes:\n\n>>>>>> \"Junio\" == Junio C Hamano <junkio@cox.net> writes:\n>\n> Junio> Jakub Narebski <jnareb@gmail.com> writes:\n>>> Make git_get_refs_list do also work of git_get_references, to avoid\n>>> calling git-peek-remote twice. It now returns either list of refs as\n>>> before in scalar context, or references hash and list of refs in list\n>>> context.\n>\n> Junio> I do not think we want to have too many functions that return\n> Junio> different things depending on contexts.  Forcing callers to\n> Junio> remember what the function does in which context is bad.\n>\n> That's even an inaccurate description, so an expert in Perl (I've\n> known a few) would just scratch his head.\n>\n> You cannot ever ever return a list in a scalar context.  Ever.  Never ever.\n\nThat much I think I know.\n\nThe code I was complaining about tries to do something like\nthis:\n\n\tsub that_sub {\n        \t...\n                return wantarray ? (\\@bar, \\%foo) : \\@bar;\n\t}\n\nand it is not done for optimization purposes (i.e. \"if the\ncaller only wants one and we are returning \\@bar then we do not\nhave to compute \\%foo which is a big win\" is not why it does\nthis wantarray business).\n\nSo the callers when interested in the sequence of things in 'bar'\ntypically say:\n\n\tmy $the_list = that_sub(...);\n        for (@$the_list) {\n        \t...\n\t}\n\nwhile other callers say:\n\n\tmy ($the_hash, $the_list) = that_sub(...);\n\t... use %$the_hash and @$the_list as see fit ...\n\nAnd I was saying that getting rid of the \"return wantwarray ? :\"\nbusiness and write the first class of callers like this\n\n\tmy ($the_list) = that_sub(...);\n        for (@$the_list) {\n        \t...\n\t}\n\nwould be much less confusing.\n"},{"id":"27036","messageId":"86wt83s0bt.fsf@blue.stonehenge.com","threadId":"5583","inReplyTo":"7vejub8cms.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Randal L. Schwartz","fromEmail":"merlyn@stonehenge.com","sentAt":"2006-09-17T02:17:58Z","receivedAt":"2006-09-17T02:17:58Z","isPatch":true,"sender":{"key":"merlyn@stonehenge.com","avatar":"https://gravatar.com/avatar/dc528d210743ff0333e6213f9ee7b33b23f1b7bc1f3c5a8c2d819074ecd7ab19?d=mp&s=160"},"body":">>>>> \"Junio\" == Junio C Hamano <junkio@cox.net> writes:\n\nJunio> That much I think I know.\n\nI think you know too.  I even know now that you think you know. :)\n\nThe comment was more for Jakub, I believe.\n\n-- \nRandal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095\n<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>\nPerl/Unix/security consulting, Technical writing, Comedy, etc. etc.\nSee PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!\n"},{"id":"27040","messageId":"7v4pv78btt.fsf@assigned-by-dhcp.cox.net","threadId":"5583","inReplyTo":"7vejub8cms.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-09-17T02:29:50Z","receivedAt":"2006-09-17T02:29:50Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Junio C Hamano <junkio@cox.net> writes:\n\n> The code I was complaining about tries to do something like\n> this:\n>\n> \tsub that_sub {\n>         \t...\n>                 return wantarray ? (\\@bar, \\%foo) : \\@bar;\n> \t}\n>\n> and it is not done for optimization purposes (i.e. \"if the\n> caller only wants one and we are returning \\@bar then we do not\n> have to compute \\%foo which is a big win\" is not why it does\n> this wantarray business).\n\nNote.  I did not mean to imply conditional return should be done\nfor performance reasons.\n\nAnd I do not think the way this conditional return is done\nserves better DWIMmery, which was my primary complaint.  So I\nshould probably have said \"It's not for better DWIM, it is not\neven for better performance, and I do not see a point\".\n"},{"id":"27062","messageId":"200609171158.48358.jnareb@gmail.com","threadId":"5583","inReplyTo":"7vfyeq6dn3.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH 2/2 (take 2)] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-17T10:00:41Z","receivedAt":"2006-09-17T10:00:41Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Junio C Hamano wrote:\n> Jakub Narebski <jnareb@gmail.com> writes:\n> \n> > This was supposed to make gitweb performance better, by \n> > (in the case of git_summary) replacing three calls to git-peek-remote\n> > (or one reading info/refs and two calls to git-peek-remote) by only \n> > one such a call. ApacheBench shows that after changes summary and tags \n> > views are slower, while heads remains the same or even faster (?).\n> \n> That does not give us much confidence in the patch, does it?  If\n> it results in cleaner code that is fine, though.\n\nThis was because the additional test you proposed for \"it is tag if\nit is followed by deref\" was implemented incorrectly. Corrected in \"take 3\"\nof this patch.\n\n> > @@ -1107,8 +1115,8 @@ sub git_get_refs_list {\n> >  \t\tpush @reflist, \\%ref_item;\n> >  \t}\n> >  \t# sort refs by age\n> > -\t@reflist = sort {$b->{'epoch'} <=> $a->{'epoch'}} @reflist;\n> > -\treturn \\@reflist;\n> > +\t#@reflist = sort {$b->{'epoch'} <=> $a->{'epoch'}} @reflist;\n> > +\treturn (\\@reflist, \\%refs);\n> >  }\n> \n> I've already said I do not like commented out lines that do not\n> say why they are commented out, but I sense something more\n> serious here.  Doesn't this removal of sorting affect the\n> callers?\n\nCorrected in \"take 3\" of this patch.\n\n> > @@ -2072,14 +2080,14 @@ sub git_tags_body {\n> >  \n> >  sub git_heads_body {\n> >  \t# uses global variable $project\n> > -\tmy ($taglist, $head, $from, $to, $extra) = @_;\n> > +\tmy ($headlist, $head, $from, $to, $extra) = @_;\n> >  \t$from = 0 unless defined $from;\n> > -\t$to = $#{$taglist} if (!defined $to || $#{$taglist} < $to);\n> > +\t$to = $#{$headlist} if (!defined $to || $#{$headlist} < $to);\n> >  \n> >  \tprint \"<table class=\\\"heads\\\" cellspacing=\\\"0\\\">\\n\";\n> >  \tmy $alternate = 0;\n> >  \tfor (my $i = $from; $i <= $to; $i++) {\n> > -\t\tmy $entry = $taglist->[$i];\n> > +\t\tmy $entry = $headlist->[$i];\n> >  \t\tmy %tag = %$entry;\n> >  \t\tmy $curr = $tag{'id'} eq $head;\n> >  \t\tif ($alternate) {\n> \n> Unrelated but indeed is a good clean-up.  It was quite confusing\n> before (I think this was a result of cut and paste reuse).\n\nAnd I see that this cleanup is incomplete (%tag = %$entry). Gaah.\nShould I split cleanup patch?\n\n\n> > @@ -2500,7 +2518,7 @@ sub git_tags {\n> >  \tgit_print_page_nav('','', $head,undef,$head);\n> >  \tgit_print_header_div('summary', $project);\n> >  \n> > -\tmy $taglist = git_get_refs_list(\"refs/tags\");\n> > +\tmy ($taglist) = git_get_refs_list(\"tags\");\n> >  \tif (defined @$taglist) {\n> >  \t\tgit_tags_body($taglist);\n> >  \t}\n> > @@ -2513,9 +2531,9 @@ sub git_heads {\n> >  \tgit_print_page_nav('','', $head,undef,$head);\n> >  \tgit_print_header_div('summary', $project);\n> >  \n> > -\tmy $taglist = git_get_refs_list(\"refs/heads\");\n> > -\tif (defined @$taglist) {\n> > -\t\tgit_heads_body($taglist, $head);\n> > +\tmy ($headlist) = git_get_refs_list(\"heads\");\n> > +\tif (defined @$headlist) {\n> > +\t\tgit_heads_body($headlist, $head);\n> >  \t}\n> >  \tgit_footer_html();\n> >  }\n> \n> It always confuses me when people say:\n> \n> \tif (defined @$arrayref)\n\nGaah. It should be either \n\tif (defined $arrayref)\nor\n\tif (@$arrayref)\nor (if one is truly paranoid) ;-)\n\tif (defined $arrayref && ref($arrayref) eq \"ARRAY\" && @$arrayref)\n\n[...]\n> You probably would want to grep for 'defined @' and fix them all\n> at once.\n\nWill do. Unless someone will do this first.\n\n-- \nJakub Narebski\nPoland\n"},{"id":"27063","messageId":"eej6dr$i3o$2@sea.gmane.org","threadId":"5583","inReplyTo":"200609171158.48358.jnareb@gmail.com","subject":"Re: [PATCH 2/2 (take 2)] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-17T10:02:12Z","receivedAt":"2006-09-17T10:02:12Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Jakub Narebski wrote:\n\n> Corrected in \"take 3\" of this patch.\n\nWhich somehow didn't get to the list...\n\n-- \nJakub Narebski\nWarsaw, Poland\nShadeHawk on #git\n"},{"id":"27065","messageId":"eej6m1$lgc$1@sea.gmane.org","threadId":"5583","inReplyTo":"eej6dr$i3o$2@sea.gmane.org","subject":"Re: [PATCH 2/2 (take 2)] gitweb: Make git_get_refs_list do work of git_get_references","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-17T10:06:35Z","receivedAt":"2006-09-17T10:06:35Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Jakub Narebski wrote:\n\n> Jakub Narebski wrote:\n> \n>> Corrected in \"take 3\" of this patch.\n> \n> Which somehow didn't get to the list...\n\nAnd \"take 2\" didn't get to the list either.\n\nStupid filters, or should I just wait a bit?\n-- \nJakub Narebski\nWarsaw, Poland\nShadeHawk on #git\n"}]}