]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/cvs.pm
Merge commit 'schmonz/master' into cvs
[git.ikiwiki.info.git] / IkiWiki / Plugin / cvs.pm
index c1b40bda1099957b5c343d05bcec37fefb75d57b..4735c013810c0d44a9b51cdc1d5e0ba08ec9fedb 100644 (file)
@@ -108,8 +108,6 @@ sub cvs_runcvs(@) {
 
        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) {
@@ -121,11 +119,21 @@ sub cvs_runcvs(@) {
 
 sub cvs_shquote_commit ($) {
        my $message = shift;
+       my $test_message = "CVS autodiscover quoting CVS";
 
        eval q{use String::ShellQuote};
        error($@) if $@;
+       eval q{use IPC::Cmd};
+       error($@) if $@;
 
-       return shell_quote(IkiWiki::possibly_foolish_untaint($message));
+       my $cmd = ['echo', shell_quote($test_message)];
+       my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf) =
+               IPC::Cmd::run(command => $cmd, verbose => 0);
+       if ((grep /'$test_message'/, @$stdout_buf) > 0) {
+               return IkiWiki::possibly_foolish_untaint($message);
+       } else {
+               return shell_quote(IkiWiki::possibly_foolish_untaint($message));
+       }
 }
 
 sub cvs_is_controlling {
@@ -228,13 +236,18 @@ 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
+                       # directory
                        cvs_runcvs(['add', $file]) ||
                                warn("cvs add $file failed\n");
                }
@@ -290,7 +303,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";
        }