module Hpack.Syntax.Git ( isValidRef ) where import Data.Char (chr) import Data.List import System.FilePath.Posix -- https://git-scm.com/docs/git-check-ref-format isValidRef :: String -> Bool isValidRef ref = not (null ref) && not (any (isSuffixOf ".lock") components) && not (any (isPrefixOf ".") components) && not (".." `isInfixOf` ref) && not (any isControl ref) && all (`notElem` " ~^:?*[\\") ref && not ("//" `isInfixOf` ref) && not ("/" `isPrefixOf` ref) && not ("/" `isSuffixOf` ref) && not ("." `isSuffixOf` ref) && not ("@{" `isInfixOf` ref) && not (ref == "@") where components = splitDirectories ref isControl :: Char -> Bool isControl c = c < chr 0o040 || c == chr 0o177