Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Date: Mon, 6 May 2002 17:05:56 +0200 From: "Gerrit P. Haase" Reply-To: "Gerrit P. Haase" Organization: Esse keine toten Tiere X-Priority: 3 (Normal) Message-ID: <112356158649.20020506170556@familiehaase.de> To: cygwin AT cygwin DOT com, "Christopher Murray" Subject: Re: canonpath in perl as it relates to cygwin In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Christopher schrieb: > My question concerns the use of File::Spec->canonpath in perl (for cygwin). > I did a search of the relevant mailing list archives, as well as google > newsgroups, but did not seem to come across any hits that seem to discuss > this specific issue. > As it currently stands, canonpath will not strip out multiple occurrences > of // in file paths when the script is executed from within a cygwin shell. > The relevant line from /usr/lib/perl5/5.6.1/File/Spec/Unix.pm that strips > out multiple /'s is > $path =~ s|/+|/|g unless ($^O eq 'cygwin'); > I assume this regexp substitution is ignored for cygwin because we would > not want to munge instances where // refers to a network share (something > regular unix doesn't need to worry about), but is it wise to also ignore > all multiple forward slashes when they occur in the middle of a path? Or > is this simply a non-issue because, for the most part, it seems like most > (if not all?) programs don't really seem to care about multiple path > separators? > For what it's worth, canonpath in ExtUtils::MM_Unix (and MM_Cygwin), uses > $path =~ s|(?<=[^/])/+|/|g; > which seems to do what I expect (leaves // at the front of a path alone, > but replaces all remaining // with /). The only weakness I see with this > is that it will not replace ///shareName/path with //shareName/path, but > that is a minor matter, at least as it concerns me. > Any thoughts on this matter would be most appreciated. Perl 5.8: ========= sub canonpath { my ($self,$path) = @_; # Handle POSIX-style node names beginning with double slash my $node = ''; if ( $^O =~ m/^(?:qnx|nto)$/ && $path =~ s:^(//[^/]+)(/|\z):/:s ) { $node = $1; } # This used to be # $path =~ s|/+|/|g unless($^O eq 'cygwin'); # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail # (Mainly because trailing "" directories didn't get stripped). # Why would cygwin avoid collapsing multiple slashes into one? --jhi $path =~ s|/+|/|g; # xx////xx -> xx/xx $path =~ s@(/\.)+(/|\Z(?!\n))@/@g; # xx/././xx -> xx/xx $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx $path =~ s|^/(\.\./)+|/|s; # /../../xx -> xx $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx return "$node$path"; } Looks more sophisticated? Gerrit -- =^..^= -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Bug reporting: http://cygwin.com/bugs.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/