summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Command/Unannex.hs57
-rw-r--r--Command/Uninit.hs4
-rw-r--r--Test.hs26
-rw-r--r--debian/changelog1
-rw-r--r--doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn2
5 files changed, 60 insertions, 30 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
diff --git a/Command/Uninit.hs b/Command/Uninit.hs
index 5e50c0b3a..a40e28399 100644
--- a/Command/Uninit.hs
+++ b/Command/Uninit.hs
@@ -18,7 +18,7 @@ import qualified Annex.Branch
import Annex.Content
def :: [Command]
-def = [notDirect $ addCheck check $ command "uninit" paramPaths seek
+def = [addCheck check $ command "uninit" paramPaths seek
SectionUtility "de-initialize git-annex and clean out repository"]
check :: Annex ()
@@ -104,6 +104,6 @@ removeUnannexed = go []
go c ks
, go (k:c) ks
)
- enoughlinks f = do
+ enoughlinks f = catchBoolIO $ do
s <- getFileStatus f
return $ linkCount s > 1
diff --git a/Test.hs b/Test.hs
index eab81cc0a..c45b0d360 100644
--- a/Test.hs
+++ b/Test.hs
@@ -243,11 +243,11 @@ test_reinject env = "git-annex reinject/fromkey" ~: TestCase $ intmpclonerepoInD
test_unannex :: TestEnv -> Test
test_unannex env = "git-annex unannex" ~: TestList [nocopy, withcopy]
where
- nocopy = "no content" ~: intmpclonerepoInDirect env $ do
+ nocopy = "no content" ~: intmpclonerepo env $ do
annexed_notpresent annexedfile
git_annex env "unannex" [annexedfile] @? "unannex failed with no copy"
annexed_notpresent annexedfile
- withcopy = "with content" ~: intmpclonerepoInDirect env $ do
+ withcopy = "with content" ~: intmpclonerepo env $ do
git_annex env "get" [annexedfile] @? "get failed"
annexed_present annexedfile
git_annex env "unannex" [annexedfile, sha1annexedfile] @? "unannex failed"
@@ -734,16 +734,18 @@ test_map env = "git-annex map" ~: intmpclonerepo env $ do
git_annex env "map" ["--fast"] @? "map failed"
test_uninit :: TestEnv -> Test
-test_uninit env = "git-annex uninit" ~: intmpclonerepoInDirect env $ do
- git_annex env "get" [] @? "get failed"
- annexed_present annexedfile
- boolSystem "git" [Params "checkout git-annex"] @? "git checkout git-annex"
- not <$> git_annex env "uninit" [] @? "uninit failed to fail when git-annex branch was checked out"
- boolSystem "git" [Params "checkout master"] @? "git checkout master"
- _ <- git_annex env "uninit" [] -- exit status not checked; does abnormal exit
- checkregularfile annexedfile
- doesDirectoryExist ".git" @? ".git vanished in uninit"
- not <$> doesDirectoryExist ".git/annex" @? ".git/annex still present after uninit"
+test_uninit env = "git-annex uninit" ~: TestList [inbranch, normal]
+ where
+ inbranch = "in branch" ~: intmpclonerepoInDirect env $ do
+ boolSystem "git" [Params "checkout git-annex"] @? "git checkout git-annex"
+ not <$> git_annex env "uninit" [] @? "uninit failed to fail when git-annex branch was checked out"
+ normal = "normal" ~: intmpclonerepo env $ do
+ git_annex env "get" [] @? "get failed"
+ annexed_present annexedfile
+ _ <- git_annex env "uninit" [] -- exit status not checked; does abnormal exit
+ checkregularfile annexedfile
+ doesDirectoryExist ".git" @? ".git vanished in uninit"
+ not <$> doesDirectoryExist ".git/annex" @? ".git/annex still present after uninit"
test_upgrade :: TestEnv -> Test
test_upgrade env = "git-annex upgrade" ~: intmpclonerepo env $ do
diff --git a/debian/changelog b/debian/changelog
index 298b77d86..221fb3bee 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -32,6 +32,7 @@ git-annex (4.20130710) UNRELEASED; urgency=low
back to the regular host if they all fail.
* For long hostnames, use a hash of the hostname to generate the socket
file for ssh connection caching.
+ * Support unannex and uninit in direct mode.
-- Joey Hess <joeyh@debian.org> Tue, 09 Jul 2013 19:17:13 -0400
diff --git a/doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn b/doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn
index 39f2028e0..b3a2ba37c 100644
--- a/doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn
+++ b/doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn
@@ -19,3 +19,5 @@ git-annex version: 4.20130601-g7483ca4
# End of transcript or log.
"""]]
+
+> [[done]]; added support for direct mode --[[Joey]]