On Monday 26 June 2017 01:42 PM, Alistair Grant wrote:
1. Path's are canonicalised during initial creation, but are not when
extending the path, i.e. sending #/

E.g.

'/dev/shm/d1/d2/../t1.txt' asFileReference  " File @ /dev/shm/d1/t1.txt"

'/dev/shm/d1/' asFileReference / 'd2/../t1.txt'  " File @ 
/dev/shm/d1/d2/../t1.txt"

Automatic canonicalisation is problematic as the code doesn't handle
symbolic links in the path name:

('/dev/shm/d1/' asFileReference / 's3/../t2.txt') exists  " true (correct 
answer)"

'/dev/shm/d1/s3/../t2.txt' asFileReference exists  " false (wrong answer)"

The meaning of 's3/..' is ambiguous when s3 is a symlink. Should 's3' be resolved or not before #parent op is applied? Disambiguation depends on context, so early canonicalization is a bug.

My own preference is to not to canonicalize at all and 's3/..' should be left as {s3, ..}. See

  http://man7.org/linux/man-pages/man7/path_resolution.7.html

2. In an attempt to be completely general, the argument to #/ is assumed
to be a single directory / file.  This is incorrect as the path
delimiter is not allowed to be part of the file name.  The result is
that path comparisons and operations such as #parent give unexpected
results.

Path class>>from:delimiter has a bug. It attempts to canonicalize elements parsed from the String regardless of the context. If the code is changed to:

 pathClass withAll: (aDelimiterCharacter split: aString)

your test will pass.

I wonder why Path was subclassed from Object and not from SequenceableCollection?

My PR modified FileSystem so that:

1. Canonicalisation is separated out as an operation that has to be
manually requested:

'/dev/shm/d1/d2/../t1.txt' asFileReference  " File @ /dev/shm/d1/d2/../t1.txt"

'/dev/shm/d1/d2/../t1.txt' asFileReference canonicalize  " File @ 
/dev/shm/d1/t1.txt"

I am ok with this.

2. The argument to #/ can be either a single file / directory name or a
path.

('/dev/shm/d1/' asFileReference / 'd2/d3/t3.txt') parent  " File @ 
/dev/shm/d1/d2/d3"

ok with this too.

3. Adds unit tests to cover the changed behaviour.
...
Before I submit the patch, does anyone have any strong objections to the
changes as described above?

None from my side.

Regards .. Subbu

Reply via email to