summaryrefslogtreecommitdiff
path: root/src/Propellor/Property/SiteSpecific/GitHome.hs
blob: 2a66d1e2b3f6657c124e5169ab63426a663795fb (plain)
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
module Propellor.Property.SiteSpecific.GitHome where

import Propellor.Base
import qualified Propellor.Property.Apt as Apt
import Propellor.Property.User

-- | Clones Joey Hess's git home directory, and runs its fixups script.
installedFor :: User -> Property DebianLike
installedFor user@(User u) = check (not <$> hasGitDir user) $ 
	go `requires` Apt.installed ["git"]
  where
	go :: Property DebianLike
	go = property' ("githome " ++ u) $ \w -> do
		home <- liftIO (homedir user)
		let tmpdir = home </> "githome"
		ensureProperty w $ combineProperties "githome setup" $ toProps
			[ userScriptProperty user ["git clone " ++ url ++ " " ++ tmpdir]
				`assume` MadeChange
			, property "moveout" $ makeChange $ void $
				moveout tmpdir home
			, property "rmdir" $ makeChange $ void $
				catchMaybeIO $ removeDirectory tmpdir
			, userScriptProperty user ["rm -rf .aptitude/ .bashrc .profile"]
				`assume` MadeChange
			-- Set HOSTNAME so that this sees the right
			-- hostname when run in a chroot with a different
			-- hostname than the current one.
			, userScriptProperty user ["HOSTNAME=$(cat /etc/hostname) bin/mr checkout"]
				`assume` MadeChange
			, userScriptProperty user ["bin/fixups"]
				`assume` MadeChange
			]
	moveout tmpdir home = do
		fs <- dirContents tmpdir
		forM fs $ \f -> boolSystem "mv" [File f, File home]

url :: String
url = "git://git.kitenet.net/joey/home"

hasGitDir :: User -> IO Bool
hasGitDir user = go =<< homedir user
  where
	go home = doesDirectoryExist (home </> ".git")