0831e18372
Wrote nice pure transition calculator, and ugly code to stage its results into the git-annex branch. Also had to split up several Log modules that Annex.Branch needed to use, but that themselves used Annex.Branch. The transition calculator is limited to looking at and changing one file at a time. While this made the implementation relatively easy, it precludes transitions that do stuff like deleting old url log files for keys that are being removed because they are no longer present anywhere.
53 lines
1.8 KiB
Haskell
53 lines
1.8 KiB
Haskell
{- git-annex branch transitions
|
|
-
|
|
- Copyright 2013 Joey Hess <joey@kitenet.net>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
module Annex.Branch.Transitions (
|
|
FileTransition(..),
|
|
getTransitionCalculator
|
|
) where
|
|
|
|
import Logs
|
|
import Logs.Transitions
|
|
import Logs.UUIDBased as UUIDBased
|
|
import Logs.Presence.Pure as Presence
|
|
import Types.TrustLevel
|
|
import Types.UUID
|
|
|
|
import qualified Data.Map as M
|
|
|
|
data FileTransition
|
|
= ChangeFile String
|
|
| RemoveFile
|
|
| PreserveFile
|
|
|
|
type TransitionCalculator = FilePath -> String -> TrustMap -> FileTransition
|
|
|
|
getTransitionCalculator :: Transition -> Maybe TransitionCalculator
|
|
getTransitionCalculator ForgetGitHistory = Nothing
|
|
getTransitionCalculator ForgetDeadRemotes = Just dropDead
|
|
|
|
dropDead :: FilePath -> String -> TrustMap -> FileTransition
|
|
dropDead f content trustmap = case getLogVariety f of
|
|
Just UUIDBasedLog -> ChangeFile $
|
|
UUIDBased.showLog id $ dropDeadFromUUIDBasedLog trustmap $ UUIDBased.parseLog Just content
|
|
Just (PresenceLog _) ->
|
|
let newlog = Presence.compactLog $ dropDeadFromPresenceLog trustmap $ Presence.parseLog content
|
|
in if null newlog
|
|
then RemoveFile
|
|
else ChangeFile $ Presence.showLog newlog
|
|
Nothing -> PreserveFile
|
|
|
|
dropDeadFromUUIDBasedLog :: TrustMap -> UUIDBased.Log String -> UUIDBased.Log String
|
|
dropDeadFromUUIDBasedLog trustmap = M.filterWithKey $ notDead trustmap . const
|
|
|
|
{- Presence logs can contain UUIDs or other values. Any line that matches
|
|
- a dead uuid is dropped; any other values are passed through. -}
|
|
dropDeadFromPresenceLog :: TrustMap -> [Presence.LogLine] -> [Presence.LogLine]
|
|
dropDeadFromPresenceLog trustmap = filter $ notDead trustmap (toUUID . Presence.info)
|
|
|
|
notDead :: TrustMap -> (v -> UUID) -> v -> Bool
|
|
notDead trustmap a v = M.findWithDefault SemiTrusted (a v) trustmap /= DeadTrusted
|