summaryrefslogtreecommitdiff
path: root/Command/Uninit.hs
blob: fadae0e5a92cee4c2a8752daded2992293c20075 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
{- git-annex command
 -
 - Copyright 2010 Joey Hess <joey@kitenet.net>
 -
 - Licensed under the GNU GPL version 3 or higher.
 -}

module Command.Uninit where

import Control.Monad.State (liftIO)
import System.Directory
import System.Exit

import Command
import Utility.SafeCommand
import qualified Git
import qualified Annex
import qualified Command.Unannex
import Init
import qualified Branch
import Content
import Locations

command :: [Command]
command = [repoCommand "uninit" paramPath seek 
        "de-initialize git-annex and clean out repository"]

seek :: [CommandSeek]
seek = [withFilesInGit startUnannex, withNothing start]

startUnannex :: CommandStartString
startUnannex file = do
	-- Force fast mode before running unannex. This way, if multiple
	-- files link to a key, it will be left in the annex and hardlinked
	-- to by each.
	Annex.changeState $ \s -> s { Annex.fast = True }
	Command.Unannex.start file

start :: CommandStartNothing
start = next perform

perform :: CommandPerform
perform = next cleanup

cleanup :: CommandCleanup
cleanup = do
	g <- Annex.gitRepo
	uninitialize
	mapM_ removeAnnex =<< getKeysPresent
	liftIO $ removeDirectoryRecursive (gitAnnexDir g)
	-- avoid normal shutdown
	saveState
	liftIO $ do
		Git.run g "branch" [Param "-D", Param Branch.name]
		exitSuccess