summaryrefslogtreecommitdiff
path: root/Command/Unlock.hs
blob: bd1021cc3c6504f462d568b3813fdf2e693e23e3 (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
{- git-annex command
 -
 - Copyright 2010 Joey Hess <joey@kitenet.net>
 -
 - Licensed under the GNU GPL version 3 or higher.
 -}

module Command.Unlock where

import Control.Monad (when)
import Control.Monad.State (liftIO)
import System.Directory hiding (copyFile)

import Command
import qualified Annex
import qualified Backend
import Types
import Messages
import Locations
import Content
import CopyFile

command :: [Command]
command =
	[ Command "unlock" paramPath seek "unlock files for modification"
	, Command "edit" paramPath seek "same as unlock"
	]

seek :: [CommandSeek]
seek = [withFilesInGit start]

{- The unlock subcommand replaces the symlink with a copy of the file's
 - content. -}
start :: CommandStartString
start file = isAnnexed file $ \(key, _) -> do
	showStart "unlock" file
	return $ Just $ perform file key

perform :: FilePath -> Key -> CommandPerform
perform dest key = do
	inbackend <- Backend.hasKey key
	when (not inbackend) $
		error "content not present"

	g <- Annex.gitRepo
	let src = gitAnnexLocation g key
	liftIO $ removeFile dest
	showNote "copying..."
	ok <- liftIO $ copyFile src dest
        if ok
                then do
			liftIO $ allowWrite dest
			return $ Just $ return True
                else error "copy failed!"