summaryrefslogtreecommitdiff
path: root/propellor.hs
blob: e4653f3070bfc5ff18442951bc73791cbaf1b241 (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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
-- | Wrapper program for propellor distribution.
--
-- Distributions should install this program into PATH.
-- (Cabal builds it as dict/build/propellor.
--
-- This is not the propellor main program (that's config.hs)
--
-- This installs propellor's source into ~/.propellor,
-- uses it to build the real propellor program (if not already built),
-- and runs it.
-- 
-- The source is either copied from /usr/src/propellor, or is cloned from
-- git over the network.

import Utility.UserInfo
import Utility.Monad
import Utility.Process
import Utility.SafeCommand
import Utility.Directory

import Control.Monad
import Control.Monad.IfElse
import System.Directory
import System.FilePath
import System.Environment (getArgs)
import System.Exit
import System.Posix.Directory

srcdir :: FilePath
srcdir = "/usr/src/propellor"

-- Using the github mirror of the main propellor repo because
-- it is accessible over https for better security.
srcrepo :: String
srcrepo = "https://github.com/joeyh/propellor.git"

main :: IO ()
main = do
	args <- getArgs
	home <- myHomeDir
	let propellordir = home </> ".propellor"
	let propellorbin = propellordir </> "propellor"
	wrapper args propellordir propellorbin

wrapper :: [String] -> FilePath -> FilePath -> IO ()
wrapper args propellordir propellorbin = do
	unlessM (doesDirectoryExist propellordir) $
		makeRepo
	buildruncfg
  where
	chain = do
		(_, _, _, pid) <- createProcess (proc propellorbin args) 
		exitWith =<< waitForProcess pid
	makeRepo = do
		putStrLn $ "Setting up your propellor repo in " ++ propellordir
		putStrLn ""
		ifM (doesDirectoryExist srcdir)
			( do
				void $ boolSystem "cp" [Param "-a", File srcdir, File propellordir]
				changeWorkingDirectory propellordir
				void $ boolSystem "git" [Param "init"]
				void $ boolSystem "git" [Param "add", Param "."]
				setuprepo True
			, do
				void $ boolSystem "git" [Param "clone", Param srcrepo, File propellordir] 
				void $ boolSystem "git" [Param "remote", Param "rm", Param "origin"]
				setuprepo False
			)
	setuprepo fromsrcdir = do
		changeWorkingDirectory propellordir
		whenM (doesDirectoryExist "privdata") $
			mapM_ nukeFile =<< dirContents "privdata"
		void $ boolSystem "git" [Param "commit", Param "--allow-empty", Param "--quiet", Param "-m", Param "setting up propellor git repository"]
		void $ boolSystem "git" [Param "remote", Param "add", Param "upstream", Param srcrepo]
		-- Connect synthetic git repo with upstream history so
		-- merging with upstream will work going forward.
		-- Note -s outs is used to avoid getting any divergent
		-- changes from upstream.
		when fromsrcdir $ do
			void $ boolSystem "git" [Param "fetch", Param "upstream"]
			version <- readProcess "dpkg-query" ["--showformat", "${Version}", "--show", "propellor"]
			void $ boolSystem "git" [Param "merge", Param "-s", Param "ours", Param version]
	buildruncfg = do
		changeWorkingDirectory propellordir
		ifM (boolSystem "make" [Param "build"])
			( do
				putStrLn ""
				putStrLn ""
				chain
			, error "Propellor build failed."
			)