diff options
author | Joey Hess <joey@kitenet.net> | 2012-02-07 02:59:05 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-02-07 03:06:40 -0400 |
commit | 1b6c1895784db37438ab51a4aebb366aa2e8009d (patch) | |
tree | 3e1f6f0de40f1d5cb61af83e48b444b940bfb783 /IkiWiki | |
parent | c29a088dd8a2e2a2676bc5dba7a1046c2ac56a06 (diff) | |
download | ikiwiki-1b6c1895784db37438ab51a4aebb366aa2e8009d.tar ikiwiki-1b6c1895784db37438ab51a4aebb366aa2e8009d.tar.gz |
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.
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/git.pm | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm index 3117e4291..3dd910cd5 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -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; - - 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"); - } + in_git_dir($rootdir, sub { + my @commits=git_commit_info($sha1, 1); + + if (! @commits) { + error "unknown commit"; # just in case + } - my @ret=git_parse_changes(1, @commits); + # 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_dir=undef; - return @ret; + git_parse_changes(1, @commits); + }); } sub rcs_revert ($) { |