From 81fae63a5429266fd04c25a8da8fa442eee8c788 Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Thu, 14 Nov 2019 18:42:55 -0800
Subject: Change optInputFiles to a `Maybe [FilePath]`.

`Nothing` means: nothing specified.
`Just []` means: an empty list specified (e.g. in defaults).
Potentially these could lead to different behavior: see #5888.
---
 src/Text/Pandoc/App.hs                    | 12 ++++++------
 src/Text/Pandoc/App/CommandLineOptions.hs |  6 +++++-
 src/Text/Pandoc/App/Opt.hs                | 13 +++++++------
 src/Text/Pandoc/App/OutputSettings.hs     |  5 +++--
 4 files changed, 21 insertions(+), 15 deletions(-)

(limited to 'src')

diff --git a/src/Text/Pandoc/App.hs b/src/Text/Pandoc/App.hs
index ecbdeecd8..4dcd76a24 100644
--- a/src/Text/Pandoc/App.hs
+++ b/src/Text/Pandoc/App.hs
@@ -75,7 +75,7 @@ convertWithOpts opts = do
 
   when (optDumpArgs opts) $
     do UTF8.hPutStrLn stdout outputFile
-       mapM_ (UTF8.hPutStrLn stdout) (optInputFiles opts)
+       mapM_ (UTF8.hPutStrLn stdout) (fromMaybe ["-"] $ optInputFiles opts)
        exitSuccess
 
   let isPandocCiteproc (JSONFilter f) = takeBaseName f == "pandoc-citeproc"
@@ -88,9 +88,9 @@ convertWithOpts opts = do
   let filters' = filters ++ [ JSONFilter "pandoc-citeproc" | needsCiteproc ]
 
   let sources = case optInputFiles opts of
-                     []  -> ["-"]
-                     xs | optIgnoreArgs opts -> ["-"]
-                        | otherwise  -> xs
+                     Nothing -> ["-"]
+                     Just xs | optIgnoreArgs opts -> ["-"]
+                             | otherwise  -> xs
 
   datadir <- case optDataDir opts of
                   Nothing   -> do
@@ -132,7 +132,7 @@ convertWithOpts opts = do
 
   runIO' $ do
     setUserDataDir datadir
-    setInputFiles (optInputFiles opts)
+    setInputFiles (fromMaybe ["-"] (optInputFiles opts))
     setOutputFile (optOutputFile opts)
 
     -- assign reader and writer based on options and filenames
@@ -151,7 +151,7 @@ convertWithOpts opts = do
 
     when (pdfOutput && readerName == "latex") $
       case (optInputFiles opts) of
-        (inputFile:_) -> report $ UnusualConversion $ T.pack $
+        Just (inputFile:_) -> report $ UnusualConversion $ T.pack $
           "to convert a .tex file to PDF, you get better results by using pdflatex "
             <> "(or lualatex or xelatex) directly, try `pdflatex " <> inputFile
             <> "` instead of `pandoc " <> inputFile <> " -o " <> outputFile <> "`."
diff --git a/src/Text/Pandoc/App/CommandLineOptions.hs b/src/Text/Pandoc/App/CommandLineOptions.hs
index 56b1f780a..1776107ff 100644
--- a/src/Text/Pandoc/App/CommandLineOptions.hs
+++ b/src/Text/Pandoc/App/CommandLineOptions.hs
@@ -85,7 +85,11 @@ parseOptions options' defaults = do
 
   -- thread option data structure through all supplied option actions
   opts <- foldl (>>=) (return defaults) actions
-  return (opts{ optInputFiles = map normalizePath $ optInputFiles opts ++ args })
+  let mbArgs = case args of
+                 [] -> Nothing
+                 xs -> Just xs
+  return $ opts{ optInputFiles =
+                   map normalizePath <$> (optInputFiles opts <> mbArgs) }
 
 latexEngines :: [String]
 latexEngines  = ["pdflatex", "lualatex", "xelatex", "latexmk", "tectonic"]
diff --git a/src/Text/Pandoc/App/Opt.hs b/src/Text/Pandoc/App/Opt.hs
index 402d09bb7..ed167fff2 100644
--- a/src/Text/Pandoc/App/Opt.hs
+++ b/src/Text/Pandoc/App/Opt.hs
@@ -85,7 +85,7 @@ data Opt = Opt
     , optMetadata              :: Meta -- ^ Metadata fields to set
     , optMetadataFiles         :: [FilePath]  -- ^ Name of YAML metadata files
     , optOutputFile            :: Maybe FilePath  -- ^ Name of output file
-    , optInputFiles            :: [FilePath] -- ^ Names of input files
+    , optInputFiles            :: Maybe [FilePath] -- ^ Names of input files
     , optNumberSections        :: Bool    -- ^ Number sections in LaTeX
     , optNumberOffset          :: [Int]   -- ^ Starting number for sections
     , optSectionDivs           :: Bool    -- ^ Put sections in div tags in HTML
@@ -200,16 +200,17 @@ doOpt (k',v) = do
     "output-file" ->
       parseYAML v >>= \x -> return (\o -> o{ optOutputFile = unpack <$> x })
     "input-files" ->
-      parseYAML v >>= \x -> return (\o -> o{ optInputFiles = optInputFiles o <>
-                                              map unpack x })
+      parseYAML v >>= \x -> return (\o -> o{ optInputFiles =
+                                              optInputFiles o <>
+                                              Just (map unpack x) })
     "input-file" -> -- allow either a list or a single value
       (parseYAML v >>= \x -> return (\o -> o{ optInputFiles =
                                                 optInputFiles o <>
-                                                map unpack x }))
+                                                Just (map unpack x) }))
       <|>
       (parseYAML v >>= \x -> return (\o -> o{ optInputFiles =
                                                 optInputFiles o <>
-                                                [unpack x] }))
+                                                Just [unpack x] }))
     "number-sections" ->
       parseYAML v >>= \x -> return (\o -> o{ optNumberSections = x })
     "number-offset" ->
@@ -390,7 +391,7 @@ defaultOpts = Opt
     , optMetadata              = mempty
     , optMetadataFiles         = []
     , optOutputFile            = Nothing
-    , optInputFiles            = []
+    , optInputFiles            = Nothing
     , optNumberSections        = False
     , optNumberOffset          = [0,0,0,0,0,0]
     , optSectionDivs           = False
diff --git a/src/Text/Pandoc/App/OutputSettings.hs b/src/Text/Pandoc/App/OutputSettings.hs
index 4f33bd336..944f1b63b 100644
--- a/src/Text/Pandoc/App/OutputSettings.hs
+++ b/src/Text/Pandoc/App/OutputSettings.hs
@@ -63,7 +63,7 @@ optToOutputSettings opts = do
 
   when (optDumpArgs opts) . liftIO $ do
     UTF8.hPutStrLn stdout outputFile
-    mapM_ (UTF8.hPutStrLn stdout) (optInputFiles opts)
+    mapM_ (UTF8.hPutStrLn stdout) (fromMaybe [] $ optInputFiles opts)
     exitSuccess
 
   epubMetadata <- case optEpubMetadata opts of
@@ -140,7 +140,8 @@ optToOutputSettings opts = do
   variables <-
     return (optVariables opts)
     >>=
-    setListVariableM "sourcefile" (T.pack <$> optInputFiles opts)
+    setListVariableM "sourcefile"
+      (maybe ["-"] (fmap T.pack) (optInputFiles opts))
     >>=
     setVariableM "outputfile" outputFile
     >>=
-- 
cgit v1.2.3