Proposal: Add showCommandForUser to process:System.Process

Conrad Parker conrad at metadecks.org
Sun Sep 12 19:44:59 EDT 2010


On 12 September 2010 21:24, Ian Lynagh <igloo at earth.li> wrote:
>
> Add showCommandForUser to process:System.Process
> http://hackage.haskell.org/trac/ghc/ticket/4305
>
> 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.

+1

I think this is an important use-case, and the need for cross-platform
support justifies having it in the library.

A related use-case which would also use this function is a --dry-run
option that just prints out the command without running it (like "make
-n", "darcs send --dry-run" etc.) which is useful for, um,
non-destructive debugging.

Conrad.

>
> 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.
>
>
> Thanks
> Ian
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
>
>


More information about the Libraries mailing list