add VerifiedCopy data type

There should be no behavior changes in this commit, it just adds a more
expressive data type and adjusts code that had been passing around a [UUID]
or sometimes a Maybe Remote to instead use [VerifiedCopy].

Although, since some functions were taking two different [UUID] lists,
there's some potential for me to have gotten it horribly wrong.
This commit is contained in:
Joey Hess 2015-10-08 16:55:11 -04:00
parent b1abe59193
commit 90f7c4b6a2
Failed to extract signature
16 changed files with 107 additions and 60 deletions

View file

@ -1,4 +1,4 @@
{- git-annex numcopies type
{- git-annex numcopies types
-
- Copyright 2014 Joey Hess <id@joeyh.name>
-
@ -7,8 +7,48 @@
module Types.NumCopies where
import Types.UUID
import qualified Data.Map as M
newtype NumCopies = NumCopies Int
deriving (Ord, Eq)
fromNumCopies :: NumCopies -> Int
fromNumCopies (NumCopies n) = n
data VerifiedCopy
{- Use when a repository cannot be accessed, but it's
- a trusted repository, which is presumably not going to
- lose a copy. This is the weakest level of verification. -}
= TrustedCopy UUID
{- Represents a recent verification that a copy of an
- object exists in a repository with the given UUID. -}
| VerifiedCopy UUID
{- The strongest proof of the existence of a copy.
- Until its associated action is called to unlock it,
- the copy is locked in the repository and is guaranteed
- not to be dropped by any git-annex process. -}
| VerifiedCopyLock UUID (IO ())
instance ToUUID VerifiedCopy where
toUUID (VerifiedCopy u) = u
toUUID (VerifiedCopyLock u _) = u
toUUID (TrustedCopy u) = u
instance Show VerifiedCopy where
show (TrustedCopy u) = "TrustedCopy " ++ show u
show (VerifiedCopy u) = "VerifiedCopy " ++ show u
show (VerifiedCopyLock u _) = "VerifiedCopyLock " ++ show u
strongestVerifiedCopy :: VerifiedCopy -> VerifiedCopy -> VerifiedCopy
strongestVerifiedCopy a@(VerifiedCopyLock _ _) _ = a
strongestVerifiedCopy _ b@(VerifiedCopyLock _ _) = b
strongestVerifiedCopy a@(VerifiedCopy _) _ = a
strongestVerifiedCopy _ b@(VerifiedCopy _) = b
strongestVerifiedCopy a@(TrustedCopy _) _ = a
-- Retains stronger verifications over weaker for the same uuid.
deDupVerifiedCopies :: [VerifiedCopy] -> [VerifiedCopy]
deDupVerifiedCopies l = M.elems $
M.fromListWith strongestVerifiedCopy (zip (map toUUID l) l)