check hook executability

This commit is contained in:
Joey Hess 2012-03-14 12:17:38 -04:00
parent caf97fcffd
commit 95a1f6b2ac
2 changed files with 15 additions and 2 deletions

10
Git.hs
View file

@ -32,9 +32,11 @@ import qualified Data.Map as M
import Data.Char import Data.Char
import Network.URI (uriPath, uriScheme, unEscapeString) import Network.URI (uriPath, uriScheme, unEscapeString)
import System.Directory import System.Directory
import System.Posix.Files
import Common import Common
import Git.Types import Git.Types
import Utility.FileMode
{- User-visible description of a git repo. -} {- User-visible description of a git repo. -}
repoDescribe :: Repo -> String repoDescribe :: Repo -> String
@ -111,8 +113,12 @@ gitDir repo
hookPath :: String -> Repo -> IO (Maybe FilePath) hookPath :: String -> Repo -> IO (Maybe FilePath)
hookPath script repo = do hookPath script repo = do
let hook = gitDir repo </> "hooks" </> script let hook = gitDir repo </> "hooks" </> script
ok <- doesFileExist hook e <- doesFileExist hook
return $ if ok then Just hook else Nothing if e
then do
m <- fileMode <$> getFileStatus hook
return $ if isExecutable m then Just hook else Nothing
else return Nothing
{- Path to a repository's --work-tree, that is, its top. {- Path to a repository's --work-tree, that is, its top.
- -

View file

@ -34,3 +34,10 @@ allowWrite f = do
{- Checks if a file mode indicates it's a symlink. -} {- Checks if a file mode indicates it's a symlink. -}
isSymLink :: FileMode -> Bool isSymLink :: FileMode -> Bool
isSymLink mode = symbolicLinkMode `intersectFileModes` mode == symbolicLinkMode isSymLink mode = symbolicLinkMode `intersectFileModes` mode == symbolicLinkMode
{- Checks if a file has any executable bits set. -}
isExecutable :: FileMode -> Bool
isExecutable mode = ebits `intersectFileModes` mode /= 0
where
ebits = ownerExecuteMode `unionFileModes`
groupExecuteMode `unionFileModes` otherExecuteMode