refactored hook setup
This commit is contained in:
parent
0e31234e8e
commit
0edd9ec03a
3 changed files with 101 additions and 42 deletions
42
Annex/Hook.hs
Normal file
42
Annex/Hook.hs
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{- git-annex git hooks
|
||||||
|
-
|
||||||
|
- Note that it's important that the scripts not change, otherwise
|
||||||
|
- removing old hooks using an old version of the script would fail.
|
||||||
|
-
|
||||||
|
- Copyright 2013 Joey Hess <joey@kitenet.net>
|
||||||
|
-
|
||||||
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
|
-}
|
||||||
|
|
||||||
|
module Annex.Hook where
|
||||||
|
|
||||||
|
import Common.Annex
|
||||||
|
import qualified Git.Hook as Git
|
||||||
|
import Utility.Shell
|
||||||
|
import Config
|
||||||
|
|
||||||
|
preCommitHook :: Git.Hook
|
||||||
|
preCommitHook = Git.Hook "pre-commit" (mkHookScript "git annex pre-commit .")
|
||||||
|
|
||||||
|
mkHookScript :: String -> String
|
||||||
|
mkHookScript s = unlines
|
||||||
|
[ shebang_local
|
||||||
|
, "# automatically configured by git-annex"
|
||||||
|
, s
|
||||||
|
]
|
||||||
|
|
||||||
|
hookWrite :: Git.Hook -> Annex ()
|
||||||
|
hookWrite h =
|
||||||
|
-- cannot have git hooks in a crippled filesystem (no execute bit)
|
||||||
|
unlessM crippledFileSystem $
|
||||||
|
unlessM (inRepo $ Git.hookWrite h) $
|
||||||
|
hookWarning h "already exists, not configuring"
|
||||||
|
|
||||||
|
hookUnWrite :: Git.Hook -> Annex ()
|
||||||
|
hookUnWrite h = unlessM (inRepo $ Git.hookUnWrite h) $
|
||||||
|
hookWarning h "contents modified; not deleting. Edit it to remove call to git annex."
|
||||||
|
|
||||||
|
hookWarning :: Git.Hook -> String -> Annex ()
|
||||||
|
hookWarning h msg = do
|
||||||
|
r <- gitRepo
|
||||||
|
warning $ Git.hookName h ++ " hook (" ++ Git.hookFile h r ++ ") " ++ msg
|
54
Git/Hook.hs
Normal file
54
Git/Hook.hs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
{- git hooks
|
||||||
|
-
|
||||||
|
- Copyright 2013 Joey Hess <joey@kitenet.net>
|
||||||
|
-
|
||||||
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
|
-}
|
||||||
|
|
||||||
|
module Git.Hook where
|
||||||
|
|
||||||
|
import Common
|
||||||
|
import Git
|
||||||
|
import Utility.Tmp
|
||||||
|
|
||||||
|
data Hook = Hook
|
||||||
|
{ hookName :: FilePath
|
||||||
|
, hookScript :: String
|
||||||
|
}
|
||||||
|
|
||||||
|
hookFile :: Hook -> Repo -> FilePath
|
||||||
|
hookFile h r = localGitDir r </> "hooks" </> hookName h
|
||||||
|
|
||||||
|
{- Writes a hook. Returns False if the hook already exists with a different
|
||||||
|
- content. -}
|
||||||
|
hookWrite :: Hook -> Repo -> IO Bool
|
||||||
|
hookWrite h r = do
|
||||||
|
let f = hookFile h r
|
||||||
|
ifM (doesFileExist f)
|
||||||
|
( expectedContent h r
|
||||||
|
, do
|
||||||
|
viaTmp writeFile f (hookScript h)
|
||||||
|
p <- getPermissions f
|
||||||
|
setPermissions f $ p {executable = True}
|
||||||
|
return True
|
||||||
|
)
|
||||||
|
|
||||||
|
{- Removes a hook. Returns False if the hook contained something else, and
|
||||||
|
- could not be removed. -}
|
||||||
|
hookUnWrite :: Hook -> Repo -> IO Bool
|
||||||
|
hookUnWrite h r = do
|
||||||
|
let f = hookFile h r
|
||||||
|
ifM (doesFileExist f)
|
||||||
|
( ifM (expectedContent h r)
|
||||||
|
( do
|
||||||
|
removeFile f
|
||||||
|
return True
|
||||||
|
, return False
|
||||||
|
)
|
||||||
|
, return True
|
||||||
|
)
|
||||||
|
|
||||||
|
expectedContent :: Hook -> Repo -> IO Bool
|
||||||
|
expectedContent h r = do
|
||||||
|
content <- readFile $ hookFile h r
|
||||||
|
return $ content == hookScript h
|
47
Init.hs
47
Init.hs
|
@ -12,11 +12,10 @@ module Init (
|
||||||
isInitialized,
|
isInitialized,
|
||||||
initialize,
|
initialize,
|
||||||
uninitialize,
|
uninitialize,
|
||||||
probeCrippledFileSystem
|
probeCrippledFileSystem,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Common.Annex
|
import Common.Annex
|
||||||
import Utility.Tmp
|
|
||||||
import Utility.Network
|
import Utility.Network
|
||||||
import qualified Annex
|
import qualified Annex
|
||||||
import qualified Git
|
import qualified Git
|
||||||
|
@ -26,7 +25,6 @@ import qualified Annex.Branch
|
||||||
import Logs.UUID
|
import Logs.UUID
|
||||||
import Annex.Version
|
import Annex.Version
|
||||||
import Annex.UUID
|
import Annex.UUID
|
||||||
import Utility.Shell
|
|
||||||
import Config
|
import Config
|
||||||
import Annex.Direct
|
import Annex.Direct
|
||||||
import Annex.Content.Direct
|
import Annex.Content.Direct
|
||||||
|
@ -36,6 +34,7 @@ import Backend
|
||||||
import Utility.UserInfo
|
import Utility.UserInfo
|
||||||
import Utility.FileMode
|
import Utility.FileMode
|
||||||
#endif
|
#endif
|
||||||
|
import Annex.Hook
|
||||||
|
|
||||||
genDescription :: Maybe String -> Annex String
|
genDescription :: Maybe String -> Annex String
|
||||||
genDescription (Just d) = return d
|
genDescription (Just d) = return d
|
||||||
|
@ -56,7 +55,8 @@ initialize mdescription = do
|
||||||
setVersion defaultVersion
|
setVersion defaultVersion
|
||||||
checkCrippledFileSystem
|
checkCrippledFileSystem
|
||||||
checkFifoSupport
|
checkFifoSupport
|
||||||
gitPreCommitHookWrite
|
unlessBare $
|
||||||
|
hookWrite preCommitHook
|
||||||
createInodeSentinalFile
|
createInodeSentinalFile
|
||||||
u <- getUUID
|
u <- getUUID
|
||||||
{- This will make the first commit to git, so ensure git is set up
|
{- This will make the first commit to git, so ensure git is set up
|
||||||
|
@ -67,7 +67,7 @@ initialize mdescription = do
|
||||||
|
|
||||||
uninitialize :: Annex ()
|
uninitialize :: Annex ()
|
||||||
uninitialize = do
|
uninitialize = do
|
||||||
gitPreCommitHookUnWrite
|
hookUnWrite preCommitHook
|
||||||
removeRepoUUID
|
removeRepoUUID
|
||||||
removeVersion
|
removeVersion
|
||||||
|
|
||||||
|
@ -87,46 +87,9 @@ ensureInitialized = getVersion >>= maybe needsinit checkVersion
|
||||||
isInitialized :: Annex Bool
|
isInitialized :: Annex Bool
|
||||||
isInitialized = maybe Annex.Branch.hasSibling (const $ return True) =<< getVersion
|
isInitialized = maybe Annex.Branch.hasSibling (const $ return True) =<< getVersion
|
||||||
|
|
||||||
{- set up a git pre-commit hook, if one is not already present -}
|
|
||||||
gitPreCommitHookWrite :: Annex ()
|
|
||||||
gitPreCommitHookWrite = unlessBare $ do
|
|
||||||
hook <- preCommitHook
|
|
||||||
ifM (liftIO $ doesFileExist hook)
|
|
||||||
( do
|
|
||||||
content <- liftIO $ readFile hook
|
|
||||||
when (content /= preCommitScript) $
|
|
||||||
warning $ "pre-commit hook (" ++ hook ++ ") already exists, not configuring"
|
|
||||||
, unlessM crippledFileSystem $
|
|
||||||
liftIO $ do
|
|
||||||
viaTmp writeFile hook preCommitScript
|
|
||||||
p <- getPermissions hook
|
|
||||||
setPermissions hook $ p {executable = True}
|
|
||||||
)
|
|
||||||
|
|
||||||
gitPreCommitHookUnWrite :: Annex ()
|
|
||||||
gitPreCommitHookUnWrite = unlessBare $ do
|
|
||||||
hook <- preCommitHook
|
|
||||||
whenM (liftIO $ doesFileExist hook) $
|
|
||||||
ifM (liftIO $ (==) preCommitScript <$> readFile hook)
|
|
||||||
( liftIO $ removeFile hook
|
|
||||||
, warning $ "pre-commit hook (" ++ hook ++
|
|
||||||
") contents modified; not deleting." ++
|
|
||||||
" Edit it to remove call to git annex."
|
|
||||||
)
|
|
||||||
|
|
||||||
unlessBare :: Annex () -> Annex ()
|
unlessBare :: Annex () -> Annex ()
|
||||||
unlessBare = unlessM $ fromRepo Git.repoIsLocalBare
|
unlessBare = unlessM $ fromRepo Git.repoIsLocalBare
|
||||||
|
|
||||||
preCommitHook :: Annex FilePath
|
|
||||||
preCommitHook = (</>) <$> fromRepo Git.localGitDir <*> pure "hooks/pre-commit"
|
|
||||||
|
|
||||||
preCommitScript :: String
|
|
||||||
preCommitScript = unlines
|
|
||||||
[ shebang_local
|
|
||||||
, "# automatically configured by git-annex"
|
|
||||||
, "git annex pre-commit ."
|
|
||||||
]
|
|
||||||
|
|
||||||
{- A crippled filesystem is one that does not allow making symlinks,
|
{- A crippled filesystem is one that does not allow making symlinks,
|
||||||
- or removing write access from files. -}
|
- or removing write access from files. -}
|
||||||
probeCrippledFileSystem :: Annex Bool
|
probeCrippledFileSystem :: Annex Bool
|
||||||
|
|
Loading…
Reference in a new issue