{"thread":{"id":"16057","subject":"[RFC] gitweb: add 'historyfollow' view that follows renames","startedAt":"2008-10-27T03:17:49Z","lastAt":"2008-10-31T01:19:52Z","messageCount":3,"participants":["Blucher, Guy","Moore, Robert","Jakub Narebski"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"94015","messageId":"054F21930D24A0428E5B4588462C7AED0149B4B8@ednex512.dsto.defence.gov.au","threadId":"16057","inReplyTo":null,"subject":"[RFC] gitweb: add 'historyfollow' view that follows renames","fromName":"Blucher, Guy","fromEmail":"guy.blucher@dsto.defence.gov.au","sentAt":"2008-10-27T03:17:49Z","receivedAt":"2008-10-27T03:17:49Z","isPatch":false,"sender":{"key":"guy.blucher@dsto.defence.gov.au","avatar":null},"body":"\nHi Folks,\n\n>> \n>> What should we add to automatically get all file history?\n\n> While the 'commitdiff' view would, in default gitweb configuration, \n> contain information about file renames, currently 'history' view does \n> not support '--follow' option to git-log.  It wouldn't be too hard to \n> add it, but it just wasn't done (well, add to this the fact that \n> --follow works only for simple cases).\n\nWe also ran up against this issue because renaming of files in our\nproject is a useful bit of information while browsing file history.\n\nI hacked gitweb to add a 'historyfollow' viewing option in addition to\nthe 'history' option.  Yes, '--follow' is expensive so I didn't just\nmake it the default 'history' behaviour. \n\nThe only problem with doing it was that parse_commits in gitweb.perl\nuses git rev-list which doesn't support the '--follow' option like\ngit-log does. A bit of hacking to use 'git log --pretty=raw -z' to make\nthe output look close to that from rev-list means only minor\nshoe-horning is required (perhaps it would be better to make rev-list\nunderstand --follow though?).\n\nI wasn't originally prepared to publish the work here because I don't\nreally think it's the best solution. But considering it's come up... I\ninclude a patch inline against gitweb.perl from v1.6.0.3 that implements\na 'historyfollow' view. \n\nFeel free to do with it what you will. It would need some substantial\ntidying up by someone who knows much more about perl than me :) \n\nWe use it such that anywhere a 'history' link is provided a\n'historyfollow' link is also provided next to it - This patch doesn't\nimplement that bit though.\n\nHope it helps.\n\nCheers,\nGuy.\n\n---\n\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -478,6 +478,7 @@ my %actions = (\n        \"forks\" => \\&git_forks,\n        \"heads\" => \\&git_heads,\n        \"history\" => \\&git_history,\n+       \"historyfollow\" => \\&git_history_follow,\n        \"log\" => \\&git_log,\n        \"rss\" => \\&git_rss,\n        \"atom\" => \\&git_atom,\n@@ -2311,25 +2312,39 @@ sub parse_commit {\n }\n \n sub parse_commits {\n-       my ($commit_id, $maxcount, $skip, $filename, @args) = @_;\n+       my ($commit_id, $maxcount, $skip, $mode, $filename, @args) = @_;\n        my @cos;\n \n        $maxcount ||= 1;\n        $skip ||= 0;\n \n        local $/ = \"\\0\";\n+        # The '--max-count' argument is not available when doing a\n+        # '--follow' to 'git log'\n+        my $count_arg = (\"--max-count=\" . $maxcount) ;\n+        if (defined $mode && $mode eq \"--follow\") {\n+            $count_arg = \"--follow\" ;\n+        }\n \n-       open my $fd, \"-|\", git_cmd(), \"rev-list\",\n-               \"--header\",\n+\n+       open my $fd, \"-|\", git_cmd(), \"log\",\n+               \"-z\",\n+               \"--pretty=raw\",\n                @args,\n-               (\"--max-count=\" . $maxcount),\n+                ($count_arg ? ($count_arg ) : ()),\n                (\"--skip=\" . $skip),\n                @extra_options,\n                $commit_id,\n                \"--\",\n                ($filename ? ($filename) : ())\n-               or die_error(500, \"Open git-rev-list failed\");\n+               or die_error(500, \"Open git-log failed\");\n        while (my $line = <$fd>) {\n+               # Need to put a delimiter on the end of output\n+                # 'git-log -z' doesn't put one before EOF like rev-list\ndoes\n+                $line = ($line . '\\0');\n+                # Need to strip the word commit from the start so it\n+                # looks like rev-list output\n+                $line =~ s/^commit // ;\n                my %co = parse_commit_text($line);\n                push @cos, \\%co;\n        }\n@@ -5363,6 +5378,13 @@ sub git_commitdiff_plain {\n }\n \n sub git_history {\n+        my $mode = shift || '';\n+        my $history_call = \"history\";\n+\n+       if ($mode eq \"--follow\") {\n+           $history_call .= \"historyfollow\" ;\n+       }\n+\n        if (!defined $hash_base) {\n                $hash_base = git_get_head_hash($project);\n        }\n@@ -5377,7 +5399,7 @@ sub git_history {\n        my $limit = sprintf(\"--max-count=%i\", (100 * ($page+1)));\n \n        my @commitlist = parse_commits($hash_base, 101, (100 * $page),\n-                                      $file_name, \"--full-history\")\n+                                      $mode, $file_name,\n\"--full-history\")\n            or die_error(404, \"No such file or directory on given\nbranch\");\n \n        if (!defined $hash && defined $file_name) {\n@@ -5398,7 +5420,7 @@ sub git_history {\n        my $paging_nav = '';\n        if ($page > 0) {\n                $paging_nav .=\n-                       $cgi->a({-href => href(action=>\"history\",\nhash=>$hash, hash_base=>$hash_base,\n+                       $cgi->a({-href => href(action=>\"$history_call\",\nhash=>$hash, hash_base=>$hash_base,\n                                               file_name=>$file_name)},\n                                \"first\");\n                $paging_nav .= \" &sdot; \" .\n@@ -5429,6 +5451,11 @@ sub git_history {\n        git_footer_html();\n }\n \n+sub git_history_follow {\n+       git_history('--follow');\n+}\n+\n+\n sub git_search {\n        gitweb_check_feature('search') or die_error(403, \"Search is\ndisabled\");\n        if (!defined $searchtext) {\n@@ -5469,7 +5496,7 @@ sub git_search {\n                        $greptype = \"--committer=\";\n                }\n                $greptype .= $searchtext;\n-               my @commitlist = parse_commits($hash, 101, (100 *\n$page), undef,\n+               my @commitlist = parse_commits($hash, 101, (100 *\n$page), undef, undef,\n                                               $greptype,\n'--regexp-ignore-case',\n                                               $search_use_regexp ?\n'--extended-regexp' : '--fixed-strings');\n \n@@ -5737,7 +5764,7 @@ sub git_feed {\n \n        # log/feed of current (HEAD) branch, log of given branch,\nhistory of file/directory\n        my $head = $hash || 'HEAD';\n-       my @commitlist = parse_commits($head, 150, 0, $file_name);\n+       my @commitlist = parse_commits($head, 150, 0, undef,\n$file_name);\n \n        my %latest_commit;\n        my %latest_date;\n---\n\nGuy.\n____________________________________________________\nGuy Blucher\nDefence Science and Technology Organisation\nAUSTRALIA\n\nIMPORTANT : This email remains the property of the Australian Defence\nOrganisation and is subject to the jurisdiction of section 70 of the\nCrimes Act 1914.  If you have received this email in error, you are\nrequested to contact the sender and delete the email.\n"},{"id":"94341","messageId":"4911F71203A09E4D9981D27F9D8308580AEC1324@orsmsx503.amr.corp.intel.com","threadId":"16057","inReplyTo":"054F21930D24A0428E5B4588462C7AED0149B4B8@ednex512.dsto.defence.gov.au","subject":"RE: [RFC] gitweb: add 'historyfollow' view that follows renames","fromName":"Moore, Robert","fromEmail":"robert.moore@intel.com","sentAt":"2008-10-30T22:00:44Z","receivedAt":"2008-10-30T22:00:44Z","isPatch":false,"sender":{"key":"robert.moore@intel.com","avatar":"https://gravatar.com/avatar/1297935bfacfdb19618287d49b72b098d10ce8c5989d548962d3da1b1c8373fb?d=mp&s=160"},"body":"Thanks. This sounds like what we need.\n\nWe will take a look at it.\nBob\n\n\n>-----Original Message-----\n>From: Blucher, Guy [mailto:Guy.Blucher@dsto.defence.gov.au]\n>Sent: Sunday, October 26, 2008 8:18 PM\n>To: Lin, Ming M; jnareb@gmail.com; Moore, Robert\n>Cc: git@vger.kernel.org\n>Subject: [RFC] gitweb: add 'historyfollow' view that follows renames\n>\n>\n>Hi Folks,\n>\n>>>\n>>> What should we add to automatically get all file history?\n>\n>> While the 'commitdiff' view would, in default gitweb configuration,\n>> contain information about file renames, currently 'history' view does\n>> not support '--follow' option to git-log.  It wouldn't be too hard to\n>> add it, but it just wasn't done (well, add to this the fact that\n>> --follow works only for simple cases).\n>\n>We also ran up against this issue because renaming of files in our\n>project is a useful bit of information while browsing file history.\n>\n>I hacked gitweb to add a 'historyfollow' viewing option in addition to\n>the 'history' option.  Yes, '--follow' is expensive so I didn't just\n>make it the default 'history' behaviour.\n>\n>The only problem with doing it was that parse_commits in gitweb.perl\n>uses git rev-list which doesn't support the '--follow' option like\n>git-log does. A bit of hacking to use 'git log --pretty=raw -z' to make\n>the output look close to that from rev-list means only minor\n>shoe-horning is required (perhaps it would be better to make rev-list\n>understand --follow though?).\n>\n>I wasn't originally prepared to publish the work here because I don't\n>really think it's the best solution. But considering it's come up... I\n>include a patch inline against gitweb.perl from v1.6.0.3 that implements\n>a 'historyfollow' view.\n>\n>Feel free to do with it what you will. It would need some substantial\n>tidying up by someone who knows much more about perl than me :)\n>\n>We use it such that anywhere a 'history' link is provided a\n>'historyfollow' link is also provided next to it - This patch doesn't\n>implement that bit though.\n>\n>Hope it helps.\n>\n>Cheers,\n>Guy.\n>\n>---\n>\n>--- a/gitweb/gitweb.perl\n>+++ b/gitweb/gitweb.perl\n>@@ -478,6 +478,7 @@ my %actions = (\n>        \"forks\" => \\&git_forks,\n>        \"heads\" => \\&git_heads,\n>        \"history\" => \\&git_history,\n>+       \"historyfollow\" => \\&git_history_follow,\n>        \"log\" => \\&git_log,\n>        \"rss\" => \\&git_rss,\n>        \"atom\" => \\&git_atom,\n>@@ -2311,25 +2312,39 @@ sub parse_commit {\n> }\n>\n> sub parse_commits {\n>-       my ($commit_id, $maxcount, $skip, $filename, @args) = @_;\n>+       my ($commit_id, $maxcount, $skip, $mode, $filename, @args) = @_;\n>        my @cos;\n>\n>        $maxcount ||= 1;\n>        $skip ||= 0;\n>\n>        local $/ = \"\\0\";\n>+        # The '--max-count' argument is not available when doing a\n>+        # '--follow' to 'git log'\n>+        my $count_arg = (\"--max-count=\" . $maxcount) ;\n>+        if (defined $mode && $mode eq \"--follow\") {\n>+            $count_arg = \"--follow\" ;\n>+        }\n>\n>-       open my $fd, \"-|\", git_cmd(), \"rev-list\",\n>-               \"--header\",\n>+\n>+       open my $fd, \"-|\", git_cmd(), \"log\",\n>+               \"-z\",\n>+               \"--pretty=raw\",\n>                @args,\n>-               (\"--max-count=\" . $maxcount),\n>+                ($count_arg ? ($count_arg ) : ()),\n>                (\"--skip=\" . $skip),\n>                @extra_options,\n>                $commit_id,\n>                \"--\",\n>                ($filename ? ($filename) : ())\n>-               or die_error(500, \"Open git-rev-list failed\");\n>+               or die_error(500, \"Open git-log failed\");\n>        while (my $line = <$fd>) {\n>+               # Need to put a delimiter on the end of output\n>+                # 'git-log -z' doesn't put one before EOF like rev-list\n>does\n>+                $line = ($line . '\\0');\n>+                # Need to strip the word commit from the start so it\n>+                # looks like rev-list output\n>+                $line =~ s/^commit // ;\n>                my %co = parse_commit_text($line);\n>                push @cos, \\%co;\n>        }\n>@@ -5363,6 +5378,13 @@ sub git_commitdiff_plain {\n> }\n>\n> sub git_history {\n>+        my $mode = shift || '';\n>+        my $history_call = \"history\";\n>+\n>+       if ($mode eq \"--follow\") {\n>+           $history_call .= \"historyfollow\" ;\n>+       }\n>+\n>        if (!defined $hash_base) {\n>                $hash_base = git_get_head_hash($project);\n>        }\n>@@ -5377,7 +5399,7 @@ sub git_history {\n>        my $limit = sprintf(\"--max-count=%i\", (100 * ($page+1)));\n>\n>        my @commitlist = parse_commits($hash_base, 101, (100 * $page),\n>-                                      $file_name, \"--full-history\")\n>+                                      $mode, $file_name,\n>\"--full-history\")\n>            or die_error(404, \"No such file or directory on given\n>branch\");\n>\n>        if (!defined $hash && defined $file_name) {\n>@@ -5398,7 +5420,7 @@ sub git_history {\n>        my $paging_nav = '';\n>        if ($page > 0) {\n>                $paging_nav .=\n>-                       $cgi->a({-href => href(action=>\"history\",\n>hash=>$hash, hash_base=>$hash_base,\n>+                       $cgi->a({-href => href(action=>\"$history_call\",\n>hash=>$hash, hash_base=>$hash_base,\n>                                               file_name=>$file_name)},\n>                                \"first\");\n>                $paging_nav .= \" &sdot; \" .\n>@@ -5429,6 +5451,11 @@ sub git_history {\n>        git_footer_html();\n> }\n>\n>+sub git_history_follow {\n>+       git_history('--follow');\n>+}\n>+\n>+\n> sub git_search {\n>        gitweb_check_feature('search') or die_error(403, \"Search is\n>disabled\");\n>        if (!defined $searchtext) {\n>@@ -5469,7 +5496,7 @@ sub git_search {\n>                        $greptype = \"--committer=\";\n>                }\n>                $greptype .= $searchtext;\n>-               my @commitlist = parse_commits($hash, 101, (100 *\n>$page), undef,\n>+               my @commitlist = parse_commits($hash, 101, (100 *\n>$page), undef, undef,\n>                                               $greptype,\n>'--regexp-ignore-case',\n>                                               $search_use_regexp ?\n>'--extended-regexp' : '--fixed-strings');\n>\n>@@ -5737,7 +5764,7 @@ sub git_feed {\n>\n>        # log/feed of current (HEAD) branch, log of given branch,\n>history of file/directory\n>        my $head = $hash || 'HEAD';\n>-       my @commitlist = parse_commits($head, 150, 0, $file_name);\n>+       my @commitlist = parse_commits($head, 150, 0, undef,\n>$file_name);\n>\n>        my %latest_commit;\n>        my %latest_date;\n>---\n>\n>Guy.\n>____________________________________________________\n>Guy Blucher\n>Defence Science and Technology Organisation\n>AUSTRALIA\n>\n>IMPORTANT : This email remains the property of the Australian Defence\n>Organisation and is subject to the jurisdiction of section 70 of the\n>Crimes Act 1914.  If you have received this email in error, you are\n>requested to contact the sender and delete the email.\n"},{"id":"94359","messageId":"200810310219.55913.jnareb@gmail.com","threadId":"16057","inReplyTo":"054F21930D24A0428E5B4588462C7AED0149B4B8@ednex512.dsto.defence.gov.au","subject":"Re: [RFC] gitweb: add 'historyfollow' view that follows renames","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2008-10-31T01:19:52Z","receivedAt":"2008-10-31T01:19:52Z","isPatch":false,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"I'm sorry for the delay in reviewing this patch...\n\nOn Mon, 27 Oct 2008, Huy Blucher wrote:\n\n[Please try do not lose attributions...]\n\n> > > \n> > > What should we add to automatically get all file history?\n> \n> > While the 'commitdiff' view would, in default gitweb configuration, \n> > contain information about file renames, currently 'history' view does \n> > not support '--follow' option to git-log.  It wouldn't be too hard to \n> > add it, but it just wasn't done (well, add to this the fact that \n> > --follow works only for simple cases).\n> \n> We also ran up against this issue because renaming of files in our\n> project is a useful bit of information while browsing file history.\n> \n> I hacked gitweb to add a 'historyfollow' viewing option in addition to\n> the 'history' option.  Yes, '--follow' is expensive so I didn't just\n> make it the default 'history' behaviour.\n\nI would prefer if instead of adding new 'historyfollow' action, which\ngoes against stated in TODO goal of uniquifying log-like views handling,\nthe patch added support for '--follow' as extra option to 'history'\nview (i.e. a=history;opt=--follow)... on the other hand 'historyfollow'\n(or simply 'follow') can be used in pure path_info gitweb URL... Hmm...\n\n> \n> The only problem with doing it was that parse_commits in gitweb.perl\n> uses git rev-list which doesn't support the '--follow' option like\n> git-log does. A bit of hacking to use 'git log --pretty=raw -z' to make\n> the output look close to that from rev-list means only minor\n> shoe-horning is required (perhaps it would be better to make rev-list\n> understand --follow though?).\n\nEither that, or use --pretty=format:<sth> which mimics current use of\n\"git-rev-list <opts>\" output in parse_commits exactly.\n\nAnd either move parse_commits to use git-log, change git-rev-parse to\nunderstand '--follow', or make parse_commits use git-log with --follow,\ngit-rev-list otherwise.\n\n> \n> I wasn't originally prepared to publish the work here because I don't\n> really think it's the best solution. But considering it's come up... I\n> include a patch inline against gitweb.perl from v1.6.0.3 that implements\n> a 'historyfollow' view.\n\nRFC (usually marked [RFC/PATCH]) patches are good because they allow\nothers to test and comment on your solution: early review, better to\nspot bugs etc. earlier.\n\n> \n> Feel free to do with it what you will. It would need some substantial\n> tidying up by someone who knows much more about perl than me :) \n> \n> We use it such that anywhere a 'history' link is provided a\n> 'historyfollow' link is also provided next to it - This patch doesn't\n> implement that bit though.\n> \n> Hope it helps.\n> \n> Cheers,\n> Guy.\n\nIt would be nice though if such [RFC/PATCH] followed guidelines from\nSubmittingPatches on commit messages...\n\n> \n> ---\n\nDiffstat?\n\n> \n> --- a/gitweb/gitweb.perl\n> +++ b/gitweb/gitweb.perl\n> @@ -478,6 +478,7 @@ my %actions = (\n>         \"forks\" => \\&git_forks,\n>         \"heads\" => \\&git_heads,\n>         \"history\" => \\&git_history,\n> +       \"historyfollow\" => \\&git_history_follow,\n>         \"log\" => \\&git_log,\n>         \"rss\" => \\&git_rss,\n>         \"atom\" => \\&git_atom,\n> @@ -2311,25 +2312,39 @@ sub parse_commit {\n>  }\n>  \n>  sub parse_commits {\n> -       my ($commit_id, $maxcount, $skip, $filename, @args) = @_;\n> +       my ($commit_id, $maxcount, $skip, $mode, $filename, @args) = @_;\n\nCan't you simply pass '--follow' or 'follow' in @args instead of\nchanging the signature of parse_commits?\n\n>         my @cos;\n>  \n>         $maxcount ||= 1;\n>         $skip ||= 0;\n>  \n>         local $/ = \"\\0\";\n> +        # The '--max-count' argument is not available when doing a\n> +        # '--follow' to 'git log'\n> +        my $count_arg = (\"--max-count=\" . $maxcount) ;\n> +        if (defined $mode && $mode eq \"--follow\") {\n> +            $count_arg = \"--follow\" ;\n> +        }\n\nI don't understand. Do you mean that\n\n  $ git log --max-count=<n> --follow <rev> -- <path>\n\ndoesn't work as expected? Hmmm... true, it doesn't work. \nThen it is certainly a _BUG_ in git!\n\n>  \n> -       open my $fd, \"-|\", git_cmd(), \"rev-list\",\n> -               \"--header\",\n> +\n> +       open my $fd, \"-|\", git_cmd(), \"log\",\n> +               \"-z\",\n> +               \"--pretty=raw\",\n>                 @args,\n> -               (\"--max-count=\" . $maxcount),\n> +                ($count_arg ? ($count_arg ) : ()),\n\nWhitespace damage (here visible).\n\n>                 (\"--skip=\" . $skip),\n>                 @extra_options,\n>                 $commit_id,\n>                 \"--\",\n>                 ($filename ? ($filename) : ())\n> -               or die_error(500, \"Open git-rev-list failed\");\n> +               or die_error(500, \"Open git-log failed\");\n>         while (my $line = <$fd>) {\n> +               # Need to put a delimiter on the end of output\n> +                # 'git-log -z' doesn't put one before EOF like rev-list\n> does\n> +                $line = ($line . '\\0');\n\nDoesn't it work if you don't add the above line?\n\n> +                # Need to strip the word commit from the start so it\n> +                # looks like rev-list output\n> +                $line =~ s/^commit // ;\n>                 my %co = parse_commit_text($line);\n\nPerhaps we should update parse_commit_text instead... or add an option\nlike parse_commit_text($line, -format=>'log'), or something like that.\n\n>                 push @cos, \\%co;\n>         }\n> @@ -5363,6 +5378,13 @@ sub git_commitdiff_plain {\n>  }\n>  \n>  sub git_history {\n> +        my $mode = shift || '';\n> +        my $history_call = \"history\";\n> +\n> +       if ($mode eq \"--follow\") {\n> +           $history_call .= \"historyfollow\" ;\n> +       }\n> +\n\nI don't quite like this solution...\n\nIf '--follow' was passed through @extra_options ('opt') parameter, then\nit should be re-used in links thanks to href(..., -replay=>1).\n\n>         if (!defined $hash_base) {\n>                 $hash_base = git_get_head_hash($project);\n>         }\n> @@ -5377,7 +5399,7 @@ sub git_history {\n>         my $limit = sprintf(\"--max-count=%i\", (100 * ($page+1)));\n>  \n>         my @commitlist = parse_commits($hash_base, 101, (100 * $page),\n> -                                      $file_name, \"--full-history\")\n> +                                      $mode, $file_name,\n> \"--full-history\")\n\nWord wrapped (not only here).\n\n>             or die_error(404, \"No such file or directory on given\n> branch\");\n>  \n>         if (!defined $hash && defined $file_name) {\n> @@ -5398,7 +5420,7 @@ sub git_history {\n>         my $paging_nav = '';\n>         if ($page > 0) {\n>                 $paging_nav .=\n> -                       $cgi->a({-href => href(action=>\"history\",\n> hash=>$hash, hash_base=>$hash_base,\n> +                       $cgi->a({-href => href(action=>\"$history_call\",\n> hash=>$hash, hash_base=>$hash_base,\n>                                                file_name=>$file_name)},\n>                                 \"first\");\n\nI would add opts=>[@extra_options] instead of changing action=>\"history\"\nto action=>$history_call (the quotes around variable are not needed).\n\n>                 $paging_nav .= \" &sdot; \" .\n> @@ -5429,6 +5451,11 @@ sub git_history {\n>         git_footer_html();\n>  }\n>  \n> +sub git_history_follow {\n> +       git_history('--follow');\n> +}\n> +\n> +\n>  sub git_search {\n>         gitweb_check_feature('search') or die_error(403, \"Search is\n> disabled\");\n>         if (!defined $searchtext) {\n> @@ -5469,7 +5496,7 @@ sub git_search {\n>                         $greptype = \"--committer=\";\n>                 }\n>                 $greptype .= $searchtext;\n> -               my @commitlist = parse_commits($hash, 101, (100 *\n> $page), undef,\n> +               my @commitlist = parse_commits($hash, 101, (100 *\n> $page), undef, undef,\n>                                                $greptype,\n> '--regexp-ignore-case',\n>                                                $search_use_regexp ?\n> '--extended-regexp' : '--fixed-strings');\n>  \n> @@ -5737,7 +5764,7 @@ sub git_feed {\n>  \n>         # log/feed of current (HEAD) branch, log of given branch,\n> history of file/directory\n>         my $head = $hash || 'HEAD';\n> -       my @commitlist = parse_commits($head, 150, 0, $file_name);\n> +       my @commitlist = parse_commits($head, 150, 0, undef,\n> $file_name);\n>  \n>         my %latest_commit;\n>         my %latest_date;\n> ---\n\nWhat I would like to see is the link in the bottom of action bar\n(navbar) or just below it, which would list 'follow' as one of possible\n'history' view formats (just like '--no-merges' or '--first-parent'\nshould be).\n\n-- \nJakub Narebski\nPoland\n"}]}