X-Git-Url: https://git.ladys.computer/Gitweb/blobdiff_plain/5fded1caa6ae407fde12433760d4f88df4d8c09eda11ecc1a19c022ec9ba787d..07d153aa63e8c60a20e273635be7ce7b9adb37d956f94f06631c630386d900b9:/gitweb.perl
diff --git a/gitweb.perl b/gitweb.perl
index 973b0a4..0c50718 100755
--- a/gitweb.perl
+++ b/gitweb.perl
@@ -141,12 +141,25 @@ sub feature_snapshot {
return ($ctype, $suffix, $command);
}
+# rename detection options for git-diff and git-diff-tree
+# - default is '-M', with the cost proportional to
+# (number of removed files) * (number of new files).
+# - more costly is '-C' (or '-C', '-M'), with the cost proportional to
+# (number of changed files + number of removed files) * (number of new files)
+# - even more costly is '-C', '--find-copies-harder' with cost
+# (number of files in the original tree) * (number of new files)
+# - one might want to include '-B' option, e.g. '-B', '-M'
+our @diff_opts = ('-M'); # taken from git_commit
+
our $GITWEB_CONFIG = $ENV{'GITWEB_CONFIG'} || "++GITWEB_CONFIG++";
require $GITWEB_CONFIG if -e $GITWEB_CONFIG;
# version of the core git binary
our $git_version = qx($GIT --version) =~ m/git version (.*)$/ ? $1 : "unknown";
+# path to the current git repository
+our $git_dir;
+
$projects_list ||= $projectroot;
# ======================================================================
@@ -174,7 +187,7 @@ if (defined $project) {
if (!(-e "$projectroot/$project/HEAD")) {
die_error(undef, "No such project");
}
- $ENV{'GIT_DIR'} = "$projectroot/$project";
+ $git_dir = "$projectroot/$project";
}
our $file_name = $cgi->param('f');
@@ -562,21 +575,31 @@ sub format_diff_line {
## ----------------------------------------------------------------------
## git utility subroutines, invoking git commands
+# returns path to the core git executable and the --git-dir parameter as list
+sub git_cmd {
+ return $GIT, '--git-dir='.$git_dir;
+}
+
+# returns path to the core git executable and the --git-dir parameter as string
+sub git_cmd_str {
+ return join(' ', git_cmd());
+}
+
# get HEAD ref of given project as hash
sub git_get_head_hash {
my $project = shift;
- my $oENV = $ENV{'GIT_DIR'};
+ my $o_git_dir = $git_dir;
my $retval = undef;
- $ENV{'GIT_DIR'} = "$projectroot/$project";
- if (open my $fd, "-|", $GIT, "rev-parse", "--verify", "HEAD") {
+ $git_dir = "$projectroot/$project";
+ if (open my $fd, "-|", git_cmd(), "rev-parse", "--verify", "HEAD") {
my $head = <$fd>;
close $fd;
if (defined $head && $head =~ /^([0-9a-fA-F]{40})$/) {
$retval = $1;
}
}
- if (defined $oENV) {
- $ENV{'GIT_DIR'} = $oENV;
+ if (defined $o_git_dir) {
+ $git_dir = $o_git_dir;
}
return $retval;
}
@@ -585,7 +608,7 @@ sub git_get_head_hash {
sub git_get_type {
my $hash = shift;
- open my $fd, "-|", $GIT, "cat-file", '-t', $hash or return;
+ open my $fd, "-|", git_cmd(), "cat-file", '-t', $hash or return;
my $type = <$fd>;
close $fd or return;
chomp $type;
@@ -599,7 +622,7 @@ sub git_get_project_config {
$key =~ s/^gitweb\.//;
return if ($key =~ m/\W/);
- my @x = ($GIT, 'repo-config');
+ my @x = (git_cmd(), 'repo-config');
if (defined $type) { push @x, $type; }
push @x, "--get";
push @x, "gitweb.$key";
@@ -615,7 +638,7 @@ sub git_get_hash_by_path {
my $tree = $base;
- open my $fd, "-|", $GIT, "ls-tree", $base, "--", $path
+ open my $fd, "-|", git_cmd(), "ls-tree", $base, "--", $path
or die_error(undef, "Open git-ls-tree failed");
my $line = <$fd>;
close $fd or return undef;
@@ -625,26 +648,6 @@ sub git_get_hash_by_path {
return $3;
}
-# converts symbolic name to hash
-sub git_to_hash {
- my @params = @_;
- return undef unless @params;
-
- open my $fd, "-|", $GIT, "rev-parse", @params
- or return undef;
- my @hashes = map { chomp; $_ } <$fd>;
- close $fd;
-
- if (wantarray) {
- return @hashes;
- } elsif (scalar(@hashes) == 1) {
- # single hash
- return $hashes[0];
- } else {
- return \@hashes;
- }
-}
-
## ......................................................................
## git utility functions, directly accessing git repository
@@ -766,7 +769,7 @@ sub git_get_references {
open $fd, "$projectroot/$project/info/refs"
or return;
} else {
- open $fd, "-|", $GIT, "ls-remote", "."
+ open $fd, "-|", git_cmd(), "ls-remote", "."
or return;
}
@@ -784,61 +787,10 @@ sub git_get_references {
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;
-}
-
sub git_get_rev_name_tags {
my $hash = shift || return undef;
- open my $fd, "-|", $GIT, "name-rev", "--tags", $hash
+ open my $fd, "-|", git_cmd(), "name-rev", "--tags", $hash
or return;
my $name_rev = <$fd>;
close $fd;
@@ -886,7 +838,7 @@ sub parse_tag {
my %tag;
my @comment;
- open my $fd, "-|", $GIT, "cat-file", "tag", $tag_id or return;
+ open my $fd, "-|", git_cmd(), "cat-file", "tag", $tag_id or return;
$tag{'id'} = $tag_id;
while (my $line = <$fd>) {
chomp $line;
@@ -927,7 +879,7 @@ sub parse_commit {
@commit_lines = @$commit_text;
} else {
$/ = "\0";
- open my $fd, "-|", $GIT, "rev-list", "--header", "--parents", "--max-count=1", $commit_id
+ open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", "--max-count=1", $commit_id
or return;
@commit_lines = split '\n', <$fd>;
close $fd or return;
@@ -1425,9 +1377,15 @@ sub git_print_page_path {
}
}
-sub git_print_log {
+# sub git_print_log (\@;%) {
+sub git_print_log ($;%) {
my $log = shift;
+ my %opts = @_;
+ if ($opts{'-remove_title'}) {
+ # remove title, i.e. first line of log
+ shift @$log;
+ }
# remove leading empty lines
while (defined $log->[0] && $log->[0] eq "") {
shift @$log;
@@ -1437,6 +1395,19 @@ sub git_print_log {
my $signoff = 0;
my $empty = 0;
foreach my $line (@$log) {
+ if ($line =~ m/^ *(signed[ \-]off[ \-]by[ :]|acked[ \-]by[ :]|cc[ :])/i) {
+ $signoff = 1;
+ if (! $opts{'-remove_signoff'}) {
+ print "" . esc_html($line) . "
\n";
+ next;
+ } else {
+ # remove signoff lines
+ next;
+ }
+ } else {
+ $signoff = 0;
+ }
+
# print only one empty line
# do not print empty line after signoff
if ($line eq "") {
@@ -1445,13 +1416,13 @@ sub git_print_log {
} else {
$empty = 0;
}
- if ($line =~ m/^ *(signed[ \-]off[ \-]by[ :]|acked[ \-]by[ :]|cc[ :])/i) {
- $signoff = 1;
- print "" . esc_html($line) . "
\n";
- } else {
- $signoff = 0;
- print format_log_line_html($line) . "
\n";
- }
+
+ print format_log_line_html($line) . "
\n";
+ }
+
+ if ($opts{'-final_empty_line'}) {
+ # end with single empty line
+ print "
\n" unless $empty;
}
}
@@ -1459,30 +1430,10 @@ sub git_print_simplified_log {
my $log = shift;
my $remove_title = shift;
- shift @$log if $remove_title;
- # remove leading empty lines
- while (defined $log->[0] && $log->[0] eq "") {
- shift @$log;
- }
-
- # simplify and print log
- my $empty = 0;
- foreach my $line (@$log) {
- # remove signoff lines
- if ($line =~ m/^ *(signed[ \-]off[ \-]by[ :]|acked[ \-]by[ :]|cc[ :])/i) {
- next;
- }
- # print only one empty line
- if ($line eq "") {
- next if $empty;
- $empty = 1;
- } else {
- $empty = 0;
- }
- print format_log_line_html($line) . "
\n";
- }
- # end with single empty line
- print "
\n" unless $empty;
+ git_print_log($log,
+ -final_empty_line=> 1,
+ -remove_signoff => 1,
+ -remove_title => $remove_title);
}
## ......................................................................
@@ -1556,7 +1507,7 @@ sub git_difftree_body {
"blob") .
" | " .
$cgi->a({-href => href(action=>"history", hash_base=>$parent,
- file_name=>$diff{'file'})},\
+ file_name=>$diff{'file'})},
"history") .
"\n";
@@ -1656,7 +1607,7 @@ sub git_patchset_body {
print "