diff --git a/commit-patch b/commit-patch index 9330ddf..b06907e 100755 --- a/commit-patch +++ b/commit-patch @@ -45,8 +45,8 @@ while (!$vc{name}) { $vc{name} = 'cvs'; $vc{diff} = 'cvs diff -u'; $vc{commit} = 'cvs commit'; - $vc{message_opt} = $message ? ['-m', $message] : - $message_filename ? ['-F', $message_filename] : []; + $vc{message} = sub { ('-m', $_[0]) }; + $vc{message_file} = sub { ('-F', $_[0]) }; $vc{add} = 'cvs add'; $vc{remove} = 'cvs rm'; $vc{patcharg} = '-p0'; @@ -59,22 +59,24 @@ while (!$vc{name}) { $vc{commit} = 'darcs record --all'; $vc{patcharg} = '-p1'; $vc{lsdiffarg} = [qw(--strip 1)]; - if ($message) { + $vc{message} = sub { # Darcs doesn't like multiline -m comments so we have to put the log message into a file and use --logfile. Yuck. - #$vc{message_opt} = '-m'; + #return ('-m', $_[0]); + my $message = $_[0]; $message .= "\n" unless $message =~ /\n$/s; # Darcs does screwey stuff when logfile has no trailing \n. - (my $message_file, $message_filename) = tempfile("commit-patch-message-XXXXXXXX", UNLINK=>0); + my ($message_file, $message_filename) = tempfile("commit-patch-message-XXXXXXXX", UNLINK=>0); print $message_file $message; close $message_file; $clean{$message_filename} = undef; # make sure we delete this file on exit. - } - $vc{message_opt} = $message_filename ? ["--logfile=$message_filename"] : []; + ("--logfile=$message_filename"); + }; + $vc{message_file} = sub { ("--logfile=$_[0]" ) }; } elsif (-d "$repo/.hg") { $vc{name} = 'hg'; $vc{diff} = 'hg diff'; $vc{commit} = 'hg commit'; - $vc{message_opt} = $message ? ['-m', $message] : - $message_filename ? ['--logfile', $message_filename] : []; + $vc{message} = sub { ('-m', $_[0]) }; + $vc{message_file} = sub { ('--logfile', $_[0]) }; $vc{add} = 'hg addremove'; $vc{remove} = 'true'; $vc{patcharg} = '-p1'; @@ -111,7 +113,9 @@ eval { run(["patch", $vc{patcharg}, "-R"], '<', "working.patch.$$", '>', \$out, '2>', \$err) or die "$out\n$err\n"; run(["patch", $vc{patcharg}], '<', $patch, '>', \$out, '2>', \$err) or die "$out\n$err\n"; # Don't capture stdout or stderr because it can be interactive (cough cough darcs) - run([split(/ /,$vc{commit}), @{$vc{message_opt}}, @files],debug => 0) or die "commit failed.\n"; + my @message_opt = $message ? $vc{message}->($message) : + $message_filename ? $vc{message_file}->($message_filename) : (); + run([split(/ /,$vc{commit}), @message_opt, @files],debug => 0) or die "commit failed.\n"; run(["patch", $vc{patcharg}], '<', "non_committed.patch.$$", '>', \$out, '2>', \$err) or die "$out\n$err\n"; }; sub clean() {