9f1577f746
The only remaining vestiage of backends is different types of keys. These are still called "backends", mostly to avoid needing to change user interface and configuration. But everything to do with storing keys in different backends was gone; instead different types of remotes are used. In the refactoring, lots of code was moved out of odd corners like Backend.File, to closer to where it's used, like Command.Drop and Command.Fsck. Quite a lot of dead code was removed. Several data structures became simpler, which may result in better runtime efficiency. There should be no user-visible changes.
83 lines
2.1 KiB
Haskell
83 lines
2.1 KiB
Haskell
{- git-annex command
|
|
-
|
|
- Copyright 2010 Joey Hess <joey@kitenet.net>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
module Command.Unannex where
|
|
|
|
import Control.Monad.State (liftIO)
|
|
import Control.Monad (unless)
|
|
import System.Directory
|
|
import System.Posix.Files
|
|
|
|
import Command
|
|
import qualified Command.Drop
|
|
import qualified Annex
|
|
import qualified AnnexQueue
|
|
import Utility
|
|
import LocationLog
|
|
import Types
|
|
import Content
|
|
import qualified Git
|
|
import qualified Git.LsFiles as LsFiles
|
|
import Messages
|
|
import Locations
|
|
|
|
command :: [Command]
|
|
command = [repoCommand "unannex" paramPath seek "undo accidential add command"]
|
|
|
|
seek :: [CommandSeek]
|
|
seek = [withFilesInGit start]
|
|
|
|
{- The unannex subcommand undoes an add. -}
|
|
start :: CommandStartString
|
|
start file = isAnnexed file $ \(key, _) -> do
|
|
ishere <- inAnnex key
|
|
if ishere
|
|
then do
|
|
force <- Annex.getState Annex.force
|
|
unless force $ do
|
|
g <- Annex.gitRepo
|
|
staged <- liftIO $ LsFiles.staged g [Git.workTree g]
|
|
unless (null staged) $
|
|
error "This command cannot be run when there are already files staged for commit."
|
|
Annex.changeState $ \s -> s { Annex.force = True }
|
|
|
|
showStart "unannex" file
|
|
next $ perform file key
|
|
else stop
|
|
|
|
perform :: FilePath -> Key -> CommandPerform
|
|
perform file key = do
|
|
ok <- Command.Drop.dropKey key (Just 0) -- always remove
|
|
if ok
|
|
then next $ cleanup file key
|
|
else stop
|
|
|
|
cleanup :: FilePath -> Key -> CommandCleanup
|
|
cleanup file key = do
|
|
g <- Annex.gitRepo
|
|
|
|
liftIO $ removeFile file
|
|
liftIO $ Git.run g "rm" [Params "--quiet --", File file]
|
|
-- git rm deletes empty directories; put them back
|
|
liftIO $ createDirectoryIfMissing True (parentDir file)
|
|
|
|
fast <- Annex.getState Annex.fast
|
|
if fast
|
|
then liftIO $ do
|
|
-- fast mode: hard link to content in annex
|
|
createLink (gitAnnexLocation g key) file
|
|
allowWrite file
|
|
else do
|
|
fromAnnex key file
|
|
logStatus key InfoMissing
|
|
|
|
-- Commit staged changes at end to avoid confusing the
|
|
-- pre-commit hook if this file is later added back to
|
|
-- git as a normal, non-annexed file.
|
|
AnnexQueue.add "commit" [Params "-a -m", Param "content removed from git annex"] "-a"
|
|
|
|
return True
|