fix web reversion when the srcdir is in a subdir of the git repo.

master
Joey Hess 2010-10-23 16:19:16 -04:00
parent 2c0783831e
commit 9ca9959eda
2 changed files with 24 additions and 12 deletions

View File

@ -9,7 +9,7 @@ use open qw{:utf8 :std};
my $sha1_pattern = qr/[0-9a-fA-F]{40}/; # pattern to validate Git sha1sums 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 $dummy_commit_msg = 'dummy commit'; # message to skip in recent changes
my $no_chdir=0; my $git_dir=undef;
sub import { sub import {
hook(type => "checkconfig", id => "git", call => \&checkconfig); hook(type => "checkconfig", id => "git", call => \&checkconfig);
@ -164,9 +164,13 @@ sub safe_git (&@) {
if (!$pid) { if (!$pid) {
# In child. # In child.
# Git commands want to be in wc. # Git commands want to be in wc.
if (! $no_chdir) { if (! defined $git_dir) {
chdir $config{srcdir} chdir $config{srcdir}
or error("Cannot chdir to $config{srcdir}: $!"); or error("cannot chdir to $config{srcdir}: $!");
}
else {
chdir $git_dir
or error("cannot chdir to $git_dir: $!");
} }
exec @cmdline or error("Cannot exec '@cmdline': $!"); exec @cmdline or error("Cannot exec '@cmdline': $!");
} }
@ -721,14 +725,13 @@ sub rcs_getmtime ($) {
} }
{ {
my $git_root; my $ret;
sub git_find_root { sub git_find_root {
# The wiki may not be the only thing in the git repo. # The wiki may not be the only thing in the git repo.
# Determine if it is in a subdirectory by examining the srcdir, # Determine if it is in a subdirectory by examining the srcdir,
# and its parents, looking for the .git directory. # and its parents, looking for the .git directory.
return $git_root if defined $git_root; return @$ret if defined $ret;
my $subdir=""; my $subdir="";
my $dir=$config{srcdir}; my $dir=$config{srcdir};
@ -740,7 +743,8 @@ sub git_find_root {
} }
} }
return $git_root=$subdir; $ret=[$subdir, $dir];
return @$ret;
} }
} }
@ -748,7 +752,7 @@ sub git_find_root {
sub git_parse_changes { sub git_parse_changes {
my @changes = @_; my @changes = @_;
my $subdir = git_find_root(); my ($subdir, $rootdir) = git_find_root();
my @rets; my @rets;
foreach my $ci (@changes) { foreach my $ci (@changes) {
foreach my $detail (@{ $ci->{'details'} }) { foreach my $detail (@{ $ci->{'details'} }) {
@ -794,8 +798,8 @@ sub git_parse_changes {
die $@ if $@; die $@ if $@;
my $fh; my $fh;
($fh, $path)=File::Temp::tempfile("XXXXXXXXXX", UNLINK => 1); ($fh, $path)=File::Temp::tempfile("XXXXXXXXXX", UNLINK => 1);
my $cmd = ($no_chdir ? '' : "cd $config{srcdir} && ") my $cmd = "cd $git_dir && ".
. "git show $detail->{sha1_to} > '$path'"; "git show $detail->{sha1_to} > '$path'";
if (system($cmd) != 0) { if (system($cmd) != 0) {
error("failed writing temp file '$path'."); error("failed writing temp file '$path'.");
} }
@ -825,10 +829,12 @@ sub rcs_receive () {
# Avoid chdir when running git here, because the changes # Avoid chdir when running git here, because the changes
# are in the master git repo, not the srcdir repo. # are in the master git repo, not the srcdir repo.
# (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. # The pre-receive hook already puts us in the right place.
$no_chdir=1; $git_dir=".";
push @rets, git_parse_changes(git_commit_info($oldrev."..".$newrev)); push @rets, git_parse_changes(git_commit_info($oldrev."..".$newrev));
$no_chdir=0; $git_dir=undef;
} }
return reverse @rets; return reverse @rets;
@ -838,7 +844,12 @@ sub rcs_preprevert ($) {
my $rev=shift; my $rev=shift;
my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint
# 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;
return git_parse_changes(git_commit_info($sha1, 1)); return git_parse_changes(git_commit_info($sha1, 1));
$git_dir=undef;
} }
sub rcs_revert ($) { sub rcs_revert ($) {

1
debian/changelog vendored
View File

@ -1,6 +1,7 @@
ikiwiki (3.20101020) UNRELEASED; urgency=low ikiwiki (3.20101020) UNRELEASED; urgency=low
* Fix typo that broke anonymous git push. * Fix typo that broke anonymous git push.
* fix web reversion when the srcdir is in a subdir of the git repo.
-- Joey Hess <joeyh@debian.org> Sat, 23 Oct 2010 15:25:19 -0400 -- Joey Hess <joeyh@debian.org> Sat, 23 Oct 2010 15:25:19 -0400