On Feb 7, 4:32 am, [EMAIL PROTECTED] (Craig A. Berry) wrote:
> Your approach makes sense, but I think the intention and documentation would 
> need to be clarified.  Basically we're saying $no_file really means 
> $the_whole_thing_consists_only_of_directory_components even on systems where 
> you can usually (when not supporting a foreign syntax) tell the difference 
> between directories and files at a glance.

Thanks for the comments.  Potential patch below.

When adding test cases for splitpath('d1/d2/d3',1) and splitpath('/d1/
d2/d3',1) I discovered vmsify (used within splitpath) returns
[.d1.d2]d3 and d1:[d2]d3 so I catch this in a basic way (see below).
I also added some tests for dirs and files named "0" as I've been
bitten by this before, this uncovered I needed to check the dir
component is defined and not just true.
While I was adding splitpath tests I also added some tests for '[]',
'[-]', '[]file' and '[-]file'.

I'm not sure what behaviour to implement and add tests for when:

splitpath('[.d1]file',1)

is called, currently because $no_file is not used this returns
dir=[.d1] and file=file, but with the patch below this behaviour would
change to return dir=[.d1.file] and empty file.  I'm thinking it would
be safer to preserve current behaviour.  I think the question boils
down to if $no_file=1 is passed in and the path is in VMS syntax and
we can differentiate the $dir and $file components should we:
  i.) return dir=dir file=file (current behaviour)
  j.) return dir=dir+file file=empty (this patch behaviour)
  k.) return dir=dir file=empty
  l.) return something else

I then think, what about:

splitpath('[.d1]d2.dir',1)*

Depending on what behaviour is implemented for splitpath('[.d1]file',
1) I'm thinking this might be an exception, hmm, and then there is
ODS-5 to think about,  it's going to be simpler to use (and implement
and doc) if $no_file=1 over-rides / has higher precedence than the
path being in VMS syntax and being able to differentiate dir and file
components.

Cheers,
Peter (Stig) Edwards

* this patch also returns dir='[.d1.file.txt]' file=empty for
splitpath('[.d1]file.txt',1) and splitpath('d1/file.txt',1), maybe the
code should only do this when the path contains a file component that
could also be a valid directory (no periods).

==== pathtools-3_27/lib/file/spec/vms.pm#1 -
pathtools-3_27.lib.file.spec]vms.pm ====
245c245,251
< Splits using VMS syntax.
---
>     ($volume,$directories,$file) = File::Spec->splitpath( $path );
>     ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
>
> Splits a path into volume, directory, and filename portions.
>
> On VMS, assumes that the last part of the path is a filename unless
> $no_file is true.
250,254c256,272
<     my($self,$path) = @_;
<     my($dev,$dir,$file) = ('','','');
<
<     vmsify($path) =~ /(.+:)?([\[<].*[\]>])?(.*)/s;
<     return ($1 || '',$2 || '',$3);
---
>     my($self,$path, $nofile) = @_;
>     my($dev,$dir,$file)      = ('','','');
>     my $vmsify_path          = vmsify($path);
>     if ( $nofile ){
>         #vmsify('d1/d2/d3') returns '[.d1.d2]d3'
>         #vmsify('/d1/d2/d3') returns 'd1:[d2]d3'
>         if( $vmsify_path =~ /(.*)\](.+)/ ){
>             $vmsify_path = $1.'.'.$2.']';
>         }
>         $vmsify_path =~ /(.+:)?(.*)/s;
>         $dir = defined $2 ? $2 : ''; # dir can be '0'
>         return ($1 || '',$dir,$file);
>     }
>     else {
>         $vmsify_path =~ /(.+:)?([\[<].*[\]>])?(.*)/s;
>         return ($1 || '',$2 || '',$3);
>     }
==== pathtools-3_27/t/spec.t#1 - pathtools-3_27.t]spec.t ====
311a312,349
> [ "VMS->splitpath('[]')",                                         ',[],'      
>                                  ],
> [ "VMS->splitpath('[-]')",                                        ',[-],'     
>                                  ],
> [ "VMS->splitpath('[]file')",                                     ',[],file'  
>                                  ],
> [ "VMS->splitpath('[-]file')",                                    ',[-],file' 
>                                  ],
> [ "VMS->splitpath('')",                                           ',,'        
>                                  ],
> [ "VMS->splitpath('0')",                                          ',,0'       
>                                  ],
> [ "VMS->splitpath('[0]')",                                        ',[0],'     
>                                  ],
> [ "VMS->splitpath('[.0]')",                                       ',[.0],'    
>                                  ],
> [ "VMS->splitpath('[0.0.0]')",                                    ',[0.0.0],' 
>                                  ],
> [ "VMS->splitpath('[.0.0.0]')",                                   
> ',[.0.0.0],'                                 ],
> [ "VMS->splitpath('[0]0')",                                       ',[0],0'    
>                                  ],
> [ "VMS->splitpath('[0.0.0]0')",                                   
> ',[0.0.0],0'                                 ],
> [ "VMS->splitpath('[.0.0.0]0')",                                  
> ',[.0.0.0],0'                                ],
> [ "VMS->splitpath('0/0')",                                        ',[.0],0'   
>                                  ],
> [ "VMS->splitpath('0/0/0')",                                      ',[.0.0],0' 
>                                  ],
> [ "VMS->splitpath('/0/0')",                                       
> '0:,[000000],0'                              ],
> [ "VMS->splitpath('/0/0/0')",                                     '0:,[0],0'  
>                                  ],
> [ "VMS->splitpath('d1',1)",                                       ',d1,'      
>                                  ],
> # $no_file tests
> [ "VMS->splitpath('[d1.d2.d3]',1)",                               
> ',[d1.d2.d3],'                               ],
> [ "VMS->splitpath('[.d1.d2.d3]',1)",                              
> ',[.d1.d2.d3],'                              ],
> [ "VMS->splitpath('d1/d2/d3',1)",                                 
> ',[.d1.d2.d3],'                              ],
> [ "VMS->splitpath('/d1/d2/d3',1)",                                
> 'd1:,[d2.d3],'                               ],
> [ "VMS->splitpath('node::volume:[d1.d2.d3]',1)",                  
> 'node::volume:,[d1.d2.d3],'                  ],
> [ "VMS->splitpath('node\"access_spec\"::volume:[d1.d2.d3]',1)",   
> 'node"access_spec"::volume:,[d1.d2.d3],'     ],
> [ "VMS->splitpath('[]',1)",                                       ',[],'      
>                                  ],
> [ "VMS->splitpath('[-]',1)",                                      ',[-],'     
>                                  ],
> [ "VMS->splitpath('',1)",                                         ',,'        
>                                  ],
> [ "VMS->splitpath('0',1)",                                        ',0,'       
>                                  ],
> [ "VMS->splitpath('[0]',1)",                                      ',[0],'     
>                                  ],
> [ "VMS->splitpath('[.0]',1)",                                     ',[.0],'    
>                                  ],
> [ "VMS->splitpath('[0.0.0]',1)",                                  ',[0.0.0],' 
>                                  ],
> [ "VMS->splitpath('[.0.0.0]',1)",                                 
> ',[.0.0.0],'                                 ],
> [ "VMS->splitpath('0/0',1)",                                      ',[.0.0],'  
>                                  ],
> [ "VMS->splitpath('0/0/0',1)",                                    
> ',[.0.0.0],'                                 ],
> [ "VMS->splitpath('/0/0',1)",                                     
> '0:,[000000.0],'                             ],
> [ "VMS->splitpath('/0/0/0',1)",                                   '0:,[0.0],' 
>                                  ],
>

Reply via email to