From a0b79e1b16887371d5cd14d53a607772ca730fb5 Mon Sep 17 00:00:00 2001
From: Stefan Holdermans <stefan@holdermans.nl>
Date: Mon, 20 Apr 2020 21:51:57 +0200
Subject: [PATCH] Allow GHCi :script file names in double quotes

This patch updates the user interface of GHCi so that file names passed
to the ':script' command can be wrapped in double quotes.

For example:

  :script "foo bar.script"

The implementation uses a modified version of 'words' that treats
character sequences enclosed in double quotes as single words.

Fixes #18027.
---
 ghc/GHCi/UI.hs                                | 7 +++++--
 testsuite/tests/ghci/should_run/T18027.script | 1 +
 testsuite/tests/ghci/should_run/T18027.stdout | 1 +
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/ghc/GHCi/UI.hs b/ghc/GHCi/UI.hs
index c1fce215c38..36e27dd5b46 100644
--- a/ghc/GHCi/UI.hs
+++ b/ghc/GHCi/UI.hs
@@ -2267,12 +2267,15 @@ scriptCmd ws = do
     [s]    -> runScript s
     _      -> throwGhcException (CmdLineError "syntax:  :script <filename>")
 
--- | A version of 'words' that does not break on backslash-escaped spaces.
--- E.g., 'words\' "lorem\\ ipsum dolor"' yields '["lorem ipsum", "dolor"]'.
+-- | A version of 'words' that treats sequences enclosed in double quotes as
+-- single words and that does not break on backslash-escaped spaces.
+-- E.g., 'words\' "\"lorem ipsum\" dolor"' and 'words\' "lorem\\ ipsum dolor"'
+-- yield '["lorem ipsum", "dolor"]'.
 -- Used to scan for file paths in 'scriptCmd'.
 words' :: String -> [String]
 words' s = case dropWhile isSpace s of
   "" -> []
+  s'@('\"' : _) | [(w, s'')] <- reads s' -> w : words' s''
   s' -> go id s'
  where
   go acc []                          = [acc []]
diff --git a/testsuite/tests/ghci/should_run/T18027.script b/testsuite/tests/ghci/should_run/T18027.script
index fd839d23927..bb13844f817 100644
--- a/testsuite/tests/ghci/should_run/T18027.script
+++ b/testsuite/tests/ghci/should_run/T18027.script
@@ -1 +1,2 @@
 :script T18027\ SPACE\ IN\ FILE\ NAME.script
+:script "T18027 SPACE IN FILE NAME.script"
diff --git a/testsuite/tests/ghci/should_run/T18027.stdout b/testsuite/tests/ghci/should_run/T18027.stdout
index d81cc0710eb..daaac9e3030 100644
--- a/testsuite/tests/ghci/should_run/T18027.stdout
+++ b/testsuite/tests/ghci/should_run/T18027.stdout
@@ -1 +1,2 @@
 42
+42
-- 
GitLab