Re: Apache::TestMM::generate_script vs. Win32 Paths
On Tue, 17 Feb 2004, Stas Bekman wrote: Randy Kobes wrote: On Tue, 3 Feb 2004, Christopher H. Laco wrote: I've installed Apache::Test 1.07 on ActiveState perl 5.6.1 build 630 and am trying to make test scripts for a pile of pages in a package I'm workin on. If I pass in an -httpd path that has spaces in the path, it fails. use ExtUtils::MakeMaker; use Apache::TestMM qw(test clean); push @ARGV, '-httpd', 'C:\Program Files\Apache Group\Apache\Apache.exe'; [ .. ] Is this an Apache::Test problem, or possible an nmake issue? This case should be handled I'd think on the Apache::Test side. Does my $exe = 'C:\Program Files\Apache Group\Apache\Apache.exe'; $exe = Win32::GetShortPathName($exe); push @ARGV, '-httpd', $exe; work? If so, I'll look at seeing where this could be added within Apache::Test. This patch should probably take care of it. It's untested. Thanks, Stas - it looks good (applied manually, and informally tested, as I don't have Perl in a place with spaces in the directory name). A couple of comments below: Index: lib/Apache/TestConfig.pm === RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestConfig.pm,v retrieving revision 1.205 diff -u -r1.205 TestConfig.pm --- lib/Apache/TestConfig.pm 18 Feb 2004 00:30:57 - 1.205 +++ lib/Apache/TestConfig.pm 18 Feb 2004 04:40:21 - @@ -67,6 +67,16 @@ (map { $_ . '_module_name', $_ module name} qw(cgi ssl thread access auth)), ); +my %filepath_conf_opts = map { $_ = 1 } +qw(top_dir t_dir t_conf t_logs t_conf_file src_dir serverroot + documentroot bindir sbindir httpd apxs httpd_conf perlpod sslca + libmodperl); + +sub conf_opt_is_a_filepath { +my $opt = shift; +$opt exists $filepath_conf_opts{$opt}; +} + sub usage { for my $hash (\%Usage) { for (sort keys %$hash){ Index: lib/Apache/TestRun.pm === RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestRun.pm,v retrieving revision 1.149 diff -u -r1.149 TestRun.pm --- lib/Apache/TestRun.pm 18 Feb 2004 04:09:08 - 1.149 +++ lib/Apache/TestRun.pm 18 Feb 2004 04:40:21 - @@ -238,6 +238,15 @@ push @argv, $val; } +# fixup the filepath options on win32 (spaces, short names, etc.) +if (Apache::TestConfig::WIN32) { +require Win32::GetShortPathName; The require isn't required, as Win32::GetShortPathName is a core function. +for my $key (keys %conf_opts) { +next unless Apache::TestConfig::conf_opt_is_a_filepath($key); +$conf_opts{$key} = Win32::GetShortPathName($conf_opts{$key}); ^^^ I think if one calls Win32::GetShortPathName on something that has no short path name, then nothing is returned. For example, == use strict; use warnings; for ('C:\Program Files', 'C:\ProgramFiles') { my $x = Win32::GetShortPathName($_); if ($x) { print $_ has a short name of $x\n; } else { print $_ has no short name\n; } } === prints === C:\Program Files has a short name of C:\PROGRA~1 C:\ProgramFiles has no short name Thus, the above should probably include +for my $key (keys %conf_opts) { +next unless Apache::TestConfig::conf_opt_is_a_filepath($key); + + next unless $conf_opts{$key} =~ / /; +$conf_opts{$key} = Win32::GetShortPathName($conf_opts{$key}); -- best regards, randy
Re: Apache::TestMM::generate_script vs. Win32 Paths
Randy Kobes wrote: Thanks for testing, Randy +for my $key (keys %conf_opts) { +next unless Apache::TestConfig::conf_opt_is_a_filepath($key); +$conf_opts{$key} = Win32::GetShortPathName($conf_opts{$key}); ^^^ I think if one calls Win32::GetShortPathName on something that has no short path name, then nothing is returned. For example, == use strict; use warnings; for ('C:\Program Files', 'C:\ProgramFiles') { my $x = Win32::GetShortPathName($_); if ($x) { print $_ has a short name of $x\n; } else { print $_ has no short name\n; } } === prints === C:\Program Files has a short name of C:\PROGRA~1 C:\ProgramFiles has no short name Thus, the above should probably include +for my $key (keys %conf_opts) { +next unless Apache::TestConfig::conf_opt_is_a_filepath($key); + + next unless $conf_opts{$key} =~ / /; +$conf_opts{$key} = Win32::GetShortPathName($conf_opts{$key}); ay, that's so incredibly place your favorite swear word here. there is no a core function that will take any given path and return a usable path? do you need to run this transform only if /\s/? What about long names (8.3), don't they have short names too? For god's sake, can someone patch File::Spec to handle that win32 ridicule? Just think how much time every project wastes to deal with the same issues, again and again if they need to work with win32... not talking about making the source code cluttered with unneeded noise. that's just disgusting. Shouldn't canonfile() know how to deal with this GetShortPathName thingy? /of course none of these flattering comments are directed at Randy and other brave and helpful folks ;)/ __ Stas BekmanJAm_pH -- Just Another mod_perl Hacker http://stason.org/ mod_perl Guide --- http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com
Re: Apache::TestMM::generate_script vs. Win32 Paths
Randy Kobes wrote: On Wed, 18 Feb 2004, Stas Bekman wrote: Randy Kobes wrote: Thanks for testing, Randy +for my $key (keys %conf_opts) { +next unless Apache::TestConfig::conf_opt_is_a_filepath($key); +$conf_opts{$key} = Win32::GetShortPathName($conf_opts{$key}); [ ... ] ay, that's so incredibly place your favorite swear word here. there is no a core function that will take any given path and return a usable path? do you need to run this transform only if /\s/? What about long names (8.3), don't they have short names too? Yes, they do have short names. And it is a pain ... I should have expanded - Win32::GetShortPathName() will return a usable path if the file/directory physically exists - if a conversion to 8.3 components is needed, then that is done, otherwise, the original is returned. However, at this stage I don't think (?) we can assume the file/directory yet exists, at least for all the ones that this is being applied to, so calling Win32::GetShortPathName on them will cause the given values to be lost if they don't yet exist. Why not? All these arguments should be existing. (I think sans -libmodperl which may not exist) So, actually, I take that back about applying Win32::GetSHortPathName($f) only if $f =~ /\s/, as that was a red herring - doing it like for my $key (keys %conf_opts) { next unless Apache::TestConfig::conf_opt_is_a_filepath($key); next unless -e $conf_opts{$key}; $conf_opts{$key} = Win32::GetShortPathName($conf_opts{$key}); should be OK when the entry (physically) exists, whether that's a short or long name, and if it doesn't exist, presumably it will either be created or tested for later. One might have to do a Win32::GetShortPathName() if such an entry does get created later on, but we could wait and see. cool. In any case, please take the ownership of the patch I posted and once you guys are happy with it, please go ahead and commit it. Otherwise it's a broken phone. Thanks. For god's sake, can someone patch File::Spec to handle that win32 ridicule? Just think how much time every project wastes to deal with the same issues, again and again if they need to work with win32... not talking about making the source code cluttered with unneeded noise. that's just disgusting. Shouldn't canonfile() know how to deal with this GetShortPathName thingy? I guess it could, but that would involve somewhat of a departure from the philosophy of File::Spec. File::Spec can handle any combination of files/directories, whether or not they actually exist on the system, whereas things like Win32::GetShortPathName() only makes sense for files/directories that physically exist. So incorporating the short path name stuff in File::Spec would lead to a branch in what gets returned, depending on whether or not the entry physically exists. before you implement this ;) what would you expect canonfile to do under win32? is GetShortPathName is the thing you'd expect? As it will always work? BTW, does it make sure that two similar long names will never collapse into one short name? Meaning that the short name is not deterministic but depends on other the existence of other files with similar names? If it was deterministic, you could go and create the non-existing file, get its short name and delete the file, no? __ Stas BekmanJAm_pH -- Just Another mod_perl Hacker http://stason.org/ mod_perl Guide --- http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com
Re: Apache::TestMM::generate_script vs. Win32 Paths
On Tue, 3 Feb 2004, Christopher H. Laco wrote: I've installed Apache::Test 1.07 on ActiveState perl 5.6.1 build 630 and am trying to make test scripts for a pile of pages in a package I'm workin on. If I pass in an -httpd path that has spaces in the path, it fails. use ExtUtils::MakeMaker; use Apache::TestMM qw(test clean); push @ARGV, '-httpd', 'C:\Program Files\Apache Group\Apache\Apache.exe'; [ .. ] Is this an Apache::Test problem, or possible an nmake issue? This case should be handled I'd think on the Apache::Test side. Does my $exe = 'C:\Program Files\Apache Group\Apache\Apache.exe'; $exe = Win32::GetShortPathName($exe); push @ARGV, '-httpd', $exe; work? If so, I'll look at seeing where this could be added within Apache::Test. -- best regards, randy kobes
Re: Apache::TestMM::generate_script vs. Win32 Paths
This case should be handled I'd think on the Apache::Test side. Does my $exe = 'C:\Program Files\Apache Group\Apache\Apache.exe'; $exe = Win32::GetShortPathName($exe); push @ARGV, '-httpd', $exe; work? If so, I'll look at seeing where this could be added within Apache::Test. -- best regards, randy kobes That fixes the problem. I guess the same would need to be applied to the -d and -f parameters passed to apache in the event that the test and config directories are also in directory with spaces in the names. Thanks, -=Chris _ Find high-speed net deals comparison-shop your local providers here. https://broadband.msn.com
Re: Apache::TestMM::generate_script vs. Win32 Paths
And just for the curious person in me, calling: Win32::GetShortPathName( Win32::GetShortPathName( $path_to_exe ) ); yields the same result as Win32::GetShortPathName( $path_to_exe ); So no worries about adding this to my Makefile.PL AND having Apache::Test possibly call it again further down the process in the event someone doesn't want to check $Apache::Test::VERSION. :-) -=Chris _ Let the new MSN Premium Internet Software make the most of your high-speed experience. http://join.msn.com/?pgmarket=en-uspage=byoa/premST=1