From bae536f8fe67ce06b5d8e268cd1cb0d42101c4f1 Mon Sep 17 00:00:00 2001
From: Wismill <dev@wismill.eu>
Date: Sun, 12 Feb 2023 09:48:10 +0100
Subject: [PATCH] cabal-install: check: Whitelist doc file extensions (#8747)

* check: Test only doc files with supported extensions

* Cleanup

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 Cabal/src/Distribution/PackageDescription/Check.hs   | 12 +++++++-----
 .../ChangeLog/NotExisting/cabal.test.hs              |  2 --
 .../ChangeLog/NotIncluded/.gitignore                 |  2 ++
 .../{V3.0/ChangeLog.md => V1.12/ChangeLog.md~}       |  0
 .../ChangeLog/NotIncluded/V1.12/cabal.test.hs        |  2 --
 .../ChangeLog/NotIncluded/V3.0/CHANGELOG.TXT         |  0
 .../ChangeLog/NotIncluded/V3.0/cabal.out             |  2 +-
 .../ChangeLog/NotIncluded/V3.0/cabal.test.hs         |  2 --
 .../ChangeLog/WrongField/V1.12/cabal.test.hs         |  2 --
 .../ChangeLog/WrongField/V3.0/cabal.test.hs          |  2 --
 10 files changed, 10 insertions(+), 16 deletions(-)
 create mode 100644 cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/.gitignore
 rename cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/{V3.0/ChangeLog.md => V1.12/ChangeLog.md~} (100%)
 create mode 100644 cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/CHANGELOG.TXT

diff --git a/Cabal/src/Distribution/PackageDescription/Check.hs b/Cabal/src/Distribution/PackageDescription/Check.hs
index f1c528752d..5d11072b35 100644
--- a/Cabal/src/Distribution/PackageDescription/Check.hs
+++ b/Cabal/src/Distribution/PackageDescription/Check.hs
@@ -2545,12 +2545,13 @@ checkGlobFiles verbosity pkg root = do
           )
 
     -- Predicate for desirable documentation file on Hackage server
-    isDesirableExtraDocFile :: [FilePath] -> FilePath -> Bool
-    isDesirableExtraDocFile paths path = map toLower basename `elem` paths
+    isDesirableExtraDocFile :: ([FilePath], [FilePath]) -> FilePath -> Bool
+    isDesirableExtraDocFile (basenames, extensions) path =
+      basename `elem` basenames && ext `elem` extensions
       where
-        (basename, _ext) = splitExtension path
+        (basename, ext) = splitExtension (map toLower path)
 
-    -- Changelog patterns
+    -- Changelog patterns (basenames & extensions)
     -- Source: hackage-server/src/Distribution/Server/Packages/ChangeLog.hs
     desirableChangeLog =
       [ "news"
@@ -2558,6 +2559,7 @@ checkGlobFiles verbosity pkg root = do
       , "change_log"
       , "changes"
       ]
+    desirableChangeLogExtensions = ["", ".txt", ".md", ".markdown", ".rst"]
     -- [TODO] Check readme. Observations:
     --        • Readme is not necessary if package description is good.
     --        • Some readmes exists only for repository browsing.
@@ -2567,7 +2569,7 @@ checkGlobFiles verbosity pkg root = do
     -- -- Readme patterns
     -- -- Source: hackage-server/src/Distribution/Server/Packages/Readme.hs
     -- desirableReadme = ["readme"]
-    desirableDocFiles = desirableChangeLog
+    desirableDocFiles = (desirableChangeLog, desirableChangeLogExtensions)
 
     -- If there's a missing directory in play, since our globs don't
     -- (currently) support disjunction, that will always mean there are no
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotExisting/cabal.test.hs b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotExisting/cabal.test.hs
index 28a6cd72ac..4cb629752f 100644
--- a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotExisting/cabal.test.hs
+++ b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotExisting/cabal.test.hs
@@ -1,7 +1,5 @@
 import Test.Cabal.Prelude
 
-import System.Directory (createDirectoryIfMissing)
-
 -- Omitting ChangeLog.md but not README in extra-doc-files
 main = cabalTest $ do
   cabal "check" []
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/.gitignore b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/.gitignore
new file mode 100644
index 0000000000..3e33969526
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/.gitignore
@@ -0,0 +1,2 @@
+# Needed for test, to ensure we test the file extension as well.
+!ChangeLog.md~
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/ChangeLog.md b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V1.12/ChangeLog.md~
similarity index 100%
rename from cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/ChangeLog.md
rename to cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V1.12/ChangeLog.md~
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V1.12/cabal.test.hs b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V1.12/cabal.test.hs
index 28a6cd72ac..4cb629752f 100644
--- a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V1.12/cabal.test.hs
+++ b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V1.12/cabal.test.hs
@@ -1,7 +1,5 @@
 import Test.Cabal.Prelude
 
-import System.Directory (createDirectoryIfMissing)
-
 -- Omitting ChangeLog.md but not README in extra-doc-files
 main = cabalTest $ do
   cabal "check" []
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/CHANGELOG.TXT b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/CHANGELOG.TXT
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/cabal.out b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/cabal.out
index f97aa4a73f..d2df818ef5 100644
--- a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/cabal.out
+++ b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/cabal.out
@@ -1,3 +1,3 @@
 # cabal check
 Warning: These warnings may cause trouble when distributing the package:
-Warning: Please consider including the file './ChangeLog.md' in the 'extra-doc-files' section of the .cabal file if it contains useful information for users of the package.
+Warning: Please consider including the file './CHANGELOG.TXT' in the 'extra-doc-files' section of the .cabal file if it contains useful information for users of the package.
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/cabal.test.hs b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/cabal.test.hs
index 28a6cd72ac..4cb629752f 100644
--- a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/cabal.test.hs
+++ b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/NotIncluded/V3.0/cabal.test.hs
@@ -1,7 +1,5 @@
 import Test.Cabal.Prelude
 
-import System.Directory (createDirectoryIfMissing)
-
 -- Omitting ChangeLog.md but not README in extra-doc-files
 main = cabalTest $ do
   cabal "check" []
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/WrongField/V1.12/cabal.test.hs b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/WrongField/V1.12/cabal.test.hs
index 5bb91450c8..b491c58e1a 100644
--- a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/WrongField/V1.12/cabal.test.hs
+++ b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/WrongField/V1.12/cabal.test.hs
@@ -1,7 +1,5 @@
 import Test.Cabal.Prelude
 
-import System.Directory (createDirectoryIfMissing)
-
 -- Included ChangeLog.md but not in extra-doc-files
 main = cabalTest $ do
   cabal "check" []
diff --git a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/WrongField/V3.0/cabal.test.hs b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/WrongField/V3.0/cabal.test.hs
index 5bb91450c8..b491c58e1a 100644
--- a/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/WrongField/V3.0/cabal.test.hs
+++ b/cabal-testsuite/PackageTests/Check/PackageFiles/MissingExpectedDocFiles/ChangeLog/WrongField/V3.0/cabal.test.hs
@@ -1,7 +1,5 @@
 import Test.Cabal.Prelude
 
-import System.Directory (createDirectoryIfMissing)
-
 -- Included ChangeLog.md but not in extra-doc-files
 main = cabalTest $ do
   cabal "check" []
-- 
GitLab