X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/2d1ff30e13d91cc4fa355bc392ba6044c6a6f31e..aafd267ee099ddb8ff4129a0e4d46964be866f6d:/IkiWiki/Plugin/cvs.pm diff --git a/IkiWiki/Plugin/cvs.pm b/IkiWiki/Plugin/cvs.pm index c1b40bda1..ff9d578e2 100644 --- a/IkiWiki/Plugin/cvs.pm +++ b/IkiWiki/Plugin/cvs.pm @@ -6,6 +6,7 @@ use strict; use IkiWiki; sub import { + hook(type => "wrapperargcheck", id => "cvs", call => \&wrapperargcheck); hook(type => "checkconfig", id => "cvs", call => \&checkconfig); hook(type => "getsetup", id => "cvs", call => \&getsetup); hook(type => "rcs", id => "rcs_update", call => \&rcs_update); @@ -20,6 +21,17 @@ sub import { hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime); } +sub wrapperargcheck () { + my $check_args=<<"EOF"; + int j; + for (j = 1; j < argc; j++) + if (strstr(argv[j], "New directory") != NULL) + return 0; + return 1; +EOF + return $check_args; +} + sub checkconfig () { if (! defined $config{cvspath}) { $config{cvspath}="ikiwiki"; @@ -100,32 +112,17 @@ sub cvs_info ($$) { } sub cvs_runcvs(@) { - my ($cmd) = @_; - unshift @$cmd, 'cvs', '-Q'; - - eval q{use IPC::Cmd}; - error($@) if $@; + my @cmd = @_; + unshift @cmd, 'cvs', '-Q'; chdir $config{srcdir} || error("Cannot chdir to $config{srcdir}: $!"); - debug("runcvs: " . join(" ", @$cmd)); - - my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf) = - IPC::Cmd::run(command => $cmd, verbose => 0); - if (! $success) { - warn(join(" ", @$cmd) . " exited with code $error_code\n"); - warn(join "", @$stderr_buf); - } - return $success; -} - -sub cvs_shquote_commit ($) { - my $message = shift; - - eval q{use String::ShellQuote}; - error($@) if $@; + open(my $savedout, ">&STDOUT"); + open(STDOUT, ">", "/dev/null"); + my $ret = system(@cmd); + open(STDOUT, ">&", $savedout); - return shell_quote(IkiWiki::possibly_foolish_untaint($message)); + return ($ret == 0) ? 1 : 0; } sub cvs_is_controlling { @@ -136,7 +133,7 @@ sub cvs_is_controlling { sub rcs_update () { return unless cvs_is_controlling; - cvs_runcvs(['update', '-dP']); + cvs_runcvs('update', '-dP'); } sub rcs_prepedit ($) { @@ -180,13 +177,14 @@ sub rcs_commit ($$$;$$) { if (defined $rev && defined $oldrev && $rev != $oldrev) { # Merge their changes into the file that we've # changed. - cvs_runcvs(['update', $file]) || + cvs_runcvs('update', $file) || warn("cvs merge from $oldrev to $rev failed\n"); } - if (! cvs_runcvs(['commit', '-m', cvs_shquote_commit $message])) { + if (! cvs_runcvs('commit', '-m', + IkiWiki::possibly_foolish_untaint $message)) { my $conflict=readfile("$config{srcdir}/$file"); - cvs_runcvs(['update', '-C', $file]) || + cvs_runcvs('update', '-C', $file) || warn("cvs revert failed\n"); return $conflict; } @@ -206,7 +204,8 @@ sub rcs_commit_staged ($$$) { $message="web commit from $ipaddr".(length $message ? ": $message" : ""); } - if (! cvs_runcvs(['commit', '-m', cvs_shquote_commit $message])) { + if (! cvs_runcvs('commit', '-m', + IkiWiki::possibly_foolish_untaint $message)) { warn "cvs staged commit failed\n"; return 1; # failure } @@ -228,14 +227,19 @@ sub rcs_add ($) { } while ($file = pop @files_to_add) { - if ((@files_to_add == 0) && - (File::MimeInfo::default $file ne 'text/plain')) { - # it's a binary file, add specially - cvs_runcvs(['add', '-kb', $file]) || - warn("cvs add $file failed\n"); + if (@files_to_add == 0) { + # file + my $filemime = File::MimeInfo::default($file); + if (defined($filemime) && $filemime eq 'text/plain') { + cvs_runcvs('add', $file) || + warn("cvs add $file failed\n"); + } else { + cvs_runcvs('add', '-kb', $file) || + warn("cvs add binary $file failed\n"); + } } else { - # directory or regular file - cvs_runcvs(['add', $file]) || + # directory + cvs_runcvs('add', $file) || warn("cvs add $file failed\n"); } } @@ -247,7 +251,7 @@ sub rcs_remove ($) { return unless cvs_is_controlling; - cvs_runcvs(['rm', '-f', $file]) || + cvs_runcvs('rm', '-f', $file) || warn("cvs rm $file failed\n"); } @@ -290,7 +294,7 @@ sub rcs_recentchanges($) { system("env TZ=UTC cvsps -q --cvs-direct -z 30 -x >$tmpfile"); if ($? == -1) { error "couldn't run cvsps: $!\n"; - } elsif (($? >>8) != 0) { + } elsif (($? >> 8) != 0) { error "cvsps exited " . ($? >> 8) . ": $!\n"; }