diff options
-rw-r--r-- | Command/Unannex.hs | 57 | ||||
-rw-r--r-- | Command/Uninit.hs | 4 | ||||
-rw-r--r-- | Test.hs | 26 | ||||
-rw-r--r-- | debian/changelog | 1 | ||||
-rw-r--r-- | doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn | 2 |
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 @@ -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]] |