File: Shell.hs

package info (click to toggle)
git-annex 7.20190129-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 56,292 kB
  • sloc: haskell: 59,105; sh: 1,255; makefile: 225; perl: 136; ansic: 44
file content (54 lines) | stat: -rw-r--r-- 1,224 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{- /bin/sh handling
 -
 - Copyright 2013 Joey Hess <id@joeyh.name>
 -
 - License: BSD-2-clause
 -}

{-# LANGUAGE CPP #-}

module Utility.Shell where

import Utility.SafeCommand
#ifdef mingw32_HOST_OS
import Utility.Path
import Utility.Exception
import Utility.PartialPrelude
#endif

#ifdef mingw32_HOST_OS
import System.FilePath
#endif

shellPath :: FilePath
shellPath = "/bin/sh"

shebang :: String
shebang = "#!" ++ shellPath

-- | On Windows, shebang is not handled by the kernel, so to support
-- shell scripts etc, have to look at the program being run and
-- parse it for shebang.
--
-- This has no effect on Unix.
findShellCommand :: FilePath -> IO (FilePath, [CommandParam])
findShellCommand f = do
#ifndef mingw32_HOST_OS
	defcmd
#else
	l <- catchDefaultIO Nothing $ headMaybe . lines <$> readFile f
	case l of
		Just ('#':'!':rest) -> case words rest of
			[] -> defcmd
			(c:ps) -> do
				let ps' = map Param ps ++ [File f]
				-- If the command is not inPath,
				-- take the base of it, and run eg "sh"
				-- which in some cases on windows will work
				-- despite it not being inPath.
				ok <- inPath c
				return (if ok then c else takeFileName c, ps')
		_ -> defcmd
#endif
  where
	defcmd = return (f, [])