fix display of page name in recentchanges after a revert

When the wiki is in a subdir of the git repo, a web revert would show
in recentchanges as eg, doc/index, instead of just index.

This happened because decode_git_file caches a $prefix that is dependant
on the $git_dir setting, and the revert code runs with a different
$git_dir, which polluted the $prefix for later.

Fix this by adding a with_git_dir that juggles the variables properly.
master
Joey Hess 2012-02-07 02:59:05 -04:00
parent c29a088dd8
commit 1b6c189578
1 changed files with 27 additions and 22 deletions

View File

@ -9,7 +9,6 @@ use open qw{:utf8 :std};
my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate Git sha1sums
my $dummy_commit_msg = 'dummy commit'; # message to skip in recent changes
my $git_dir=undef;
sub import {
hook(type => "checkconfig", id => "git", call => \&checkconfig);
@ -151,6 +150,17 @@ sub genwrapper {
}
}
my $git_dir=undef;
my $prefix=undef;
sub in_git_dir ($$) {
$git_dir=shift;
my @ret=shift->();
$git_dir=undef;
$prefix=undef;
return @ret;
}
sub safe_git (&@) {
# Start a child process safely without resorting to /bin/sh.
# Returns command output (in list content) or success state
@ -302,8 +312,6 @@ sub merge_past ($$$) {
return $conflict;
}
{
my $prefix;
sub decode_git_file ($) {
my $file=shift;
@ -325,7 +333,6 @@ sub decode_git_file ($) {
return decode("utf8", $file);
}
}
sub parse_diff_tree ($) {
# Parse the raw diff tree chunk and return the info hash.
@ -845,9 +852,9 @@ sub rcs_receive () {
# (Also, if a subdir is involved, we don't want to chdir to
# it and only see changes in it.)
# The pre-receive hook already puts us in the right place.
$git_dir=".";
push @rets, git_parse_changes(0, git_commit_info($oldrev."..".$newrev));
$git_dir=undef;
in_git_dir(".", sub {
push @rets, git_parse_changes(0, git_commit_info($oldrev."..".$newrev));
});
}
return reverse @rets;
@ -860,23 +867,21 @@ sub rcs_preprevert ($) {
# Examine changes from root of git repo, not from any subdir,
# in order to see all changes.
my ($subdir, $rootdir) = git_find_root();
$git_dir=$rootdir;
in_git_dir($rootdir, sub {
my @commits=git_commit_info($sha1, 1);
if (! @commits) {
error "unknown commit"; # just in case
}
my @commits=git_commit_info($sha1, 1);
if (! @commits) {
error "unknown commit"; # just in case
}
# git revert will fail on merge commits. Add a nice message.
if (exists $commits[0]->{parents} &&
@{$commits[0]->{parents}} > 1) {
error gettext("you are not allowed to revert a merge");
}
# git revert will fail on merge commits. Add a nice message.
if (exists $commits[0]->{parents} &&
@{$commits[0]->{parents}} > 1) {
error gettext("you are not allowed to revert a merge");
}
my @ret=git_parse_changes(1, @commits);
$git_dir=undef;
return @ret;
git_parse_changes(1, @commits);
});
}
sub rcs_revert ($) {