Add parse_rev_list to generate _parsed_ list of revisions, combining getting the list of revisions, and parsing of individual revisions into one subroutine. It is to avoid code like below open my $fd, "-|", git_cmd(), "rev-list", $limit, $hash or die_error(undef, "Open git-rev-list failed"); my @revlist = map { chomp; $_ } <$fd>; ... foreach my $commit (@revlist) { my %co = parse_commit($commit); where parse_commit subroutine calls git-rev-list with '--max-count=1' to parse individual commit. Using parse_rev_list will avoid unnecessary forks. Signed-off-by: Jakub Narebski <jnareb@xxxxxxxxx> --- gitweb/gitweb.perl | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 2191853..8aeca52 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -1125,6 +1125,35 @@ sub git_get_refs_list { return \@reflist; } +# To use only one invocation of git-rev-list, instead of getting +# the list of revisions and then using git-rev-list per revision +# to parse individual commits. +# +# parse_rev_list parameters are passed to git-rev-list, so they should +# include at least starting revision; just in case we default to HEAD +sub parse_rev_list { + my @rev_opts = @_; + my @revlist; + + @rev_opts = ("HEAD") unless @rev_opts; + + local $/ = "\0"; + open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", @rev_opts + or return \@revlist; + + while (my $revinfo = <$fd>) { + chomp $revinfo; + my @commit_lines = split '\n', $revinfo; + my %co = parse_commit(undef, \@commit_lines); + + push @revlist, \%co; + } + + close $fd; + + return wantarray ? @revlist : \@revlist; +} + ## ---------------------------------------------------------------------- ## filesystem-related functions -- 1.4.2 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html