@@ -7,8 +7,10 @@ module Obelisk.Command.Project
77 , findProjectObeliskCommand
88 , findProjectRoot
99 , withProjectRoot
10+ , inProjectProc
1011 , inProjectShell
1112 , inImpureProjectShell
13+ , projectProc
1214 , projectShell
1315
1416 , toObeliskDir
@@ -18,6 +20,7 @@ module Obelisk.Command.Project
1820import Control.Monad
1921import Control.Monad.IO.Class (liftIO)
2022import Control.Monad.State
23+import qualified Data.ByteString.UTF8 as BSU
2124import Data.Bits
2225import Data.Function (on)
2326import qualified Data.Text as T
@@ -27,6 +30,7 @@ import System.IO.Temp
2730import System.Posix (FileStatus, UserID, deviceID, fileID, fileMode, fileOwner, getFileStatus, getRealUserID)
2831import System.Posix.Files
2932import System.Process (CreateProcess, cwd, proc, waitForProcess, delegate_ctlc)
33+import Text.ShellEscape (Bash, bytes)
3034
3135import GitHub.Data.GitData (Branch)
3236import GitHub.Data.Name (Name)
@@ -193,6 +197,10 @@ walkToImplDir projectRoot myUid = do
193197isWritableOnlyBy :: FileStatus -> UserID -> Bool
194198isWritableOnlyBy s uid = fileOwner s == uid && fileMode s .&. 0o22 == 0
195199
200+inProjectProc :: MonadObelisk m => String -> [Bash] -> m ()
201+inProjectProc shellName command = withProjectRoot "." $ \root ->
202+ projectProc root True shellName (Just command)
203+
196204-- | Run a command in the given shell for the current project
197205inProjectShell :: MonadObelisk m => String -> String -> m ()
198206inProjectShell shellName command = withProjectRoot "." $ \root ->
@@ -202,6 +210,12 @@ inImpureProjectShell :: MonadObelisk m => String -> String -> m ()
202210inImpureProjectShell shellName command = withProjectRoot "." $ \root ->
203211 projectShell root False shellName (Just command)
204212
213+projectProc :: MonadObelisk m => FilePath -> Bool -> String -> Maybe [Bash] -> m ()
214+projectProc root isPure shellName command =
215+ projectShell root isPure shellName $ commandToString <$> command
216+ where
217+ commandToString = unwords . fmap (BSU.toString . bytes)
218+
205219projectShell :: MonadObelisk m => FilePath -> Bool -> String -> Maybe String -> m ()
206220projectShell root isPure shellName command = do
207221 (_, _, _, ph) <- createProcess_ "runNixShellAttr" $ setCtlc $ setCwd (Just root) $ proc "nix-shell" $
@@ -213,7 +227,7 @@ projectShell root isPure shellName command = do
213227 , "shells." <> shellName
214228 ] <> case command of
215229 Nothing -> []
216− Just c -> ["--run", c]
230+ Just c -> ["--run", c]
217231 void $ liftIO $ waitForProcess ph
218232
219233setCtlc :: CreateProcess -> CreateProcess