RE: svn_load_dirs.pl for Win32
From: Ian Brockbank <Ian.Brockbank_at_wolfsonmicro.com>
Date: 2004-04-28 15:26:46 CEST
Hi All,
A further update - properties didn't work properly (because it no longer
Total changes now:
* open(HANDLE, "-|"); doesn't work on Windows. I replaced it with
New patch:
--- http://svn.collab.net/repos/svn/trunk/contrib/client-side/svn_load_dirs. pl.in (revision 9503) +++ http://svn.collab.net/repos/svn/trunk/contrib/client-side/svn_load_dirs. pl.in (working copy) @@ -14,7 +14,7 @@ use File::Copy 2.03; use File::Find; use File::Path 1.0404; -use File::Temp 0.12 qw(tempdir); +use File::Temp 0.12 qw(tempdir tempfile); use Getopt::Long 2.25; use Text::Wrap; use URI 1.17; @@ -341,6 +341,10 @@ # Create a temporary directory for svn to work in. my $temp_dir = $ENV{TMPDIR}; unless (defined $temp_dir and length $temp_dir) { + # Try the Windows standard environment variable + $temp_dir = $ENV{TEMP}; +} +unless (defined $temp_dir and length $temp_dir) { $temp_dir = '/tmp'; } my $temp_template = "$temp_dir/svn_load_dirs_XXXXXXXXXX"; @@ -1133,11 +1137,17 @@ { @diff_ignore_space_changes = ('-b'); } + + # Write the value to a temporary file in case it's multi-line + my ($handle, $tmpfile) = tempfile( DIR => $temp_dir); + print $handle $property_value; + close($handle); read_from_process($svn, 'propset', $property_name, - $property_value, + '--file', + $tmpfile, $add_file); } } @@ -1411,25 +1421,74 @@ } # Start a child process safely without using /bin/sh. +my $openfork_available = "MSWin32" ne $^O; sub safe_read_from_pipe { unless (@_) { croak "$0: safe_read_from_pipe $INCORRECT_NUMBER_OF_ARGS"; } - print "Running @_\n"; - my $pid = open(SAFE_READ, '-|'); - unless (defined $pid) + + if ($openfork_available) { - die "$0: cannot fork: $!\n"; + print "Running @_\n"; + my $pid = open(SAFE_READ, "-|"); + unless (defined $pid) + { + die "$0: cannot fork: $!\n"; + } + unless ($pid) + { + # child + open(STDERR, ">&STDOUT") + or die "$0: cannot dup STDOUT: $!\n"; + exec(@_) + or die "$0: cannot exec '@_': $!\n"; + } } - unless ($pid) + else { - open(STDERR, ">&STDOUT") - or die "$0: cannot dup STDOUT: $!\n"; - exec(@_) - or die "$0: cannot exec '@_': $!\n"; - } + # Redirect the comment into a temp file and use that to work around + # Windoze's (non-)handling of multi-line commands. + my @commandline = (); + my $command; + my $comment; + + while ($command = shift) + { + if ("-m" eq $command) + { + my $comment = shift; + my ($handle, $tmpfile) = tempfile( DIR => $temp_dir); + print $handle $comment; + close($handle); + + push(@commandline, "--file"); + push(@commandline, $tmpfile); + } + else + { + # Munge the command to protect it from the command line + $command =~ s/\"/\\\"/g; + if ($command =~ m"\s") { $command = "\"$command\""; } + if ($command eq "") { $command = "\"\""; } + if ($command =~ m"\n") + { + warn "$0: carriage return detected in command - may not work\n"; + } + push(@commandline, $command); + } + } + + print "Running @commandline\n"; + if ( $comment ) { print $comment; } + + # Now do the pipe. + open(SAFE_READ, "@commandline |") + or die "$0: cannot pipe to command: $!\n"; + } + + # parent my @output; while (<SAFE_READ>) { =================================================================== Cheers, Ian Brockbank Senior Applications Software Engineer e: ian.brockbank@wolfsonmicro.com / apps@wolfsonmicro.com scd: ian@scottishdance.net t: +44 131 272 7145 f: +44 131 272 7001
---------------------------------------------------------------------
|
This is an archived mail posted to the Subversion Users mailing list.
This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.