diff options
author | Joey Hess <id@joeyh.name> | 2015-12-15 17:47:59 -0700 |
---|---|---|
committer | Joey Hess <id@joeyh.name> | 2015-12-15 17:47:59 -0700 |
commit | 7c12f0ac9224246dac308e837bccb5b2157062ee (patch) | |
tree | 0caa943db39f9a2bfad404c547acda354076b46a /Git/Sha.hs | |
download | git-repair-7c12f0ac9224246dac308e837bccb5b2157062ee.tar.gz |
Import git-repair_1.20151215.orig.tar.xz
[dgit import orig git-repair_1.20151215.orig.tar.xz]
Diffstat (limited to 'Git/Sha.hs')
-rw-r--r-- | Git/Sha.hs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/Git/Sha.hs b/Git/Sha.hs new file mode 100644 index 0000000..b802c85 --- /dev/null +++ b/Git/Sha.hs @@ -0,0 +1,43 @@ +{- git SHA stuff + - + - Copyright 2011 Joey Hess <id@joeyh.name> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Sha where + +import Common +import Git.Types + +{- Runs an action that causes a git subcommand to emit a Sha, and strips + - any trailing newline, returning the sha. -} +getSha :: String -> IO String -> IO Sha +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 + +{- Size of a git sha. -} +shaSize :: Int +shaSize = 40 + +nullSha :: Ref +nullSha = Ref $ replicate shaSize '0' + +{- Git's magic empty tree. -} +emptyTree :: Ref +emptyTree = Ref "4b825dc642cb6eb9a060e54bf8d69288fbee4904" |