[PATCH 4/7] gitweb: Add parse_rev_list for later use
From: Jakub Narebski <hidden>
Date: 2016-06-15 22:42:39
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted>
---
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