[PATCH 4/7] gitweb: Add parse_rev_list for later use
- From
Jakub Narebski <jnareb@gmail.com>
- Date
- Sep 6, 2006, 13:08 UTC
- Message-ID
- <11575480922634-git-send-email-jnareb@gmail.com>
- In-Reply-To
- <11575480922090-git-send-email-jnareb@gmail.com>
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@gmail.com> --- 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