summaryrefslogtreecommitdiff
path: root/Command
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-12-03 00:33:41 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-12-03 00:33:41 -0400
commit57305570eb5fce88c743ca4f7ff127c7ef582310 (patch)
treee2f590eca8f1efef4bc1ec6bcfe99f8e0474e909 /Command
parent6f932a0963341b235f262c43982cc138f443f2de (diff)
Add uninit subcommand. Closes: #605749
Diffstat (limited to 'Command')
-rw-r--r--Command/Init.hs41
-rw-r--r--Command/Uninit.hs59
2 files changed, 85 insertions, 15 deletions
diff --git a/Command/Init.hs b/Command/Init.hs
index eb5c58696..e19849ba3 100644
--- a/Command/Init.hs
+++ b/Command/Init.hs
@@ -18,6 +18,7 @@ import UUID
import Version
import Messages
import Locations
+import Types
seek :: [SubCmdSeek]
seek = [withString start]
@@ -36,8 +37,8 @@ perform description = do
u <- getUUID g
describeUUID u description
setVersion
- liftIO $ gitAttributes g
- liftIO $ gitPreCommitHook g
+ liftIO $ gitAttributesWrite g
+ gitPreCommitHookWrite g
return $ Just cleanup
cleanup :: SubCmdCleanup
@@ -50,8 +51,8 @@ cleanup = do
{- configure git to use union merge driver on state files, if it is not
- already -}
-gitAttributes :: Git.Repo -> IO ()
-gitAttributes repo = do
+gitAttributesWrite :: Git.Repo -> IO ()
+gitAttributesWrite repo = do
exists <- doesFileExist attributes
if not exists
then do
@@ -63,24 +64,34 @@ gitAttributes repo = do
appendFile attributes $ attrLine ++ "\n"
commit
where
- attrLine = stateLoc ++ "*.log merge=union"
attributes = Git.attributes repo
commit = do
Git.run repo ["add", attributes]
Git.run repo ["commit", "-m", "git-annex setup",
attributes]
+attrLine :: String
+attrLine = stateLoc ++ "*.log merge=union"
+
{- set up a git pre-commit hook, if one is not already present -}
-gitPreCommitHook :: Git.Repo -> IO ()
-gitPreCommitHook repo = do
- let hook = Git.workTree repo ++ "/" ++ Git.gitDir repo ++
- "/hooks/pre-commit"
- exists <- doesFileExist hook
+gitPreCommitHookWrite :: Git.Repo -> Annex ()
+gitPreCommitHookWrite repo = do
+ exists <- liftIO $ doesFileExist hook
if exists
- then putStrLn $ "pre-commit hook (" ++ hook ++ ") already exists, not configuring"
- else do
- writeFile hook $ "#!/bin/sh\n" ++
- "# automatically configured by git-annex\n" ++
- "git annex pre-commit .\n"
+ then warning $ "pre-commit hook (" ++ hook ++ ") already exists, not configuring"
+ else liftIO $ do
+ writeFile hook preCommitScript
p <- getPermissions hook
setPermissions hook $ p {executable = True}
+ where
+ hook = preCommitHook repo
+
+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"
diff --git a/Command/Uninit.hs b/Command/Uninit.hs
new file mode 100644
index 000000000..fcb77a92b
--- /dev/null
+++ b/Command/Uninit.hs
@@ -0,0 +1,59 @@
+{- git-annex command
+ -
+ - Copyright 2010 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Command.Uninit where
+
+import Control.Monad.State (liftIO)
+import Control.Monad (when)
+import System.Directory
+
+import Command
+import Messages
+import Types
+import Utility
+import qualified GitRepo as Git
+import qualified Annex
+import qualified Command.Unannex
+import qualified Command.Init
+
+seek :: [SubCmdSeek]
+seek = [withAll withFilesInGit Command.Unannex.start, withNothing start]
+
+start :: SubCmdStartNothing
+start = do
+ showStart "uninit" ""
+ return $ Just $ perform
+
+perform :: SubCmdPerform
+perform = do
+ g <- Annex.gitRepo
+
+ gitPreCommitHookUnWrite g
+ liftIO $ gitAttributesUnWrite g
+
+ return $ Just $ return True
+
+gitPreCommitHookUnWrite :: Git.Repo -> Annex ()
+gitPreCommitHookUnWrite repo = do
+ let hook = Command.Init.preCommitHook repo
+ hookexists <- liftIO $ doesFileExist hook
+ when hookexists $ do
+ c <- liftIO $ readFile hook
+ if c == Command.Init.preCommitScript
+ then liftIO $ removeFile hook
+ else warning $ "pre-commit hook (" ++ hook ++
+ ") contents modified; not deleting." ++
+ " Edit it to remove call to git annex."
+
+gitAttributesUnWrite :: Git.Repo -> IO ()
+gitAttributesUnWrite repo = do
+ let attributes = Git.attributes repo
+ attrexists <- doesFileExist attributes
+ when attrexists $ do
+ c <- readFileStrict attributes
+ writeFile attributes $ unlines $
+ filter (/= Command.Init.attrLine) $ lines c