From 8047bba5b92a6f77ef305c1a74e59b5dacbcc9a2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 7 Dec 2011 16:53:53 -0400 Subject: 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. --- Command.hs | 8 ++++---- Command/Add.hs | 20 ++++++++++++++------ debian/changelog | 2 ++ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Command.hs b/Command.hs index 4d5bbeb36..0cd0bf491 100644 --- a/Command.hs +++ b/Command.hs @@ -13,7 +13,7 @@ module Command ( prepCommand, doCommand, whenAnnexed, - notAnnexed, + ifAnnexed, notBareRepo, isBareRepo, autoCopies, @@ -71,10 +71,10 @@ doCommand = start {- Modifies an action to only act on files that are already annexed, - and passes the key and backend on to it. -} 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) -notAnnexed file a = maybe a (const $ return Nothing) =<< Backend.lookupFile file +ifAnnexed :: FilePath -> ((Key, Backend Annex) -> Annex a) -> (Annex a) -> Annex a +ifAnnexed file yes no = maybe no yes =<< Backend.lookupFile file notBareRepo :: Annex a -> Annex a notBareRepo a = do diff --git a/Command/Add.hs b/Command/Add.hs index 9fdbdcaa6..9410601b8 100644 --- a/Command/Add.hs +++ b/Command/Add.hs @@ -29,13 +29,21 @@ seek = [withFilesNotInGit start, withFilesUnlocked start] - moving it into the annex directory and setting up the symlink pointing - to its content. -} start :: BackendFile -> CommandStart -start p@(_, file) = notBareRepo $ notAnnexed file $ do - s <- liftIO $ getSymbolicLinkStatus file - if isSymbolicLink s || not (isRegularFile s) - then stop - else do +start p@(_, file) = notBareRepo $ ifAnnexed file fixup add + where + add = do + s <- liftIO $ getSymbolicLinkStatus file + if isSymbolicLink s || not (isRegularFile s) + then stop + else do + showStart "add" file + next $ perform p + fixup (key, _) = do + -- fixup from an interrupted add; the symlink + -- is present but not yet added to git showStart "add" file - next $ perform p + liftIO $ removeFile file + next $ next $ cleanup file key =<< inAnnex key perform :: BackendFile -> CommandPerform perform (backend, file) = Backend.genKey file backend >>= go diff --git a/debian/changelog b/debian/changelog index a4d3a6492..588ea6d5b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,8 @@ git-annex (3.20111204) UNRELEASED; urgency=low * map: Fix a failure to detect a loop when both repositories are local and refer to each other with relative paths. * 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 Sun, 04 Dec 2011 12:22:37 -0400 -- cgit v1.2.3