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

module Command.PreCommit where

import Control.Monad.State (liftIO)
import Control.Monad (when, unless)

import Command
import qualified Annex
import qualified Backend
import qualified GitRepo as Git
import qualified Command.Fix
import qualified Command.Lock
import qualified Command.Add

{- Run by git pre-commit hook. -}
start :: SubCmdStartString
start file = do
	-- If a file is unlocked for edit, add its new content to the
	-- annex, -}
	locked <- Command.Lock.isLocked file
	when (not locked) $ do
		pairs <- Backend.chooseBackends [file]
		ok <- doSubCmd $ Command.Add.start $ pairs !! 0
		unless (ok) $ do
			error $ "failed to add " ++ file ++ "; canceling commit"
		-- git commit will have staged the file's content;
		-- drop that and stage the symlink
		g <- Annex.gitRepo
		liftIO $ Git.run g ["reset", "-q", "--", file]
		Annex.queueRun

	-- Fix symlinks as they are committed, this ensures the
	-- relative links are not broken when moved around.
	Command.Fix.start file