fromkey: Made idempotent
If the worktree file already exists, and is annexed and uses the same key, avoid failing, nothing needs to be done. Had to add lookupFileNotHidden to handle the case where an adjust --hide-missing is in use, and the worktree file was hidden due to the object content being missing. lookupFile would return the key of the hidden file, but it makes sense that after fromkey succeeds, the worktree must contain the file it was supposed to set up.
This commit is contained in:
parent
995628d94a
commit
7b46b43c48
4 changed files with 35 additions and 12 deletions
|
@ -1,6 +1,6 @@
|
|||
{- git-annex worktree files
|
||||
-
|
||||
- Copyright 2013-2018 Joey Hess <id@joeyh.name>
|
||||
- Copyright 2013-2019 Joey Hess <id@joeyh.name>
|
||||
-
|
||||
- Licensed under the GNU GPL version 3 or higher.
|
||||
-}
|
||||
|
@ -36,13 +36,28 @@ import qualified Database.Keys.SQL
|
|||
- pointer to a key in the original branch.
|
||||
-}
|
||||
lookupFile :: FilePath -> Annex (Maybe Key)
|
||||
lookupFile file = isAnnexLink file >>= \case
|
||||
Just key -> return (Just key)
|
||||
Nothing -> ifM (versionSupportsUnlockedPointers <||> isDirect)
|
||||
( ifM (liftIO $ doesFileExist file)
|
||||
lookupFile = lookupFile' catkeyfile
|
||||
where
|
||||
catkeyfile file =
|
||||
ifM (liftIO $ doesFileExist file)
|
||||
( catKeyFile file
|
||||
, catKeyFileHidden file =<< getCurrentBranch
|
||||
)
|
||||
|
||||
lookupFileNotHidden :: FilePath -> Annex (Maybe Key)
|
||||
lookupFileNotHidden = lookupFile' catkeyfile
|
||||
where
|
||||
catkeyfile file =
|
||||
ifM (liftIO $ doesFileExist file)
|
||||
( catKeyFile file
|
||||
, return Nothing
|
||||
)
|
||||
|
||||
lookupFile' :: (FilePath -> Annex (Maybe Key)) -> FilePath -> Annex (Maybe Key)
|
||||
lookupFile' catkeyfile file = isAnnexLink file >>= \case
|
||||
Just key -> return (Just key)
|
||||
Nothing -> ifM (versionSupportsUnlockedPointers <||> isDirect)
|
||||
( catkeyfile file
|
||||
, return Nothing
|
||||
)
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ git-annex (7.20190130) UNRELEASED; urgency=medium
|
|||
* Display progress bar when getting files from export remotes.
|
||||
* Fix race in cleanup of othertmp directory that could result in a failure
|
||||
attempting to access it.
|
||||
* fromkey: Made idempotent.
|
||||
|
||||
-- Joey Hess <id@joeyh.name> Wed, 30 Jan 2019 12:30:22 -0400
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{- git-annex command
|
||||
-
|
||||
- Copyright 2010-2018 Joey Hess <id@joeyh.name>
|
||||
- Copyright 2010-2019 Joey Hess <id@joeyh.name>
|
||||
-
|
||||
- Licensed under the GNU GPL version 3 or higher.
|
||||
-}
|
||||
|
@ -12,6 +12,7 @@ module Command.FromKey where
|
|||
import Command
|
||||
import qualified Annex.Queue
|
||||
import Annex.Content
|
||||
import Annex.WorkTree
|
||||
import qualified Annex
|
||||
import qualified Backend.URL
|
||||
|
||||
|
@ -89,9 +90,13 @@ perform key file = do
|
|||
next $ return ok
|
||||
|
||||
perform' :: Key -> FilePath -> Annex Bool
|
||||
perform' key file = do
|
||||
link <- calcRepo $ gitAnnexLink file key
|
||||
liftIO $ createDirectoryIfMissing True (parentDir file)
|
||||
liftIO $ createSymbolicLink link file
|
||||
Annex.Queue.addCommand "add" [Param "--"] [file]
|
||||
return True
|
||||
perform' key file = lookupFileNotHidden file >>= \case
|
||||
Nothing -> do
|
||||
link <- calcRepo $ gitAnnexLink file key
|
||||
liftIO $ createDirectoryIfMissing True (parentDir file)
|
||||
liftIO $ createSymbolicLink link file
|
||||
Annex.Queue.addCommand "add" [Param "--"] [file]
|
||||
return True
|
||||
Just k
|
||||
| k == key -> return True
|
||||
| otherwise -> giveup $ file ++ " already exists with different content"
|
||||
|
|
|
@ -1 +1,3 @@
|
|||
Currently, git-annex-fromkey errors if the target file exists. It would help if, when the target file is the same symlink that would be created by the command (i.e. to the same key), this wasn't considered an error. Together with [[todo/batch_command_result_status]] this would make the command a more robust building block for higher-level operations.
|
||||
|
||||
> idempotency is good, [[done]] --[[Joey]]
|
||||
|
|
Loading…
Reference in a new issue