summaryrefslogtreecommitdiff
path: root/Command
diff options
context:
space:
mode:
Diffstat (limited to 'Command')
-rw-r--r--Command/PreCommit.hs28
1 files changed, 23 insertions, 5 deletions
diff --git a/Command/PreCommit.hs b/Command/PreCommit.hs
index 2128f207d..117546359 100644
--- a/Command/PreCommit.hs
+++ b/Command/PreCommit.hs
@@ -7,16 +7,34 @@
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, inject its content into the
- -- annex, and replace it with a symlink to the content. Git will
- -- then commit that.
- error "TODO"
+ -- 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]
+ liftIO $ Git.run g ["add", "--", file]
- -- fix symlinks
+ -- Fix symlinks as they are committed, this ensures the
+ -- relative links are not broken when moved around.
Command.Fix.start file