]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
git: write proposed attachment to temp file without going via system()
authorSimon McVittie <smcv@debian.org>
Wed, 28 Dec 2016 19:35:14 +0000 (19:35 +0000)
committerSimon McVittie <smcv@debian.org>
Wed, 11 Jan 2017 19:55:09 +0000 (19:55 +0000)
(cherry picked from commit 4ad4fc33b52c7a2636eec810ca280efe65497fc9)

IkiWiki/Plugin/git.pm

index 0da4e0dbc429e818bcfad3ed1f01b523b487b4f0..d1cb247de62aabd202806c1df90c1cf2612edc8d 100644 (file)
@@ -221,6 +221,11 @@ sub safe_git {
                        chdir $git_dir_stack[0]
                            or error("cannot chdir to $git_dir_stack[0]: $!");
                }
                        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.
                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);
                                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, {
                        }
 
                        push @rets, {