]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/git.pm
t/git-cgi.t: fix race condition
[git.ikiwiki.info.git] / IkiWiki / Plugin / git.pm
index 0da4e0dbc429e818bcfad3ed1f01b523b487b4f0..7a6a554952079787f8d5c15b4c4f74159812d1c9 100644 (file)
@@ -221,6 +221,11 @@ sub safe_git {
                        chdir $git_dir_stack[0]
                            or error("cannot chdir to $git_dir_stack[0]: $!");
                }
+
+               if ($params{stdout}) {
+                       open(STDOUT, '>&', $params{stdout}) or error("Cannot reopen stdout: $!");
+               }
+
                exec @{$params{cmdline}} or error("Cannot exec '@{$params{cmdline}}': $!");
        }
        # In parent.
@@ -958,11 +963,11 @@ sub git_parse_changes {
                                die $@ if $@;
                                my $fh;
                                ($fh, $path)=File::Temp::tempfile(undef, UNLINK => 1);
-                               my $cmd = "cd $git_dir_stack[0] && ".
-                                         "git show $detail->{sha1_to} > '$path'";
-                               if (system($cmd) != 0) {
-                                       error("failed writing temp file '$path'.");
-                               }
+                               safe_git(
+                                       error_handler => sub { error("failed writing temp file '$path': ".shift."."); },
+                                       stdout => $fh,
+                                       cmdline => ['git', 'show', $detail->{sha1_to}],
+                               );
                        }
 
                        push @rets, {
@@ -1033,10 +1038,6 @@ sub rcs_preprevert ($) {
                my $failure;
                my @ret;
                eval {
-                       IkiWiki::disable_commit_hook();
-                       push @undo, sub {
-                               IkiWiki::enable_commit_hook();
-                       };
                        my $branch = "ikiwiki_revert_${sha1}"; # supposed to be unique
 
                        push @undo, sub {
@@ -1094,7 +1095,7 @@ sub rcs_revert ($) {
 
        ensure_committer();
 
-       if (run_or_non('git', 'merge', '--ff-only', "ikiwiki_revert_$sha1")) {
+       if (run_or_non('git', 'cherry-pick', '--no-commit', "ikiwiki_revert_$sha1")) {
                return undef;
        }
        else {