On 29 March 2017 at 14:02, Alistair Grant <akgrant0...@gmail.com> wrote:

> Except that ".." is treated as a special case at the moment in
> Path class>>addParentElementTo:, which is why #resolve: does the right
> thing (well, at least in my opinion :-)).
>

Well, not according to shell commands :
ls ./nonexistentdirectory/.. → cannot access, no such file or directory

So we have a divergence between FileSystem, where .. means "cancel the last
path segment, syntactically, without even checking the actual files and
directories" and the behavior of the shell command (and thus of the
underlying system call, I guess) which attempts to actually resolve each
segment and fails because it cannot go and look inside nonexistentdirectory
for the entry named '..'

This becomes important with symbolic links : try ls ./somesymlink/.. and
you'll see that you don't get the contents of $PWD but of the parent of the
symlink's destination.


> I'm having trouble understanding the Path class comments, however:
>
>     "#* and #/ are mnemonic to . and /
>     whose arguments should  be string file- or directory names, not
>     fragments of Unix path notation intended to be parsed."
>
> seems to imply that segments should not contain the delimiter (/), and
> the current implementation leaves the delimiter in the segment.
>

Yes. The point is, if you have an API that tries to be clever and guesses
what you meant (e.g. you could pass '../foo/bar' as a path element, it
might be convenient most of the time, but you lose control of what you
mean: the API, because it interprets the strings you pass, will make it
difficult or impossible to express some paths. For instance, on my current
filesystem, I can create a file named foo\bar. I'm guessing that's
impossible on Windows… It also leads to quoting, escaping, case sensitivity
and such problems (try writing shell scripts that are robust to file names
with spaces…)

The alternative is to have an API that does what you tell it to, no more,
no less. It should consider that if you pass a string with special
characters, you meant to have those characters in the result. Maybe that's
impossible on some filesystems, and raises an error, but the API will not
decide to do something different than you asked.



> >> On 29 Mar 2017, at 12:21, Alistair Grant <akgrant0...@gmail.com> wrote:
> >>
> >> Hi All,
> >>
> >> The current implementation of Path>>/, while functional, seems to me to
> >> create poorly formed paths, e.g.:
> >>
> >> ('/a/b/c/d' asFileReference / '../e') path ==> "Path / 'a' / 'b' / 'c'
> >> / 'd' / '../e'"
> >>
> >> As can be seen above, the last segment is '../e'.
> >>
> >> I would expect the result to be:
> >>
> >> "Path / 'a' / 'b' / 'c' / 'e'"
> >>
> >> Is there a reason for the current behaviour?  If not, are people open to
> >> modifying Path>>/ to produce the suggested result above (in Pharo 7)?
> >>
> >> The method below produces the modified result above and doesn't change
> >> the result of running all automated tests.  If this is going to be added
> >> to Pharo 7 I'll create an additional automated test to check that it is
> >> working properly.
> >>
> >> Cheers,
> >> Alistair
> >>
> >> 'From Pharo6.0 of 13 May 2016 [Latest update: #60451] on 29 March 2017
> >> at 9:40:41.681228 am'!
> >>
> >> !Path methodsFor: 'navigating' stamp: 'AlistairGrant 3/29/2017 09:39'!
> >> / aString
> >>    | path |
> >>
> >>    aString isEmptyOrNil
> >>        ifTrue: [ Error signal: 'Path element cannot be empty or nil'].
> >>
> >>    ^self resolve: (Path from: aString)
> >> ! !
>
>


-- 
Damien Pollet
type less, do more [ | ] http://people.untyped.org/damien.pollet

Reply via email to