Proposal: System.FilePath: current directory should be ".", not ""

Simon Marlow marlowsd at gmail.com
Wed Nov 4 05:00:01 EST 2009


On 24/09/2009 18:20, Duncan Coutts wrote:

>> However, there are some oddities with the current proposal.  e.g.
>>
>>     splitFileName "./foo" == ("./", "foo")
>>     "./"</>  "foo" == "./foo"
>>
>> The current proposal just about hangs together because the tiny bit of
>> normalisation that</>  does exactly undoes the creation of "." in
>> splitFileName, and there's no other way that splitFileName can generate
>> ".".  That's a terribly fragile property.
>
> So if we take the first bit of your proposal and not the second we have:
>
>          splitFileName "foo" == ("./", "foo")
>          "./"</>  "foo" == "./foo"
>
> and thus we do not have:
>
> uncurry (</>) (splitFileName x) == x
>
> because we end up with "foo" an "./foo"
>
> However I think that's fine. The splitFileName function is asking for
> the directory part of a relative/incomplete filepath and expecting it to
> be a real directory. Thus we are interpreting the original filepath as a
> complete filepath that is relative to ".". So given that by applying
> splitFileName we are taking that interpretation it's ok to get back
> "./foo", because we in that context we really were interpreting "foo" as
> "./foo".

I've amended the patch as suggested above, it turned out to be not too 
hard.  A few places were using splitFileName internally, and that broke 
some properties, e.g.

-- > Valid x => replaceFileName x (takeFileName x) == x
replaceFileName :: FilePath -> String -> FilePath
replaceFileName x y = dropFileName x </> y

the property doesn't hold any more because dropFileName "foo" == "./". 
So I worked around cases like this with an internal version of 
splitFileName with the old semantics.  This isn't a big problem - it 
just means we get to keep some of these nice simple equality properties, 
which are arguably wrong anyway, and fewer "./" prefixes will show up to 
surprise users.

Neil's comprehensive test suite still passes with the new patch.

Ticket, with new patch attached:

   http://hackage.haskell.org/trac/ghc/ticket/2034

The discussion deadline has long passed, so I propose we have another 2 
weeks (18 November).

Cheers,
	Simon


More information about the Libraries mailing list