summaryrefslogtreecommitdiff
path: root/src/Propellor/Property/Locale.hs
diff options
context:
space:
mode:
authorSean Whitton2015-11-25 19:25:45 -0700
committerJoey Hess2015-11-26 07:09:19 -0400
commit61cc4bab7d8e7cb37d0fb67740257c0e1828751c (patch)
treed1770980918f79f592ee09b281c9e97683fce3f0 /src/Propellor/Property/Locale.hs
parent2969b3b07f2eeb3472f237c6723b75007c34481e (diff)
locale props use descriptive types & revertable
Signed-off-by: Sean Whitton <spwhitton@spwhitton.name> (cherry picked from commit 6d10045ba74c1dc45e6aab4bae8b4757751c1920)
Diffstat (limited to 'src/Propellor/Property/Locale.hs')
-rw-r--r--src/Propellor/Property/Locale.hs60
1 files changed, 45 insertions, 15 deletions
diff --git a/src/Propellor/Property/Locale.hs b/src/Propellor/Property/Locale.hs
index 7cc98ed1..b179094f 100644
--- a/src/Propellor/Property/Locale.hs
+++ b/src/Propellor/Property/Locale.hs
@@ -7,33 +7,63 @@ import Propellor.Property.File
import Data.List (isPrefixOf)
+type Locale = String
+type LocaleVariable = String
+
-- | Select a locale for a list of global locale variables.
--
-- A locale variable is of the form `LC_BLAH`, `LANG` or `LANGUAGE`. See `man 5
-- locale`.
-selectedFor :: String -> [String] -> Property NoInfo
-locale `selectedFor` vars =
- trivial $ cmdProperty "update-locale" args
- `requires` available locale
- `describe` (locale ++ " locale selected")
+--
+-- Note that reverting this property does not make a locale unavailable. That's
+-- because it might be required for other Locale.selectedFor statements.
+selectedFor :: Locale -> [LocaleVariable] -> RevertableProperty NoInfo
+locale `selectedFor` vars = select <!> deselect
where
- args = zipWith (++) vars (repeat ('=':locale))
+ select =
+ trivial $ cmdProperty "update-locale" selectArgs
+ `requires` available locale
+ `describe` (locale ++ " locale selected")
+ deselect =
+ trivial $ cmdProperty "update-locale" vars
+ `describe` (locale ++ " locale deselected")
+ selectArgs = zipWith (++) vars (repeat ('=':locale))
--- | Ensures a locale is generated.
+-- | Ensures a locale is generated (or, if reverted, ensure it's not).
--
--- Assumes a locale is available to be generated. That is, a commented out
--- entry for the locale and an accompanying charset is present in
+-- Fails if a locale is not available to be generated. That is, a commented out
+-- entry for the locale and an accompanying charset must be present in
-- /etc/locale.gen.
--
-- Per Debian bug #684134 we cannot ensure a locale is generated by means of
-- Apt.reConfigure. So localeAvailable edits /etc/locale.gen manually.
-available :: String -> Property NoInfo
-available locale =
- fileProperty (locale ++ " locale generated") go "/etc/locale.gen"
- `onChange` cmdProperty "dpkg-reconfigure" ["-f", "noninteractive", "locales"]
+available :: Locale -> RevertableProperty NoInfo
+available locale = (ensureAvailable <!> ensureUnavailable)
where
- go = foldr step []
- step l ls =
+ f = "/etc/locale.gen"
+ desc = (locale ++ " locale generated")
+ ensureAvailable =
+ property desc $ (lines <$> (liftIO $ readFile f))
+ >>= \locales ->
+ if locale `presentIn` locales
+ then ensureProperty $
+ fileProperty desc (foldr uncomment []) f
+ `onChange` regenerate
+ else return FailedChange -- locale unavailable for generation
+ ensureUnavailable =
+ fileProperty (locale ++ " locale not generated") (foldr comment []) f
+ `onChange` regenerate
+
+ uncomment l ls =
if ("# " ++ locale) `isPrefixOf` l
then drop 2 l : ls
else l:ls
+ comment l ls =
+ if locale `isPrefixOf` l
+ then ("# " ++ l) : ls
+ else l:ls
+
+ l `presentIn` ls = any (l `isPrefix`) ls
+ l `isPrefix` x = (l `isPrefixOf` x) || (("# " ++ l) `isPrefixOf` x)
+
+ regenerate = cmdProperty "dpkg-reconfigure" ["-f", "noninteractive", "locales"]