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

module Command.SetContent where

import Common.Annex
import Command
import Logs.Location
import Annex.Content
import qualified Backend
import qualified Command.Fsck

def :: [Command]
def = [command "setcontent" (paramPair paramPath paramPath) seek
	"sets content of annexed file"]

seek :: [CommandSeek]
seek = [withWords start]

start :: [FilePath] -> CommandStart
start (src:dest:[]) = do
	showStart "setcontent" dest
	next $ perform src dest
start _ = error "specify a src file and a dest file"

perform :: FilePath -> FilePath -> CommandPerform
perform src dest = go =<< Backend.lookupFile dest
	where
		go Nothing = error "dest file is not in annex"
		go (Just (key, backend)) = do
			-- the file might be on a different filesystem,
			-- so mv is used rather than simply calling
			-- moveToObjectDir; disk space is also
			-- checked this way.
			ok <- getViaTmp key $ \tmp ->
				if dest /= src
					then liftIO $
						boolSystem "mv" [File src, File tmp]
					else return True
			if ok
				then next $ cleanup key backend
				else error "mv failed!"

cleanup :: Key -> Backend Annex -> CommandCleanup
cleanup key backend = do
	logStatus key InfoPresent

	-- fsck the new content
	size_ok <- Command.Fsck.checkKeySize key
	backend_ok <- Command.Fsck.checkBackend backend key

	return $ size_ok && backend_ok