2011-12-14 19:30:14 +00:00
|
|
|
{- git SHA stuff
|
|
|
|
-
|
|
|
|
- Copyright 2011 Joey Hess <joey@kitenet.net>
|
|
|
|
-
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
-}
|
|
|
|
|
|
|
|
module Git.Sha where
|
|
|
|
|
|
|
|
import Common
|
|
|
|
import Git.Types
|
|
|
|
|
2011-12-15 19:57:47 +00:00
|
|
|
{- Runs an action that causes a git subcommand to emit a Sha, and strips
|
2011-12-14 19:30:14 +00:00
|
|
|
any trailing newline, returning the sha. -}
|
|
|
|
getSha :: String -> IO String -> IO Sha
|
2011-12-15 19:57:47 +00:00
|
|
|
getSha subcommand a = maybe bad return =<< extractSha <$> a
|
|
|
|
where
|
|
|
|
bad = error $ "failed to read sha from git " ++ subcommand
|
|
|
|
|
|
|
|
{- Extracts the Sha from a string. There can be a trailing newline after
|
|
|
|
- it, but nothing else. -}
|
|
|
|
extractSha :: String -> Maybe Sha
|
|
|
|
extractSha s
|
|
|
|
| len == shaSize = val s
|
|
|
|
| len == shaSize + 1 && length s' == shaSize = val s'
|
|
|
|
| otherwise = Nothing
|
|
|
|
where
|
|
|
|
len = length s
|
|
|
|
s' = firstLine s
|
|
|
|
val v
|
|
|
|
| all (`elem` "1234567890ABCDEFabcdef") v = Just $ Ref v
|
|
|
|
| otherwise = Nothing
|
2011-12-14 19:30:14 +00:00
|
|
|
|
|
|
|
{- Size of a git sha. -}
|
|
|
|
shaSize :: Int
|
|
|
|
shaSize = 40
|
2012-01-06 21:24:03 +00:00
|
|
|
|
|
|
|
nullSha :: Ref
|
|
|
|
nullSha = Ref $ replicate shaSize '0'
|