added ifM and nuked 11 lines of code
no behavior changes
This commit is contained in:
parent
a4f72c9625
commit
60ab3d84e1
17 changed files with 151 additions and 162 deletions
|
@ -150,16 +150,16 @@ prepTmp key = do
|
||||||
getViaTmpUnchecked :: Key -> (FilePath -> Annex Bool) -> Annex Bool
|
getViaTmpUnchecked :: Key -> (FilePath -> Annex Bool) -> Annex Bool
|
||||||
getViaTmpUnchecked key action = do
|
getViaTmpUnchecked key action = do
|
||||||
tmp <- prepTmp key
|
tmp <- prepTmp key
|
||||||
success <- action tmp
|
ifM (action tmp)
|
||||||
if success
|
( do
|
||||||
then do
|
|
||||||
moveAnnex key tmp
|
moveAnnex key tmp
|
||||||
logStatus key InfoPresent
|
logStatus key InfoPresent
|
||||||
return True
|
return True
|
||||||
else do
|
, do
|
||||||
-- the tmp file is left behind, in case caller wants
|
-- the tmp file is left behind, in case caller wants
|
||||||
-- to resume its transfer
|
-- to resume its transfer
|
||||||
return False
|
return False
|
||||||
|
)
|
||||||
|
|
||||||
{- Creates a temp file, runs an action on it, and cleans up the temp file. -}
|
{- Creates a temp file, runs an action on it, and cleans up the temp file. -}
|
||||||
withTmp :: Key -> (FilePath -> Annex a) -> Annex a
|
withTmp :: Key -> (FilePath -> Annex a) -> Annex a
|
||||||
|
@ -230,15 +230,15 @@ moveAnnex :: Key -> FilePath -> Annex ()
|
||||||
moveAnnex key src = do
|
moveAnnex key src = do
|
||||||
dest <- inRepo $ gitAnnexLocation key
|
dest <- inRepo $ gitAnnexLocation key
|
||||||
let dir = parentDir dest
|
let dir = parentDir dest
|
||||||
e <- liftIO $ doesFileExist dest
|
liftIO $ ifM (doesFileExist dest)
|
||||||
if e
|
( removeFile src
|
||||||
then liftIO $ removeFile src
|
, do
|
||||||
else liftIO $ do
|
|
||||||
createDirectoryIfMissing True dir
|
createDirectoryIfMissing True dir
|
||||||
allowWrite dir -- in case the directory already exists
|
allowWrite dir -- in case the directory already exists
|
||||||
moveFile src dest
|
moveFile src dest
|
||||||
preventWrite dest
|
preventWrite dest
|
||||||
preventWrite dir
|
preventWrite dir
|
||||||
|
)
|
||||||
|
|
||||||
withObjectLoc :: Key -> ((FilePath, FilePath) -> Annex a) -> Annex a
|
withObjectLoc :: Key -> ((FilePath, FilePath) -> Annex a) -> Annex a
|
||||||
withObjectLoc key a = do
|
withObjectLoc key a = do
|
||||||
|
@ -314,12 +314,12 @@ getKeysPresent = liftIO . traverse (2 :: Int) =<< fromRepo gitAnnexObjectDir
|
||||||
saveState :: Bool -> Annex ()
|
saveState :: Bool -> Annex ()
|
||||||
saveState oneshot = do
|
saveState oneshot = do
|
||||||
Annex.Queue.flush False
|
Annex.Queue.flush False
|
||||||
unless oneshot $ do
|
unless oneshot $
|
||||||
alwayscommit <- fromMaybe True . Git.configTrue
|
ifM alwayscommit
|
||||||
|
( Annex.Branch.commit "update" , Annex.Branch.stage)
|
||||||
|
where
|
||||||
|
alwayscommit = fromMaybe True . Git.configTrue
|
||||||
<$> fromRepo (Git.Config.get "annex.alwayscommit" "")
|
<$> fromRepo (Git.Config.get "annex.alwayscommit" "")
|
||||||
if alwayscommit
|
|
||||||
then Annex.Branch.commit "update"
|
|
||||||
else Annex.Branch.stage
|
|
||||||
|
|
||||||
{- Downloads content from any of a list of urls. -}
|
{- Downloads content from any of a list of urls. -}
|
||||||
downloadUrl :: [Url.URLString] -> FilePath -> Annex Bool
|
downloadUrl :: [Url.URLString] -> FilePath -> Annex Bool
|
||||||
|
@ -338,10 +338,9 @@ preseedTmp key file = go =<< inAnnex key
|
||||||
ok <- copy
|
ok <- copy
|
||||||
when ok $ liftIO $ allowWrite file
|
when ok $ liftIO $ allowWrite file
|
||||||
return ok
|
return ok
|
||||||
copy = do
|
copy = ifM (liftIO $ doesFileExist file)
|
||||||
present <- liftIO $ doesFileExist file
|
( return True
|
||||||
if present
|
, do
|
||||||
then return True
|
|
||||||
else do
|
|
||||||
s <- inRepo $ gitAnnexLocation key
|
s <- inRepo $ gitAnnexLocation key
|
||||||
liftIO $ copyFileExternal s file
|
liftIO $ copyFileExternal s file
|
||||||
|
)
|
||||||
|
|
20
Annex/Ssh.hs
20
Annex/Ssh.hs
|
@ -37,15 +37,17 @@ sshParams (host, port) opts = go =<< sshInfo (host, port)
|
||||||
sshCleanup
|
sshCleanup
|
||||||
|
|
||||||
sshInfo :: (String, Maybe Integer) -> Annex (Maybe FilePath, [CommandParam])
|
sshInfo :: (String, Maybe Integer) -> Annex (Maybe FilePath, [CommandParam])
|
||||||
sshInfo (host, port) = do
|
sshInfo (host, port) = ifM caching
|
||||||
caching <- fromMaybe SysConfig.sshconnectioncaching . Git.configTrue
|
( do
|
||||||
<$> fromRepo (Git.Config.get "annex.sshcaching" "")
|
dir <- fromRepo gitAnnexSshDir
|
||||||
if caching
|
let socketfile = dir </> hostport2socket host port
|
||||||
then do
|
return (Just socketfile, cacheParams socketfile)
|
||||||
dir <- fromRepo gitAnnexSshDir
|
, return (Nothing, [])
|
||||||
let socketfile = dir </> hostport2socket host port
|
)
|
||||||
return (Just socketfile, cacheParams socketfile)
|
where
|
||||||
else return (Nothing, [])
|
caching = fromMaybe SysConfig.sshconnectioncaching
|
||||||
|
. Git.configTrue
|
||||||
|
<$> fromRepo (Git.Config.get "annex.sshcaching" "")
|
||||||
|
|
||||||
cacheParams :: FilePath -> [CommandParam]
|
cacheParams :: FilePath -> [CommandParam]
|
||||||
cacheParams socketfile =
|
cacheParams socketfile =
|
||||||
|
|
|
@ -34,11 +34,11 @@ genUUID :: IO UUID
|
||||||
genUUID = pOpen ReadFromPipe command params $ liftM toUUID . hGetLine
|
genUUID = pOpen ReadFromPipe command params $ liftM toUUID . hGetLine
|
||||||
where
|
where
|
||||||
command = SysConfig.uuid
|
command = SysConfig.uuid
|
||||||
params = if command == "uuid"
|
params
|
||||||
-- request a random uuid be generated
|
-- request a random uuid be generated
|
||||||
then ["-m"]
|
| command == "uuid" = ["-m"]
|
||||||
-- uuidgen generates random uuid by default
|
-- uuidgen generates random uuid by default
|
||||||
else []
|
| otherwise = []
|
||||||
|
|
||||||
{- Get current repository's UUID. -}
|
{- Get current repository's UUID. -}
|
||||||
getUUID :: Annex UUID
|
getUUID :: Annex UUID
|
||||||
|
|
|
@ -65,9 +65,7 @@ stop = return Nothing
|
||||||
|
|
||||||
{- Stops unless a condition is met. -}
|
{- Stops unless a condition is met. -}
|
||||||
stopUnless :: Annex Bool -> Annex (Maybe a) -> Annex (Maybe a)
|
stopUnless :: Annex Bool -> Annex (Maybe a) -> Annex (Maybe a)
|
||||||
stopUnless c a = do
|
stopUnless c a = ifM c ( a , stop )
|
||||||
ok <- c
|
|
||||||
if ok then a else stop
|
|
||||||
|
|
||||||
{- Prepares to run a command via the check and seek stages, returning a
|
{- Prepares to run a command via the check and seek stages, returning a
|
||||||
- list of actions to perform to run the command. -}
|
- list of actions to perform to run the command. -}
|
||||||
|
|
|
@ -85,8 +85,9 @@ cleanup file key hascontent = do
|
||||||
mtime <- modificationTime <$> getFileStatus file
|
mtime <- modificationTime <$> getFileStatus file
|
||||||
touch file (TimeSpec mtime) False
|
touch file (TimeSpec mtime) False
|
||||||
|
|
||||||
force <- Annex.getState Annex.force
|
params <- ifM (Annex.getState Annex.force)
|
||||||
if force
|
( return [Param "-f"]
|
||||||
then Annex.Queue.add "add" [Param "-f", Param "--"] [file]
|
, return []
|
||||||
else Annex.Queue.add "add" [Param "--"] [file]
|
)
|
||||||
|
Annex.Queue.add "add" (params++[Param "--"]) [file]
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -51,17 +51,17 @@ perform url file = ifAnnexed file addurl geturl
|
||||||
where
|
where
|
||||||
geturl = do
|
geturl = do
|
||||||
liftIO $ createDirectoryIfMissing True (parentDir file)
|
liftIO $ createDirectoryIfMissing True (parentDir file)
|
||||||
fast <- Annex.getState Annex.fast
|
ifM (Annex.getState Annex.fast)
|
||||||
if fast then nodownload url file else download url file
|
( nodownload url file , download url file )
|
||||||
addurl (key, _backend) = do
|
addurl (key, _backend) =
|
||||||
ok <- liftIO $ Url.check url (keySize key)
|
ifM (liftIO $ Url.check url $ keySize key)
|
||||||
if ok
|
( do
|
||||||
then do
|
|
||||||
setUrlPresent key url
|
setUrlPresent key url
|
||||||
next $ return True
|
next $ return True
|
||||||
else do
|
, do
|
||||||
warning $ "failed to verify url: " ++ url
|
warning $ "failed to verify url: " ++ url
|
||||||
stop
|
stop
|
||||||
|
)
|
||||||
|
|
||||||
download :: String -> FilePath -> CommandPerform
|
download :: String -> FilePath -> CommandPerform
|
||||||
download url file = do
|
download url file = do
|
||||||
|
|
|
@ -62,17 +62,18 @@ perform key file backend numcopies = check
|
||||||
{- To fsck a remote, the content is retrieved to a tmp file,
|
{- To fsck a remote, the content is retrieved to a tmp file,
|
||||||
- and checked locally. -}
|
- and checked locally. -}
|
||||||
performRemote :: Key -> FilePath -> Backend -> Maybe Int -> Remote -> CommandPerform
|
performRemote :: Key -> FilePath -> Backend -> Maybe Int -> Remote -> CommandPerform
|
||||||
performRemote key file backend numcopies remote = do
|
performRemote key file backend numcopies remote =
|
||||||
v <- Remote.hasKey remote key
|
dispatch =<< Remote.hasKey remote key
|
||||||
case v of
|
where
|
||||||
Left err -> do
|
dispatch (Left err) = do
|
||||||
showNote err
|
showNote err
|
||||||
stop
|
stop
|
||||||
Right True -> withtmp $ \tmpfile -> do
|
dispatch (Right True) = withtmp $ \tmpfile ->
|
||||||
copied <- getfile tmpfile
|
ifM (getfile tmpfile)
|
||||||
if copied then go True (Just tmpfile) else go True Nothing
|
( go True (Just tmpfile)
|
||||||
Right False -> go False Nothing
|
, go True Nothing
|
||||||
where
|
)
|
||||||
|
dispatch (Right False) = go False Nothing
|
||||||
go present localcopy = check
|
go present localcopy = check
|
||||||
[ verifyLocationLogRemote key file remote present
|
[ verifyLocationLogRemote key file remote present
|
||||||
, checkKeySizeRemote key remote localcopy
|
, checkKeySizeRemote key remote localcopy
|
||||||
|
@ -87,15 +88,14 @@ performRemote key file backend numcopies remote = do
|
||||||
let cleanup = liftIO $ catchIO (removeFile tmp) (const $ return ())
|
let cleanup = liftIO $ catchIO (removeFile tmp) (const $ return ())
|
||||||
cleanup
|
cleanup
|
||||||
cleanup `after` a tmp
|
cleanup `after` a tmp
|
||||||
getfile tmp = do
|
getfile tmp =
|
||||||
ok <- Remote.retrieveKeyFileCheap remote key tmp
|
ifM (Remote.retrieveKeyFileCheap remote key tmp)
|
||||||
if ok
|
( return True
|
||||||
then return ok
|
, ifM (Annex.getState Annex.fast)
|
||||||
else do
|
( return False
|
||||||
fast <- Annex.getState Annex.fast
|
, Remote.retrieveKeyFile remote key tmp
|
||||||
if fast
|
)
|
||||||
then return False
|
)
|
||||||
else Remote.retrieveKeyFile remote key tmp
|
|
||||||
|
|
||||||
{- To fsck a bare repository, fsck each key in the location log. -}
|
{- To fsck a bare repository, fsck each key in the location log. -}
|
||||||
withBarePresentKeys :: (Key -> CommandStart) -> CommandSeek
|
withBarePresentKeys :: (Key -> CommandStart) -> CommandSeek
|
||||||
|
@ -205,10 +205,10 @@ verifyLocationLog' key desc present u bad = do
|
||||||
checkKeySize :: Key -> Annex Bool
|
checkKeySize :: Key -> Annex Bool
|
||||||
checkKeySize key = do
|
checkKeySize key = do
|
||||||
file <- inRepo $ gitAnnexLocation key
|
file <- inRepo $ gitAnnexLocation key
|
||||||
present <- liftIO $ doesFileExist file
|
ifM (liftIO $ doesFileExist file)
|
||||||
if present
|
( checkKeySize' key file badContent
|
||||||
then checkKeySize' key file badContent
|
, return True
|
||||||
else return True
|
)
|
||||||
|
|
||||||
checkKeySizeRemote :: Key -> Remote -> Maybe FilePath -> Annex Bool
|
checkKeySizeRemote :: Key -> Remote -> Maybe FilePath -> Annex Bool
|
||||||
checkKeySizeRemote _ _ Nothing = return True
|
checkKeySizeRemote _ _ Nothing = return True
|
||||||
|
@ -219,16 +219,22 @@ checkKeySize' :: Key -> FilePath -> (Key -> Annex String) -> Annex Bool
|
||||||
checkKeySize' key file bad = case Types.Key.keySize key of
|
checkKeySize' key file bad = case Types.Key.keySize key of
|
||||||
Nothing -> return True
|
Nothing -> return True
|
||||||
Just size -> do
|
Just size -> do
|
||||||
stat <- liftIO $ getFileStatus file
|
size' <- fromIntegral . fileSize
|
||||||
let size' = fromIntegral (fileSize stat)
|
<$> (liftIO $ getFileStatus file)
|
||||||
if size == size'
|
comparesizes size size'
|
||||||
then return True
|
where
|
||||||
else do
|
comparesizes a b = do
|
||||||
msg <- bad key
|
let same = a == b
|
||||||
warning $ "Bad file size (" ++
|
unless same $ badsize a b
|
||||||
compareSizes storageUnits True size size' ++
|
return same
|
||||||
"); " ++ msg
|
badsize a b = do
|
||||||
return False
|
msg <- bad key
|
||||||
|
warning $ concat
|
||||||
|
[ "Bad file size ("
|
||||||
|
, compareSizes storageUnits True a b
|
||||||
|
, "); "
|
||||||
|
, msg
|
||||||
|
]
|
||||||
|
|
||||||
checkBackend :: Backend -> Key -> Annex Bool
|
checkBackend :: Backend -> Key -> Annex Bool
|
||||||
checkBackend backend key = do
|
checkBackend backend key = do
|
||||||
|
|
|
@ -42,37 +42,29 @@ perform key = stopUnless (getViaTmp key $ getKeyFile key) $
|
||||||
{- Try to find a copy of the file in one of the remotes,
|
{- Try to find a copy of the file in one of the remotes,
|
||||||
- and copy it to here. -}
|
- and copy it to here. -}
|
||||||
getKeyFile :: Key -> FilePath -> Annex Bool
|
getKeyFile :: Key -> FilePath -> Annex Bool
|
||||||
getKeyFile key file = do
|
getKeyFile key file = dispatch =<< Remote.keyPossibilities key
|
||||||
remotes <- Remote.keyPossibilities key
|
where
|
||||||
if null remotes
|
dispatch [] = do
|
||||||
then do
|
|
||||||
showNote "not available"
|
showNote "not available"
|
||||||
Remote.showLocations key []
|
Remote.showLocations key []
|
||||||
return False
|
return False
|
||||||
else trycopy remotes remotes
|
dispatch remotes = trycopy remotes remotes
|
||||||
where
|
|
||||||
trycopy full [] = do
|
trycopy full [] = do
|
||||||
Remote.showTriedRemotes full
|
Remote.showTriedRemotes full
|
||||||
Remote.showLocations key []
|
Remote.showLocations key []
|
||||||
return False
|
return False
|
||||||
trycopy full (r:rs) = do
|
trycopy full (r:rs) =
|
||||||
probablythere <- probablyPresent r
|
ifM (probablyPresent r)
|
||||||
if probablythere
|
( docopy r (trycopy full rs)
|
||||||
then docopy r (trycopy full rs)
|
, trycopy full rs
|
||||||
else trycopy full rs
|
)
|
||||||
-- This check is to avoid an ugly message if a remote is a
|
-- This check is to avoid an ugly message if a remote is a
|
||||||
-- drive that is not mounted.
|
-- drive that is not mounted.
|
||||||
probablyPresent r =
|
probablyPresent r
|
||||||
if Remote.hasKeyCheap r
|
| Remote.hasKeyCheap r =
|
||||||
then do
|
either (const False) id <$> Remote.hasKey r key
|
||||||
res <- Remote.hasKey r key
|
| otherwise = return True
|
||||||
case res of
|
|
||||||
Right b -> return b
|
|
||||||
Left _ -> return False
|
|
||||||
else return True
|
|
||||||
docopy r continue = do
|
docopy r continue = do
|
||||||
showAction $ "from " ++ Remote.name r
|
showAction $ "from " ++ Remote.name r
|
||||||
copied <- Remote.retrieveKeyFile r key file
|
ifM (Remote.retrieveKeyFile r key file)
|
||||||
if copied
|
( return True , continue)
|
||||||
then return True
|
|
||||||
else continue
|
|
||||||
|
|
|
@ -41,14 +41,14 @@ start = do
|
||||||
trusted <- trustGet Trusted
|
trusted <- trustGet Trusted
|
||||||
|
|
||||||
liftIO $ writeFile file (drawMap rs umap trusted)
|
liftIO $ writeFile file (drawMap rs umap trusted)
|
||||||
next $ next $ do
|
next $ next $
|
||||||
fast <- Annex.getState Annex.fast
|
ifM (Annex.getState Annex.fast)
|
||||||
if fast
|
( return True
|
||||||
then return True
|
, do
|
||||||
else do
|
|
||||||
showLongNote $ "running: dot -Tx11 " ++ file
|
showLongNote $ "running: dot -Tx11 " ++ file
|
||||||
showOutput
|
showOutput
|
||||||
liftIO $ boolSystem "dot" [Param "-Tx11", File file]
|
liftIO $ boolSystem "dot" [Param "-Tx11", File file]
|
||||||
|
)
|
||||||
where
|
where
|
||||||
file = "map.dot"
|
file = "map.dot"
|
||||||
|
|
||||||
|
|
|
@ -131,13 +131,13 @@ fromOk src key
|
||||||
return $ u /= Remote.uuid src && any (== src) remotes
|
return $ u /= Remote.uuid src && any (== src) remotes
|
||||||
fromPerform :: Remote -> Bool -> Key -> CommandPerform
|
fromPerform :: Remote -> Bool -> Key -> CommandPerform
|
||||||
fromPerform src move key = moveLock move key $ do
|
fromPerform src move key = moveLock move key $ do
|
||||||
ishere <- inAnnex key
|
ifM (inAnnex key)
|
||||||
if ishere
|
( handle move True
|
||||||
then handle move True
|
, do
|
||||||
else do
|
|
||||||
showAction $ "from " ++ Remote.name src
|
showAction $ "from " ++ Remote.name src
|
||||||
ok <- getViaTmp key $ Remote.retrieveKeyFile src key
|
ok <- getViaTmp key $ Remote.retrieveKeyFile src key
|
||||||
handle move ok
|
handle move ok
|
||||||
|
)
|
||||||
where
|
where
|
||||||
handle _ False = stop -- failed
|
handle _ False = stop -- failed
|
||||||
handle False True = next $ return True -- copy complete
|
handle False True = next $ return True -- copy complete
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
module Command.PreCommit where
|
module Command.PreCommit where
|
||||||
|
|
||||||
|
import Common.Annex
|
||||||
import Command
|
import Command
|
||||||
import qualified Command.Add
|
import qualified Command.Add
|
||||||
import qualified Command.Fix
|
import qualified Command.Fix
|
||||||
|
@ -26,7 +27,6 @@ start file = next $ perform file
|
||||||
|
|
||||||
perform :: FilePath -> CommandPerform
|
perform :: FilePath -> CommandPerform
|
||||||
perform file = do
|
perform file = do
|
||||||
ok <- doCommand $ Command.Add.start file
|
unlessM (doCommand $ Command.Add.start file) $
|
||||||
if ok
|
error $ "failed to add " ++ file ++ "; canceling commit"
|
||||||
then next $ return True
|
next $ return True
|
||||||
else error $ "failed to add " ++ file ++ "; canceling commit"
|
|
||||||
|
|
|
@ -51,11 +51,7 @@ remoteBranch :: Remote -> Git.Ref -> Git.Ref
|
||||||
remoteBranch remote = Git.Ref.under $ "refs/remotes/" ++ Remote.name remote
|
remoteBranch remote = Git.Ref.under $ "refs/remotes/" ++ Remote.name remote
|
||||||
|
|
||||||
syncRemotes :: [String] -> Annex [Remote]
|
syncRemotes :: [String] -> Annex [Remote]
|
||||||
syncRemotes rs = do
|
syncRemotes rs = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted )
|
||||||
fast <- Annex.getState Annex.fast
|
|
||||||
if fast
|
|
||||||
then nub <$> pickfast
|
|
||||||
else wanted
|
|
||||||
where
|
where
|
||||||
pickfast = (++) <$> listed <*> (good =<< fastest <$> available)
|
pickfast = (++) <$> listed <*> (good =<< fastest <$> available)
|
||||||
wanted
|
wanted
|
||||||
|
@ -113,11 +109,11 @@ pullRemote remote branch = do
|
||||||
showStart "pull" (Remote.name remote)
|
showStart "pull" (Remote.name remote)
|
||||||
next $ do
|
next $ do
|
||||||
showOutput
|
showOutput
|
||||||
fetched <- inRepo $ Git.Command.runBool "fetch"
|
stopUnless fetch $
|
||||||
|
next $ mergeRemote remote branch
|
||||||
|
where
|
||||||
|
fetch = inRepo $ Git.Command.runBool "fetch"
|
||||||
[Param $ Remote.name remote]
|
[Param $ Remote.name remote]
|
||||||
if fetched
|
|
||||||
then next $ mergeRemote remote branch
|
|
||||||
else stop
|
|
||||||
|
|
||||||
{- The remote probably has both a master and a synced/master branch.
|
{- The remote probably has both a master and a synced/master branch.
|
||||||
- Which to merge from? Well, the master has whatever latest changes
|
- Which to merge from? Well, the master has whatever latest changes
|
||||||
|
@ -159,15 +155,15 @@ mergeFrom branch = do
|
||||||
changed :: Remote -> Git.Ref -> Annex Bool
|
changed :: Remote -> Git.Ref -> Annex Bool
|
||||||
changed remote b = do
|
changed remote b = do
|
||||||
let r = remoteBranch remote b
|
let r = remoteBranch remote b
|
||||||
e <- inRepo $ Git.Ref.exists r
|
ifM (inRepo $ Git.Ref.exists r)
|
||||||
if e
|
( inRepo $ Git.Branch.changed b r
|
||||||
then inRepo $ Git.Branch.changed b r
|
, return False
|
||||||
else return False
|
)
|
||||||
|
|
||||||
newer :: Remote -> Git.Ref -> Annex Bool
|
newer :: Remote -> Git.Ref -> Annex Bool
|
||||||
newer remote b = do
|
newer remote b = do
|
||||||
let r = remoteBranch remote b
|
let r = remoteBranch remote b
|
||||||
e <- inRepo $ Git.Ref.exists r
|
ifM (inRepo $ Git.Ref.exists r)
|
||||||
if e
|
( inRepo $ Git.Branch.changed r b
|
||||||
then inRepo $ Git.Branch.changed r b
|
, return True
|
||||||
else return True
|
)
|
||||||
|
|
|
@ -47,16 +47,16 @@ cleanup file key = do
|
||||||
Params "-m", Param "content removed from git annex",
|
Params "-m", Param "content removed from git annex",
|
||||||
Param "--", File file]
|
Param "--", File file]
|
||||||
|
|
||||||
fast <- Annex.getState Annex.fast
|
ifM (Annex.getState Annex.fast)
|
||||||
if fast
|
( do
|
||||||
then do
|
|
||||||
-- fast mode: hard link to content in annex
|
-- fast mode: hard link to content in annex
|
||||||
src <- inRepo $ gitAnnexLocation key
|
src <- inRepo $ gitAnnexLocation key
|
||||||
liftIO $ do
|
liftIO $ do
|
||||||
createLink src file
|
createLink src file
|
||||||
allowWrite file
|
allowWrite file
|
||||||
else do
|
, do
|
||||||
fromAnnex key file
|
fromAnnex key file
|
||||||
logStatus key InfoMissing
|
logStatus key InfoMissing
|
||||||
|
)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -299,11 +299,11 @@ staleKeysPrune dirspec = do
|
||||||
staleKeys :: (Git.Repo -> FilePath) -> Annex [Key]
|
staleKeys :: (Git.Repo -> FilePath) -> Annex [Key]
|
||||||
staleKeys dirspec = do
|
staleKeys dirspec = do
|
||||||
dir <- fromRepo dirspec
|
dir <- fromRepo dirspec
|
||||||
exists <- liftIO $ doesDirectoryExist dir
|
ifM (liftIO $ doesDirectoryExist dir)
|
||||||
if not exists
|
( do
|
||||||
then return []
|
|
||||||
else do
|
|
||||||
contents <- liftIO $ getDirectoryContents dir
|
contents <- liftIO $ getDirectoryContents dir
|
||||||
files <- liftIO $ filterM doesFileExist $
|
files <- liftIO $ filterM doesFileExist $
|
||||||
map (dir </>) contents
|
map (dir </>) contents
|
||||||
return $ mapMaybe (fileKey . takeFileName) files
|
return $ mapMaybe (fileKey . takeFileName) files
|
||||||
|
, return []
|
||||||
|
)
|
||||||
|
|
17
Init.hs
17
Init.hs
|
@ -38,23 +38,22 @@ uninitialize = gitPreCommitHookUnWrite
|
||||||
ensureInitialized :: Annex ()
|
ensureInitialized :: Annex ()
|
||||||
ensureInitialized = getVersion >>= maybe needsinit checkVersion
|
ensureInitialized = getVersion >>= maybe needsinit checkVersion
|
||||||
where
|
where
|
||||||
needsinit = do
|
needsinit = ifM Annex.Branch.hasSibling
|
||||||
annexed <- Annex.Branch.hasSibling
|
( initialize Nothing
|
||||||
if annexed
|
, error "First run: git-annex init"
|
||||||
then initialize Nothing
|
)
|
||||||
else error "First run: git-annex init"
|
|
||||||
|
|
||||||
{- set up a git pre-commit hook, if one is not already present -}
|
{- set up a git pre-commit hook, if one is not already present -}
|
||||||
gitPreCommitHookWrite :: Annex ()
|
gitPreCommitHookWrite :: Annex ()
|
||||||
gitPreCommitHookWrite = unlessBare $ do
|
gitPreCommitHookWrite = unlessBare $ do
|
||||||
hook <- preCommitHook
|
hook <- preCommitHook
|
||||||
exists <- liftIO $ doesFileExist hook
|
ifM (liftIO $ doesFileExist hook)
|
||||||
if exists
|
( warning $ "pre-commit hook (" ++ hook ++ ") already exists, not configuring"
|
||||||
then warning $ "pre-commit hook (" ++ hook ++ ") already exists, not configuring"
|
, liftIO $ do
|
||||||
else liftIO $ do
|
|
||||||
viaTmp writeFile hook preCommitScript
|
viaTmp writeFile hook preCommitScript
|
||||||
p <- getPermissions hook
|
p <- getPermissions hook
|
||||||
setPermissions hook $ p {executable = True}
|
setPermissions hook $ p {executable = True}
|
||||||
|
)
|
||||||
|
|
||||||
gitPreCommitHookUnWrite :: Annex ()
|
gitPreCommitHookUnWrite :: Annex ()
|
||||||
gitPreCommitHookUnWrite = unlessBare $ do
|
gitPreCommitHookUnWrite = unlessBare $ do
|
||||||
|
|
14
Remote.hs
14
Remote.hs
|
@ -70,19 +70,13 @@ addName desc n
|
||||||
- (Or it can be a UUID.) Only finds currently configured git remotes. -}
|
- (Or it can be a UUID.) Only finds currently configured git remotes. -}
|
||||||
byName :: Maybe String -> Annex (Maybe Remote)
|
byName :: Maybe String -> Annex (Maybe Remote)
|
||||||
byName Nothing = return Nothing
|
byName Nothing = return Nothing
|
||||||
byName (Just n) = do
|
byName (Just n) = either error Just <$> byName' n
|
||||||
res <- byName' n
|
|
||||||
case res of
|
|
||||||
Left e -> error e
|
|
||||||
Right r -> return $ Just r
|
|
||||||
byName' :: String -> Annex (Either String Remote)
|
byName' :: String -> Annex (Either String Remote)
|
||||||
byName' "" = return $ Left "no remote specified"
|
byName' "" = return $ Left "no remote specified"
|
||||||
byName' n = do
|
byName' n = handle . filter matching <$> remoteList
|
||||||
match <- filter matching <$> remoteList
|
|
||||||
if null match
|
|
||||||
then return $ Left $ "there is no git remote named \"" ++ n ++ "\""
|
|
||||||
else return $ Right $ Prelude.head match
|
|
||||||
where
|
where
|
||||||
|
handle [] = Left $ "there is no git remote named \"" ++ n ++ "\""
|
||||||
|
handle match = Right $ Prelude.head match
|
||||||
matching r = n == name r || toUUID n == uuid r
|
matching r = n == name r || toUUID n == uuid r
|
||||||
|
|
||||||
{- Looks up a remote by name (or by UUID, or even by description),
|
{- Looks up a remote by name (or by UUID, or even by description),
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{- monadic stuff
|
{- monadic stuff
|
||||||
-
|
-
|
||||||
- Copyright 2010-2011 Joey Hess <joey@kitenet.net>
|
- Copyright 2010-2012 Joey Hess <joey@kitenet.net>
|
||||||
-
|
-
|
||||||
- Licensed under the GNU GPL version 3 or higher.
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
@ -14,11 +14,7 @@ import Control.Monad (liftM)
|
||||||
- predicate -}
|
- predicate -}
|
||||||
firstM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
|
firstM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
|
||||||
firstM _ [] = return Nothing
|
firstM _ [] = return Nothing
|
||||||
firstM p (x:xs) = do
|
firstM p (x:xs) = ifM (p x) (return $ Just x , firstM p xs)
|
||||||
q <- p x
|
|
||||||
if q
|
|
||||||
then return (Just x)
|
|
||||||
else firstM p xs
|
|
||||||
|
|
||||||
{- Returns true if any value in the list satisfies the predicate,
|
{- Returns true if any value in the list satisfies the predicate,
|
||||||
- stopping once one is found. -}
|
- stopping once one is found. -}
|
||||||
|
@ -29,6 +25,12 @@ anyM p = liftM isJust . firstM p
|
||||||
untilTrue :: Monad m => [a] -> (a -> m Bool) -> m Bool
|
untilTrue :: Monad m => [a] -> (a -> m Bool) -> m Bool
|
||||||
untilTrue = flip anyM
|
untilTrue = flip anyM
|
||||||
|
|
||||||
|
{- if with a monadic conditional. -}
|
||||||
|
ifM :: Monad m => m Bool -> (m a, m a) -> m a
|
||||||
|
ifM cond (thenclause, elseclause) = do
|
||||||
|
c <- cond
|
||||||
|
if c then thenclause else elseclause
|
||||||
|
|
||||||
{- Runs an action, passing its value to an observer before returning it. -}
|
{- Runs an action, passing its value to an observer before returning it. -}
|
||||||
observe :: Monad m => (a -> m b) -> m a -> m a
|
observe :: Monad m => (a -> m b) -> m a -> m a
|
||||||
observe observer a = do
|
observe observer a = do
|
||||||
|
|
Loading…
Reference in a new issue