add Remote.Directory
This commit is contained in:
parent
320a4102d6
commit
a47ed922e1
6 changed files with 126 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -13,3 +13,4 @@ html
|
||||||
.hpc
|
.hpc
|
||||||
Touch.hs
|
Touch.hs
|
||||||
StatFS.hs
|
StatFS.hs
|
||||||
|
Remote/S3.hs
|
||||||
|
|
|
@ -46,11 +46,13 @@ import Config
|
||||||
|
|
||||||
import qualified Remote.Git
|
import qualified Remote.Git
|
||||||
import qualified Remote.S3
|
import qualified Remote.S3
|
||||||
|
import qualified Remote.Directory
|
||||||
|
|
||||||
remoteTypes :: [RemoteType Annex]
|
remoteTypes :: [RemoteType Annex]
|
||||||
remoteTypes =
|
remoteTypes =
|
||||||
[ Remote.Git.remote
|
[ Remote.Git.remote
|
||||||
, Remote.S3.remote
|
, Remote.S3.remote
|
||||||
|
, Remote.Directory.remote
|
||||||
]
|
]
|
||||||
|
|
||||||
{- Builds a list of all available Remotes.
|
{- Builds a list of all available Remotes.
|
||||||
|
|
110
Remote/Directory.hs
Normal file
110
Remote/Directory.hs
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
{- A "remote" that is just a local directory.
|
||||||
|
-
|
||||||
|
- Copyright 2011 Joey Hess <joey@kitenet.net>
|
||||||
|
-
|
||||||
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
|
-}
|
||||||
|
|
||||||
|
module Remote.Directory (remote) where
|
||||||
|
|
||||||
|
import IO
|
||||||
|
import Control.Exception.Extensible (IOException)
|
||||||
|
import qualified Data.Map as M
|
||||||
|
import Data.Maybe
|
||||||
|
import Data.String.Utils
|
||||||
|
import Control.Monad (when)
|
||||||
|
import Control.Monad.State (liftIO)
|
||||||
|
import System.Directory (doesDirectoryExist, doesFileExist, removeFile)
|
||||||
|
import System.FilePath
|
||||||
|
|
||||||
|
import RemoteClass
|
||||||
|
import Types
|
||||||
|
import qualified GitRepo as Git
|
||||||
|
import qualified Annex
|
||||||
|
import UUID
|
||||||
|
import Config
|
||||||
|
import Utility
|
||||||
|
import Locations
|
||||||
|
import CopyFile
|
||||||
|
|
||||||
|
remote :: RemoteType Annex
|
||||||
|
remote = RemoteType {
|
||||||
|
typename = "directory",
|
||||||
|
enumerate = list,
|
||||||
|
generate = gen,
|
||||||
|
setup = dosetup
|
||||||
|
}
|
||||||
|
|
||||||
|
list :: Annex [Git.Repo]
|
||||||
|
list = do
|
||||||
|
g <- Annex.gitRepo
|
||||||
|
return $ findDirectoryRemotes g
|
||||||
|
|
||||||
|
findDirectoryRemotes :: Git.Repo -> [Git.Repo]
|
||||||
|
findDirectoryRemotes r = map construct remotepairs
|
||||||
|
where
|
||||||
|
remotepairs = M.toList $ filterremotes $ Git.configMap r
|
||||||
|
filterremotes = M.filterWithKey (\k _ -> directoryremote k)
|
||||||
|
construct (k,_) = Git.repoRemoteNameSet Git.repoFromUnknown k
|
||||||
|
directoryremote k = startswith "remote." k && endswith ".annex-directory" k
|
||||||
|
|
||||||
|
gen :: Git.Repo -> Maybe (M.Map String String) -> Annex (Remote Annex)
|
||||||
|
gen r c = do
|
||||||
|
u <- getUUID r
|
||||||
|
cst <- remoteCost r
|
||||||
|
return $ genRemote r u c cst
|
||||||
|
where
|
||||||
|
|
||||||
|
genRemote :: Git.Repo -> UUID -> Maybe (M.Map String String) -> Int -> Remote Annex
|
||||||
|
genRemote r u c cst = this
|
||||||
|
where
|
||||||
|
this = Remote {
|
||||||
|
uuid = u,
|
||||||
|
cost = cst,
|
||||||
|
name = Git.repoDescribe r,
|
||||||
|
storeKey = store this,
|
||||||
|
retrieveKeyFile = retrieve this,
|
||||||
|
removeKey = remove this,
|
||||||
|
hasKey = checkPresent this,
|
||||||
|
hasKeyCheap = True,
|
||||||
|
config = c
|
||||||
|
}
|
||||||
|
|
||||||
|
dosetup :: UUID -> M.Map String String -> Annex (M.Map String String)
|
||||||
|
dosetup u c = do
|
||||||
|
-- verify configuration is sane
|
||||||
|
let dir = case M.lookup "directory" c of
|
||||||
|
Nothing -> error "Specify directory="
|
||||||
|
Just d -> d
|
||||||
|
e <- liftIO $ doesDirectoryExist dir
|
||||||
|
when (not e) $ error $ "Directory does not exist: " ++ dir
|
||||||
|
|
||||||
|
g <- Annex.gitRepo
|
||||||
|
liftIO $ do
|
||||||
|
Git.run g "config" [Param (configsetting "annex-directory"), Param "true"]
|
||||||
|
Git.run g "config" [Param (configsetting "annex-uuid"), Param u]
|
||||||
|
return c
|
||||||
|
where
|
||||||
|
remotename = fromJust (M.lookup "name" c)
|
||||||
|
configsetting s = "remote." ++ remotename ++ "." ++ s
|
||||||
|
|
||||||
|
dirKey :: Remote Annex -> Key -> FilePath
|
||||||
|
dirKey r k = dir </> show k
|
||||||
|
where
|
||||||
|
dir = fromJust $ M.lookup "directory" $ fromJust $ config r
|
||||||
|
|
||||||
|
store :: Remote Annex -> Key -> Annex Bool
|
||||||
|
store r k = do
|
||||||
|
g <- Annex.gitRepo
|
||||||
|
liftIO $ copyFile (gitAnnexLocation g k) (dirKey r k)
|
||||||
|
|
||||||
|
retrieve :: Remote Annex -> Key -> FilePath -> Annex Bool
|
||||||
|
retrieve r k f = liftIO $ copyFile (dirKey r k) f
|
||||||
|
|
||||||
|
remove :: Remote Annex -> Key -> Annex Bool
|
||||||
|
remove r k = liftIO $ catch
|
||||||
|
(removeFile (dirKey r k) >> return True)
|
||||||
|
(const $ return False)
|
||||||
|
|
||||||
|
checkPresent :: Remote Annex -> Key -> Annex (Either IOException Bool)
|
||||||
|
checkPresent r k = liftIO $ try $ doesFileExist (dirKey r k)
|
2
debian/changelog
vendored
2
debian/changelog
vendored
|
@ -6,6 +6,8 @@ git-annex (0.20110329) UNRELEASED; urgency=low
|
||||||
as hS3 is not packaged.
|
as hS3 is not packaged.
|
||||||
* fsck: Ensure that files and directories in .git/annex/objects
|
* fsck: Ensure that files and directories in .git/annex/objects
|
||||||
have proper permissions.
|
have proper permissions.
|
||||||
|
* Added a special type of remote called a directory remote, which
|
||||||
|
simply stores files in an arbitrary local directory.
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Sat, 26 Mar 2011 14:36:16 -0400
|
-- Joey Hess <joeyh@debian.org> Sat, 26 Mar 2011 14:36:16 -0400
|
||||||
|
|
||||||
|
|
|
@ -7,3 +7,4 @@ types of remotes. These can be used just like any normal remote by git-annex.
|
||||||
They cannot be used by other git commands though.
|
They cannot be used by other git commands though.
|
||||||
|
|
||||||
* [[Amazon_S3]]
|
* [[Amazon_S3]]
|
||||||
|
* [[directory]]
|
||||||
|
|
10
doc/special_remotes/directory.mdwn
Normal file
10
doc/special_remotes/directory.mdwn
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
This special remote type stores file contents in directory on the system.
|
||||||
|
|
||||||
|
One use case for this would be if you have a removable drive, that you
|
||||||
|
cannot put a git repository on for some reason, and you want to use it
|
||||||
|
to sneakernet files between systems. Just set up both systems to use
|
||||||
|
the drive's mountpoint as a directory remote.
|
||||||
|
|
||||||
|
Setup example:
|
||||||
|
|
||||||
|
# git annex initremote usbdrive directory=/media/usbdrive/
|
Loading…
Reference in a new issue