diff options
| author | Joey Hess <joeyh@joeyh.name> | 2015-12-05 17:52:43 -0400 |
|---|---|---|
| committer | Joey Hess <joeyh@joeyh.name> | 2015-12-05 17:53:16 -0400 |
| commit | 12548bae3d8feecce6a322162d91b827289ae824 (patch) | |
| tree | 45f5ec5131817aab5133c9c1e4dbcf3364953e76 /src/Propellor/Property/Cmd.hs | |
| parent | b816e40e2618a8932144bceb7c7039adc5c44c11 (diff) | |
UncheckedProperty for cmdProperty et al
* Properties that run an arbitrary command, such as cmdProperty
and scriptProperty are converted to use UncheckedProperty, since
they cannot tell on their own if the command truely made a change or not.
(API Change)
Transition guide:
- When GHC complains about an UncheckedProperty, add:
`assume` MadeChange
- Since these properties used to always return MadeChange, that
change is always safe to make.
- Or, if you know that the command should modifiy a file, use:
`changesFile` filename
* A few properties have had their Result improved, for example
Apt.buldDep and Apt.autoRemove now check if a change was made or not.
Diffstat (limited to 'src/Propellor/Property/Cmd.hs')
| -rw-r--r-- | src/Propellor/Property/Cmd.hs | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/Propellor/Property/Cmd.hs b/src/Propellor/Property/Cmd.hs index 9536f71d..b02376a3 100644 --- a/src/Propellor/Property/Cmd.hs +++ b/src/Propellor/Property/Cmd.hs @@ -32,22 +32,31 @@ import Utility.Process (createProcess, CreateProcess, waitForProcess) -- | A property that can be satisfied by running a command. -- -- The command must exit 0 on success. -cmdProperty :: String -> [String] -> Property NoInfo +-- +-- This and other properties in this module are `UncheckedProperty`, +-- and return `NoChange`. It's up to the user to check if the command +-- made a change to the system, perhaps by using `checkResult` or +-- `changesFile`, or you can use @cmdProperty "foo" ["bar"] `assume` MadeChange@ +cmdProperty :: String -> [String] -> UncheckedProperty NoInfo cmdProperty cmd params = cmdProperty' cmd params id -cmdProperty' :: String -> [String] -> (CreateProcess -> CreateProcess) -> Property NoInfo -cmdProperty' cmd params mkprocess = property desc $ liftIO $ do - toResult <$> boolSystem' cmd (map Param params) mkprocess +cmdProperty' :: String -> [String] -> (CreateProcess -> CreateProcess) -> UncheckedProperty NoInfo +cmdProperty' cmd params mkprocess = unchecked $ property desc $ liftIO $ + cmdResult <$> boolSystem' cmd (map Param params) mkprocess where desc = unwords $ cmd : params +cmdResult :: Bool -> Result +cmdResult False = FailedChange +cmdResult True = NoChange + -- | A property that can be satisfied by running a command, -- with added environment variables in addition to the standard -- environment. -cmdPropertyEnv :: String -> [String] -> [(String, String)] -> Property NoInfo -cmdPropertyEnv cmd params env = property desc $ liftIO $ do +cmdPropertyEnv :: String -> [String] -> [(String, String)] -> UncheckedProperty NoInfo +cmdPropertyEnv cmd params env = unchecked $ property desc $ liftIO $ do env' <- addEntries env <$> getEnvironment - toResult <$> boolSystemEnv cmd (map Param params) (Just env') + cmdResult <$> boolSystemEnv cmd (map Param params) (Just env') where desc = unwords $ cmd : params @@ -55,14 +64,14 @@ cmdPropertyEnv cmd params env = property desc $ liftIO $ do type Script = [String] -- | A property that can be satisfied by running a script. -scriptProperty :: Script -> Property NoInfo +scriptProperty :: Script -> UncheckedProperty NoInfo scriptProperty script = cmdProperty "sh" ["-c", shellcmd] where shellcmd = intercalate " ; " ("set -e" : script) -- | A property that can satisfied by running a script -- as user (cd'd to their home directory). -userScriptProperty :: User -> Script -> Property NoInfo +userScriptProperty :: User -> Script -> UncheckedProperty NoInfo userScriptProperty (User user) script = cmdProperty "su" ["--shell", "/bin/sh", "-c", shellcmd, user] where shellcmd = intercalate " ; " ("set -e" : "cd" : script) |
