summaryrefslogtreecommitdiff
path: root/Init.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-08-17 14:14:43 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-08-17 14:44:31 -0400
commit56f6923ccbc6fb1932137b53458a4cece47e69b0 (patch)
treea2c9a949f2c6c5163551a76f4012e7606e3c1463 /Init.hs
parent3b5f7221305ba6e768711d8326a01b78fb1e4f79 (diff)
Now "git annex init" only has to be run once
when a git repository is first being created. Clones will automatically notice that git-annex is in use and automatically perform a basic initalization. It's still recommended to run "git annex init" in any clones, to describe them.
Diffstat (limited to 'Init.hs')
-rw-r--r--Init.hs69
1 files changed, 69 insertions, 0 deletions
diff --git a/Init.hs b/Init.hs
new file mode 100644
index 000000000..41256a953
--- /dev/null
+++ b/Init.hs
@@ -0,0 +1,69 @@
+{- git-annex repository initialization
+ -
+ - Copyright 2010 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Init (initialize, uninitialize) where
+
+import Control.Monad.State (liftIO)
+import Control.Monad (unless)
+import System.Directory
+
+import qualified Annex
+import qualified Git
+import qualified Branch
+import Version
+import Messages
+import Types
+import Utility
+import UUID
+
+initialize :: Annex ()
+initialize = do
+ prepUUID
+ Branch.create
+ setVersion
+ g <- Annex.gitRepo
+ unless (Git.repoIsLocalBare g) $
+ gitPreCommitHookWrite g
+
+uninitialize :: Annex ()
+uninitialize = do
+ g <- Annex.gitRepo
+ gitPreCommitHookUnWrite g
+
+{- set up a git pre-commit hook, if one is not already present -}
+gitPreCommitHookWrite :: Git.Repo -> Annex ()
+gitPreCommitHookWrite repo = do
+ exists <- liftIO $ doesFileExist hook
+ if exists
+ then warning $ "pre-commit hook (" ++ hook ++ ") already exists, not configuring"
+ else liftIO $ do
+ viaTmp writeFile hook preCommitScript
+ p <- getPermissions hook
+ setPermissions hook $ p {executable = True}
+ where
+ hook = preCommitHook repo
+
+gitPreCommitHookUnWrite :: Git.Repo -> Annex ()
+gitPreCommitHookUnWrite repo = do
+ let hook = preCommitHook repo
+ whenM (liftIO $ doesFileExist hook) $ do
+ c <- liftIO $ readFile hook
+ if c == preCommitScript
+ then liftIO $ removeFile hook
+ else warning $ "pre-commit hook (" ++ hook ++
+ ") contents modified; not deleting." ++
+ " Edit it to remove call to git annex."
+
+preCommitHook :: Git.Repo -> FilePath
+preCommitHook repo =
+ Git.workTree repo ++ "/" ++ Git.gitDir repo ++ "/hooks/pre-commit"
+
+preCommitScript :: String
+preCommitScript =
+ "#!/bin/sh\n" ++
+ "# automatically configured by git-annex\n" ++
+ "git annex pre-commit .\n"