add: If interrupted, add can leave files converted to symlinks but not yet added to git. Running the add again will now clean up this situtation.

This commit is contained in:
Joey Hess 2011-12-07 16:53:53 -04:00
parent d2ff311a34
commit 8047bba5b9
3 changed files with 20 additions and 10 deletions

View file

@ -13,7 +13,7 @@ module Command (
prepCommand, prepCommand,
doCommand, doCommand,
whenAnnexed, whenAnnexed,
notAnnexed, ifAnnexed,
notBareRepo, notBareRepo,
isBareRepo, isBareRepo,
autoCopies, autoCopies,
@ -71,10 +71,10 @@ doCommand = start
{- Modifies an action to only act on files that are already annexed, {- Modifies an action to only act on files that are already annexed,
- and passes the key and backend on to it. -} - and passes the key and backend on to it. -}
whenAnnexed :: (FilePath -> (Key, Backend Annex) -> Annex (Maybe a)) -> FilePath -> Annex (Maybe a) whenAnnexed :: (FilePath -> (Key, Backend Annex) -> Annex (Maybe a)) -> FilePath -> Annex (Maybe a)
whenAnnexed a file = maybe (return Nothing) (a file) =<< Backend.lookupFile file whenAnnexed a file = ifAnnexed file (a file) (return Nothing)
notAnnexed :: FilePath -> Annex (Maybe a) -> Annex (Maybe a) ifAnnexed :: FilePath -> ((Key, Backend Annex) -> Annex a) -> (Annex a) -> Annex a
notAnnexed file a = maybe a (const $ return Nothing) =<< Backend.lookupFile file ifAnnexed file yes no = maybe no yes =<< Backend.lookupFile file
notBareRepo :: Annex a -> Annex a notBareRepo :: Annex a -> Annex a
notBareRepo a = do notBareRepo a = do

View file

@ -29,13 +29,21 @@ seek = [withFilesNotInGit start, withFilesUnlocked start]
- moving it into the annex directory and setting up the symlink pointing - moving it into the annex directory and setting up the symlink pointing
- to its content. -} - to its content. -}
start :: BackendFile -> CommandStart start :: BackendFile -> CommandStart
start p@(_, file) = notBareRepo $ notAnnexed file $ do start p@(_, file) = notBareRepo $ ifAnnexed file fixup add
where
add = do
s <- liftIO $ getSymbolicLinkStatus file s <- liftIO $ getSymbolicLinkStatus file
if isSymbolicLink s || not (isRegularFile s) if isSymbolicLink s || not (isRegularFile s)
then stop then stop
else do else do
showStart "add" file showStart "add" file
next $ perform p next $ perform p
fixup (key, _) = do
-- fixup from an interrupted add; the symlink
-- is present but not yet added to git
showStart "add" file
liftIO $ removeFile file
next $ next $ cleanup file key =<< inAnnex key
perform :: BackendFile -> CommandPerform perform :: BackendFile -> CommandPerform
perform (backend, file) = Backend.genKey file backend >>= go perform (backend, file) = Backend.genKey file backend >>= go

2
debian/changelog vendored
View file

@ -3,6 +3,8 @@ git-annex (3.20111204) UNRELEASED; urgency=low
* map: Fix a failure to detect a loop when both repositories are local * map: Fix a failure to detect a loop when both repositories are local
and refer to each other with relative paths. and refer to each other with relative paths.
* Prevent key names from containing newlines. * Prevent key names from containing newlines.
* add: If interrupted, add can leave files converted to symlinks but not
yet added to git. Running the add again will now clean up this situtation.
-- Joey Hess <joeyh@debian.org> Sun, 04 Dec 2011 12:22:37 -0400 -- Joey Hess <joeyh@debian.org> Sun, 04 Dec 2011 12:22:37 -0400