Add showCommandForUser to process:System.Process
|Reported by:||igloo||Owned by:|
|Type of failure:||None/Unknown||Test Case:|
|Related Tickets:||Differential Rev(s):|
Description (last modified by igloo)
There are many programs (e.g. ghc and Cabal) which run other programs, and when run with -v want to show the user what they are running. The user then often wants to run the command by hand, in order to debug a problem, but this can be tricky when the command or its arguments include spaces or other characters treated specially by shells.
This proposal is for a System.Process.showCommandForUser function in the process package, such that showCommandForUser cmd args can be copied and pasted directly into a shell.
I would have put this in System.Cmd, except that module is earmarked to be deprecated.
The code already existed within System.Process; I've just rearranged it a bit:
showCommandForUser :: FilePath -> [String] -> String showCommandForUser cmd args = unwords (map translate (cmd : args)) translate :: String -> String #if mingw32_HOST_OS translate str = '"' : snd (foldr escape (True,"\"") str) where escape '"' (b, str) = (True, '\\' : '"' : str) escape '\\' (True, str) = (True, '\\' : '\\' : str) escape '\\' (False, str) = (False, '\\' : str) escape c (b, str) = (False, c : str) #else translate str = '\'' : foldr escape "'" str where escape '\'' = showString "'\\''" escape c = showChar c #endif
The fallback for rawSystem is now
rawSystem cmd args = system (showCommandForUser cmd args)
except with hugs on Windows, where for some reason it's
rawSystem cmd args = system (cmd ++ showCommandForUser "" args)
which is surely wrong, but how it behaved before.
Discussion period: 2 weeks, until 26 Sep 2010.