summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-12-07 16:53:53 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-12-07 16:53:53 -0400
commit8047bba5b92a6f77ef305c1a74e59b5dacbcc9a2 (patch)
tree79d39ea3299dd356864a6e6539c8ba667356b9dc
parentd2ff311a3496fc498ad540b194767853ffdc1fc0 (diff)
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.
-rw-r--r--Command.hs8
-rw-r--r--Command/Add.hs20
-rw-r--r--debian/changelog2
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 <joeyh@debian.org> Sun, 04 Dec 2011 12:22:37 -0400