diff options
author | Joey Hess <joeyh@debian.org> | 2013-11-22 11:16:03 -0400 |
---|---|---|
committer | Joey Hess <joeyh@debian.org> | 2013-11-22 11:16:03 -0400 |
commit | 7e592e1d6ed5e0b25b37215da7558c6324688d6f (patch) | |
tree | 75a86ff02e9311bcff817f2dcfe9b0a6ca1b5708 /Git/Sha.hs | |
download | git-repair-7e592e1d6ed5e0b25b37215da7558c6324688d6f.tar.gz |
git-repair (1.20131122) unstable; urgency=low
* Added test mode, which can be used to randomly corrupt test
repositories, in reproducible ways, which allows easy
corruption-driven-development.
* Improve repair code in the case where the index file is corrupt,
and this hides other problems.
* Write a dummy .git/HEAD if the file is missing or corrupt, as
git otherwise will not treat the repository as a git repo.
* Improve fsck code to find badly corrupted objects that crash git fsck
before it can complain about them.
* Fixed crashes on bad file encodings.
* Can now run 10000 tests (git-repair --test -n 10000 --force)
with 0 failures.
# imported from the archive
Diffstat (limited to 'Git/Sha.hs')
-rw-r--r-- | Git/Sha.hs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/Git/Sha.hs b/Git/Sha.hs new file mode 100644 index 0000000..ee1b6d6 --- /dev/null +++ b/Git/Sha.hs @@ -0,0 +1,39 @@ +{- 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 + +{- 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' |