check hook executability
This commit is contained in:
parent
caf97fcffd
commit
95a1f6b2ac
2 changed files with 15 additions and 2 deletions
10
Git.hs
10
Git.hs
|
@ -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.
|
||||||
-
|
-
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue