summaryrefslogtreecommitdiff
path: root/Command/Unannex.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Command/Unannex.hs')
-rw-r--r--Command/Unannex.hs57
1 files changed, 41 insertions, 16 deletions
diff --git a/Command/Unannex.hs b/Command/Unannex.hs
index 6674b37d2..ec00ded11 100644
--- a/Command/Unannex.hs
+++ b/Command/Unannex.hs
@@ -1,6 +1,6 @@
{- git-annex command
-
- - Copyright 2010 Joey Hess <joey@kitenet.net>
+ - Copyright 2010-2013 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -11,15 +11,16 @@ module Command.Unannex where
import Common.Annex
import Command
+import Config
import qualified Annex
import Logs.Location
import Annex.Content
+import Annex.Content.Direct
import qualified Git.Command
import qualified Git.LsFiles as LsFiles
def :: [Command]
-def = [notDirect $
- command "unannex" paramPaths seek SectionUtility
+def = [command "unannex" paramPaths seek SectionUtility
"undo accidential add command"]
seek :: [CommandSeek]
@@ -28,36 +29,41 @@ seek = [withFilesInGit $ whenAnnexed start]
start :: FilePath -> (Key, Backend) -> CommandStart
start file (key, _) = stopUnless (inAnnex key) $ do
showStart "unannex" file
- next $ perform file key
+ next $ ifM isDirect
+ ( performDirect file key
+ , performIndirect file key)
-perform :: FilePath -> Key -> CommandPerform
-perform file key = next $ cleanup file key
-
-cleanup :: FilePath -> Key -> CommandCleanup
-cleanup file key = do
+performIndirect :: FilePath -> Key -> CommandPerform
+performIndirect file key = do
liftIO $ removeFile file
+
-- git rm deletes empty directory without --cached
- inRepo $ Git.Command.run [Params "rm --cached --quiet --", File file]
+ inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file]
-- If the file was already committed, it is now staged for removal.
-- Commit that removal now, to avoid later confusing the
- -- pre-commit hook if this file is later added back to
- -- git as a normal, non-annexed file.
- (s, clean) <- inRepo $ LsFiles.staged [file]
- when (not $ null s) $ do
+ -- pre-commit hook, if this file is later added back to
+ -- git as a normal non-annexed file, to thinking that the
+ -- file has been unlocked and needs to be re-annexed.
+ (s, reap) <- inRepo $ LsFiles.staged [file]
+ when (not $ null s) $
inRepo $ Git.Command.run
[ Param "commit"
, Param "-q"
+ , Param "--no-verify"
, Param "-m", Param "content removed from git annex"
, Param "--", File file
]
- void $ liftIO clean
+ void $ liftIO reap
+ next $ cleanupIndirect file key
+
+cleanupIndirect :: FilePath -> Key -> CommandCleanup
+cleanupIndirect file key = do
ifM (Annex.getState Annex.fast)
( goFast
, go
)
-
return True
where
#ifdef __WINDOWS__
@@ -75,3 +81,22 @@ cleanup file key = do
go = do
fromAnnex key file
logStatus key InfoMissing
+
+
+performDirect :: FilePath -> Key -> CommandPerform
+performDirect file key = do
+ -- --force is needed when the file is not committed
+ inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file]
+ next $ cleanupDirect file key
+
+{- The direct mode file is not touched during unannex, so the content
+ - is already where it needs to be, so this does not need to do anything
+ - except remove it from the associated file map (which also updates
+ - the location log if this was the last copy), and, if this was the last
+ - associated file, remove the inode cache. -}
+cleanupDirect :: FilePath -> Key -> CommandCleanup
+cleanupDirect file key = do
+ fs <- removeAssociatedFile key file
+ when (null fs) $
+ removeInodeCache key
+ return True