} elsif ($char eq "@") {
$diff_class = " chunk_header";
} elsif ($char eq "\\") {
- # skip errors (incomplete lines)
$diff_class = " incomplete";
}
$line = untabify($line);
return \%refs;
}
+sub git_get_following_references {
+ my $hash = shift || return undef;
+ my $type = shift;
+ my $base = shift || $hash_base || "HEAD";
+
+ my $refs = git_get_references($type);
+ open my $fd, "-|", $GIT, "rev-list", $base
+ or return undef;
+ my @commits = map { chomp; $_ } <$fd>;
+ close $fd
+ or return undef;
+
+ my @reflist;
+ my $lastref;
+
+ foreach my $commit (@commits) {
+ foreach my $ref (@{$refs->{$commit}}) {
+ $lastref = $ref;
+ push @reflist, $lastref;
+ }
+ if ($commit eq $hash) {
+ last;
+ }
+ }
+
+ return wantarray ? @reflist : $lastref;
+}
+
+sub git_get_preceding_references {
+ my $hash = shift || return undef;
+ my $type = shift;
+
+ my $refs = git_get_references($type);
+ open my $fd, "-|", $GIT, "rev-list", $hash
+ or return undef;
+ my @commits = map { chomp; $_ } <$fd>;
+ close $fd
+ or return undef;
+
+ my @reflist;
+
+ foreach my $commit (@commits) {
+ foreach my $ref (@{$refs->{$commit}}) {
+ return $ref unless wantarray;
+ push @reflist, $ref;
+ }
+ }
+
+ return @reflist;
+}
+
## ----------------------------------------------------------------------
## parse to hash functions
}
sub git_patchset_body {
- my ($patchset, $difftree, $hash, $hash_parent) = @_;
+ my ($fd, $difftree, $hash, $hash_parent) = @_;
my $patch_idx = 0;
my $in_header = 0;
print "<div class=\"patchset\">\n";
- LINE: foreach my $patch_line (@$patchset) {
+ LINE:
+ while (my $patch_line @$fd>) {
+ chomp $patch_line;
if ($patch_line =~ m/^diff /) { # "git diff" header
# beginning of patch (in patchset)
# read commitdiff
my $fd;
my @difftree;
- my @patchset;
if ($format eq 'html') {
open $fd, "-|", $GIT, "diff-tree", '-r', '-M', '-C',
"--patch-with-raw", "--full-index", $hash_parent, $hash
last unless $line;
push @difftree, $line;
}
- @patchset = map { chomp; $_ } <$fd>;
- close $fd
- or die_error(undef, "Reading git-diff-tree failed");
} elsif ($format eq 'plain') {
open $fd, "-|", $GIT, "diff-tree", '-r', '-p', '-B', $hash_parent, $hash
or die_error(undef, "Open git-diff-tree failed");
+
} else {
die_error(undef, "Unknown commitdiff format");
}
#git_difftree_body(\@difftree, $hash, $hash_parent);
#print "<br/>\n";
- git_patchset_body(\@patchset, \@difftree, $hash, $hash_parent);
-
+ git_patchset_body($fd, \@difftree, $hash, $hash_parent);
+ close $fd;
print "</div>\n"; # class="page_body"
git_footer_html();