This commit is contained in:
Joey Hess 2010-10-10 18:05:37 -04:00
parent dce9c2e080
commit e5514e0cb0
12 changed files with 101 additions and 36 deletions

View file

@ -8,6 +8,7 @@ import System.Directory
import GitRepo
import Utility
import Locations
import Types
import Backend
{- Annexes a file, storing it in a backend, and then moving it into

View file

@ -22,19 +22,7 @@ import System.Directory
import Locations
import GitRepo
import Utility
type Key = String
data Backend = Backend {
-- name of this backend
name :: String,
-- converts a filename to a key
getKey :: GitRepo -> FilePath -> IO (Maybe Key),
-- stores a file's contents to a key
storeFileKey :: GitRepo -> FilePath -> Key -> IO (Bool),
-- retrieves a key's contents to a file
retrieveKeyFile :: IO Key -> FilePath -> IO (Bool)
}
import Types
instance Show Backend where
show backend = "Backend { name =\"" ++ (name backend) ++ "\" }"

View file

@ -3,8 +3,7 @@
module BackendChecksum (backend) where
import Backend
import GitRepo
import Types
import qualified BackendFile
import Data.Digest.Pure.SHA

View file

@ -3,8 +3,7 @@
module BackendFile (backend) where
import Backend
import GitRepo
import Types
backend = Backend {
name = "file",

14
BackendList.hs Normal file
View file

@ -0,0 +1,14 @@
{- git-annex backend list
- -}
module BackendList where
-- When adding a new backend, import it here and add it to the list.
import qualified BackendFile
import qualified BackendChecksum
import qualified BackendUrl
supportedBackends =
[ BackendFile.backend
, BackendChecksum.backend
, BackendUrl.backend
]

View file

@ -3,8 +3,7 @@
module BackendUrl (backend) where
import Backend
import GitRepo
import Types
backend = Backend {
name = "url",

41
CmdLine.hs Normal file
View file

@ -0,0 +1,41 @@
{- git-annex command line
-
- TODO: This is very rough and stupid; I would like to use
- System.Console.CmdArgs.Implicit but it is not yet packaged in Debian.
-}
module CmdLine where
import System.Console.GetOpt
import Types
import Annex
data Flag = Add FilePath | Push String | Pull String |
Want FilePath | Get (Maybe FilePath) | Drop FilePath
deriving Show
options :: [OptDescr Flag]
options =
[ Option ['a'] ["add"] (ReqArg Add "FILE") "add file to annex"
, Option ['p'] ["push"] (ReqArg Push "REPO") "push annex to repo"
, Option ['P'] ["pull"] (ReqArg Pull "REPO") "pull annex from repo"
, Option ['w'] ["want"] (ReqArg Want "FILE") "request file contents"
, Option ['g'] ["get"] (OptArg Get "FILE") "transfer file contents"
, Option ['d'] ["drop"] (ReqArg Drop "FILE") "indicate file content not needed"
]
argvToFlags argv = do
case getOpt Permute options argv of
-- no options? add listed files
([],p,[] ) -> return $ map (\f -> Add f) p
-- all options parsed, return flags
(o,[],[] ) -> return o
-- error case
(_,n,errs) -> ioError (userError (concat errs ++ usageInfo header options))
where header = "Usage: git-annex [option] file"
dispatch :: Flag -> [Backend] -> GitRepo -> IO ()
dispatch flag backends repo = do
case (flag) of
Add f -> annexFile backends repo f
_ -> error "not implemented"

View file

@ -7,17 +7,18 @@ import System.Directory
import System.Path
import Data.String.Utils
import Utility
data GitRepo = GitRepo {
top :: FilePath,
remotes :: [GitRepo]
} deriving (Eq, Show, Read)
import Types
import BackendList
{- GitRepo constructor -}
gitRepo :: FilePath -> IO GitRepo
gitRepo dir = do
-- TOOD query repo for configuration settings; other repositories; etc
return GitRepo { top = dir, remotes = [] }
return GitRepo {
top = dir,
remotes = [],
backends = supportedBackends
}
{- Path to a repository's gitattributes file. -}
gitAttributes :: GitRepo -> IO String

View file

@ -26,6 +26,7 @@ import Data.Char
import GitRepo
import Utility
import Locations
import Types
data LogStatus = FilePresent | FileMissing | Undefined
deriving (Eq)

View file

@ -3,10 +3,11 @@
module Locations where
import Types
import GitRepo
{- An annexed file's content is stored somewhere under .git/annex/ -}
annexDir :: GitRepo -> String -> IO FilePath
annexDir :: GitRepo -> Key -> IO FilePath
annexDir repo key = do
dir <- gitDir repo
return $ dir ++ "/annex/" ++ key

24
Types.hs Normal file
View file

@ -0,0 +1,24 @@
{- git-annex data types
- -}
module Types where
type Key = String
data Backend = Backend {
-- name of this backend
name :: String,
-- converts a filename to a key
getKey :: GitRepo -> FilePath -> IO (Maybe Key),
-- stores a file's contents to a key
storeFileKey :: GitRepo -> FilePath -> Key -> IO (Bool),
-- retrieves a key's contents to a file
retrieveKeyFile :: IO Key -> FilePath -> IO (Bool)
}
data GitRepo = GitRepo {
top :: FilePath,
remotes :: [GitRepo],
backends :: [Backend]
}

View file

@ -1,20 +1,17 @@
{- git-annex main program
- -}
import LocationLog
import System.Environment
import GitRepo
import Backend
import CmdLine
import Annex
-- When adding a new backend, import it here and add it to the backends list.
import qualified BackendFile
import qualified BackendChecksum
import qualified BackendUrl
backends = [BackendFile.backend, BackendChecksum.backend, BackendUrl.backend]
import BackendList
main = do
args <- getArgs
flags <- argvToFlags args
repo <- currentRepo
gitPrep repo
l <- readLog "demo.log"
writeLog "demo2.log" $ compactLog l
mapM (\f -> dispatch f supportedBackends repo) flags