[darcs-users] [patch173] Work in progress: patch index

Jason Dagit bugs at darcs.net
Sat Aug 28 23:28:59 UTC 2010


Jason Dagit <no-reply at example.com> added the comment:

I started reviewing this (I'm also happy to finish it off if Benedikt is busy).

I noticed this comment in the code:
-- | The latest Patch that touches the file is always the first in the list
type TouchingMap = Map FileId (Set PatchId)

I was skeptical that (Set PatchId) would keep things sorted correctly in all cases.  I looked at how 
Set would be storing things:
-- | The PatchId identifies a patch and can be created from a PatchInfo with make_filename
type PatchId = String

So the sort order comes down to string sorting.  The next question is, how are the PatchIds created?  
The comment in other places say to use make_filename, which is now renamed to makeFilename:
-- This makes darcs-1 (non-hashed repos) filenames, and is also generally used in both in
-- hashed and non-hashed repo code for making patch "hashes"
makeFilename :: PatchInfo -> String
makeFilename pi =
    showIsoDateTime d++"-"++sha1_a++"-"++sha1PS sha1_me++".gz"
        where b2ps True = BC.pack "t"
              b2ps False = BC.pack "f"
              sha1_me = B.concat [_piName pi,
                                  _piAuthor pi,
                                  _piDate pi,
                                  B.concat $ _piLog pi,
                                  b2ps $ isInverted pi]
              d = readPatchDate $ _piDate pi
              sha1_a = take 5 $ sha1PS $ _piAuthor pi

The interesting and relevant bit is that the patchids start with an ISO Date/Time.

Because patches can commuted and stored in a different order than the order they are created in, the 
type of TouchingMap means sometimes it may be possible for the patch index will store touching files 
in the wrong order.

I'll see if I can come up with an example that would be wrong with (Set PatchId) and correct with 
[PatchId].  Of course, the "trivial" example is when patches that touch the same file are created at 
nearly the same time on different machines.  In that scenario, one machine could have clock that is 
behind the other.  If it the clocks were enough different you could imagine the patches being in the 
wrong order in the index.

__________________________________
Darcs bug tracker <bugs at darcs.net>
<http://bugs.darcs.net/patch173>
__________________________________


More information about the darcs-users mailing list