    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