diff options
author | 2010-10-19 19:38:24 -0400 | |
---|---|---|
committer | 2010-10-19 19:38:24 -0400 | |
commit | c397e5a0f3a041a8cc5038c0f628a330b45fdcae (patch) | |
tree | f645b54215ef60c43220f4eec03d822a9db9bb07 /TypeInternals.hs | |
parent | 54db046c5ae2e7fce73fcd5ce4da278b5f8b445c (diff) | |
parent | 972639d85c663855dd0c7476b732dcb319efdb2e (diff) |
Merge branch 'master' of /home/joey/src/git-annex
Diffstat (limited to 'TypeInternals.hs')
-rw-r--r-- | TypeInternals.hs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/TypeInternals.hs b/TypeInternals.hs new file mode 100644 index 000000000..4a9d2653e --- /dev/null +++ b/TypeInternals.hs @@ -0,0 +1,72 @@ +{- git-annex internal data types + - + - Most things should not need this, using Types and/or Annex instead. + -} + +module TypeInternals where + +import Control.Monad.State (StateT) +import Data.String.Utils + +import qualified GitRepo as Git + +data Flag = + Force | -- command-line flags + RemotesRead -- indicates that remote repo configs have been read + deriving (Eq, Read, Show) + +-- git-annex's runtime state type doesn't really belong here, +-- but it uses Backend, so has to be here to avoid a depends loop. +data AnnexState = AnnexState { + repo :: Git.Repo, + backends :: [Backend], + supportedBackends :: [Backend], + flags :: [Flag] +} deriving (Show) + +-- git-annex's monad +type Annex = StateT AnnexState IO + +-- annexed filenames are mapped through a backend into keys +type KeyFrag = String +type BackendName = String +data Key = Key (BackendName, KeyFrag) deriving (Eq) + +-- show a key to convert it to a string; the string includes the +-- name of the backend to avoid collisions between key strings +instance Show Key where + show (Key (b, k)) = b ++ ":" ++ k + +instance Read Key where + readsPrec _ s = [((Key (b,k)) ,"")] + where + l = split ":" s + b = l !! 0 + k = join ":" $ drop 1 l + +-- pulls the backend name out +backendName :: Key -> BackendName +backendName (Key (b,k)) = b + +-- pulls the key fragment out +keyFrag :: Key -> KeyFrag +keyFrag (Key (b,k)) = k + +-- this structure represents a key-value backend +data Backend = Backend { + -- name of this backend + name :: String, + -- converts a filename to a key + getKey :: FilePath -> Annex (Maybe Key), + -- stores a file's contents to a key + storeFileKey :: FilePath -> Key -> Annex Bool, + -- retrieves a key's contents to a file + retrieveKeyFile :: Key -> FilePath -> Annex Bool, + -- removes a key + removeKey :: Key -> Annex Bool, + -- checks if a backend is storing the content of a key + hasKey :: Key -> Annex Bool +} + +instance Show Backend where + show backend = "Backend { name =\"" ++ (name backend) ++ "\" }" |