#4305: Add showCommandForUser to process:System.Process
---------------------------------+------------------------------------------
    Reporter:  igloo             |        Owner:              
        Type:  proposal          |       Status:  new         
    Priority:  normal            |    Milestone:  Not GHC     
   Component:  Compiler          |      Version:  6.12.3      
    Keywords:                    |     Testcase:              
   Blockedby:                    |   Difficulty:              
          Os:  Unknown/Multiple  |     Blocking:              
Architecture:  Unknown/Multiple  |      Failure:  None/Unknown
---------------------------------+------------------------------------------
Description changed by igloo:

Old description:

> 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.

New description:

 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.

--

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4305#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to