module Hpack.Syntax.Git (
isValidRef
) where
import Data.Char (chr)
import Data.List
import System.FilePath.Posix
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