inconsistent FileReference

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

inconsistent FileReference

Peter Uhnak
Imagine that you have

'/tmp/a/b' folder containing 'c' file

'/tmp/a/b' asFileReference ensureCreateDirectory.
'/tmp/a/b/c' asFileReference writeStreamDo: [ :s | s nextPutAll: 'contents' ].

now there are three ways how you can see the contents of the c file

x := '/tmp/a/b/c.txt' asFileReference.
y := '/tmp' asFileReference /  'a' / 'b' / 'c.txt'.
z := '/tmp' asFileReference / 'a/b/c.txt'.

They clearly all point to the same file:

x contents = y contents "true"
x contents = z contents "true"

Yet the last option is different

x = y "true"
x = z "false"

Why is that? Because the parent is different:

x parent pathString "'/tmp/a/b'"
y parent pathString "'/tmp/a/b'"
z parent pathString "'/tmp'"

So the parent is based on how the reference was constructed, not what it is actually pointing to, which is stupid.

Is this a bug? Is this a (nasty) expected behavior?

Peter
Reply | Threaded
Open this post in threaded view
|

Re: inconsistent FileReference

EstebanLM
it is not inconsistent, last option is incorrect and should not be used.

what you do there is to declare: directory ‘tmp', file ‘a/b/c.txt’
is casual that it coincides with a real path, but it is not semantically correct, that’s why x ~= z  

there was an issue around to explicitly forbid to declare a file like that, but I was (and still am) not sure it should be forbidden… is not the spirit of smalltalk… you know, great power/great responsibility thing :)

but it causes confusions (as this one), so at least needs to be correctly explained somewhere :)

cheers,
Esteban

> On 09 Jul 2016, at 13:11, Peter Uhnák <[hidden email]> wrote:
>
> Imagine that you have
>
> '/tmp/a/b' folder containing 'c' file
>
> '/tmp/a/b' asFileReference ensureCreateDirectory.
> '/tmp/a/b/c' asFileReference writeStreamDo: [ :s | s nextPutAll: 'contents' ].
>
> now there are three ways how you can see the contents of the c file
>
> x := '/tmp/a/b/c.txt' asFileReference.
> y := '/tmp' asFileReference /  'a' / 'b' / 'c.txt'.
> z := '/tmp' asFileReference / 'a/b/c.txt'.
>
> They clearly all point to the same file:
>
> x contents = y contents "true"
> x contents = z contents "true"
>
> Yet the last option is different
>
> x = y "true"
> x = z "false"
>
> Why is that? Because the parent is different:
>
> x parent pathString "'/tmp/a/b'"
> y parent pathString "'/tmp/a/b'"
> z parent pathString "'/tmp'"
>
> So the parent is based on how the reference was constructed, not what it is actually pointing to, which is stupid.
>
> Is this a bug? Is this a (nasty) expected behavior?
>
> Peter


Reply | Threaded
Open this post in threaded view
|

Re: inconsistent FileReference

Sven Van Caekenberghe-2

> On 09 Jul 2016, at 15:31, Esteban Lorenzano <[hidden email]> wrote:
>
> it is not inconsistent, last option is incorrect and should not be used.

yes - I believe as well that we discussed this some time ago ...

> what you do there is to declare: directory ‘tmp', file ‘a/b/c.txt’
> is casual that it coincides with a real path, but it is not semantically correct, that’s why x ~= z  
>
> there was an issue around to explicitly forbid to declare a file like that, but I was (and still am) not sure it should be forbidden… is not the spirit of smalltalk… you know, great power/great responsibility thing :)
>
> but it causes confusions (as this one), so at least needs to be correctly explained somewhere :)
>
> cheers,
> Esteban
>
>> On 09 Jul 2016, at 13:11, Peter Uhnák <[hidden email]> wrote:
>>
>> Imagine that you have
>>
>> '/tmp/a/b' folder containing 'c' file
>>
>> '/tmp/a/b' asFileReference ensureCreateDirectory.
>> '/tmp/a/b/c' asFileReference writeStreamDo: [ :s | s nextPutAll: 'contents' ].
>>
>> now there are three ways how you can see the contents of the c file
>>
>> x := '/tmp/a/b/c.txt' asFileReference.
>> y := '/tmp' asFileReference /  'a' / 'b' / 'c.txt'.
>> z := '/tmp' asFileReference / 'a/b/c.txt'.
>>
>> They clearly all point to the same file:
>>
>> x contents = y contents "true"
>> x contents = z contents "true"
>>
>> Yet the last option is different
>>
>> x = y "true"
>> x = z "false"
>>
>> Why is that? Because the parent is different:
>>
>> x parent pathString "'/tmp/a/b'"
>> y parent pathString "'/tmp/a/b'"
>> z parent pathString "'/tmp'"
>>
>> So the parent is based on how the reference was constructed, not what it is actually pointing to, which is stupid.
>>
>> Is this a bug? Is this a (nasty) expected behavior?
>>
>> Peter
>
>