packages feed

hadolint-2.3.0: src/Hadolint/Rule/DL3020.hs

module Hadolint.Rule.DL3020 (rule) where

import Data.Foldable (toList)
import qualified Data.Text as Text
import Hadolint.Rule
import Language.Docker.Syntax

rule :: Rule args
rule = simpleRule code severity message check
  where
    code = "DL3020"
    severity = DLErrorC
    message = "Use COPY instead of ADD for files and folders"

    check (Add (AddArgs srcs _ _ _)) =
      and [isArchive src || isUrl src | SourcePath src <- toList srcs]
    check _ = True
{-# INLINEABLE rule #-}

isArchive :: Text.Text -> Bool
isArchive path =
  or
    ( [ ftype `Text.isSuffixOf` path
        | ftype <-
            [ ".tar",
              ".gz",
              ".bz2",
              ".xz",
              ".zip",
              ".tgz",
              ".tb2",
              ".tbz",
              ".tbz2",
              ".lz",
              ".lzma",
              ".tlz",
              ".txz",
              ".Z",
              ".tZ"
            ]
      ]
    )

isUrl :: Text.Text -> Bool
isUrl path = or ([proto `Text.isPrefixOf` path | proto <- ["https://", "http://"]])