summaryrefslogtreecommitdiff
path: root/propellor.hs
diff options
context:
space:
mode:
Diffstat (limited to 'propellor.hs')
-rw-r--r--propellor.hs91
1 files changed, 91 insertions, 0 deletions
diff --git a/propellor.hs b/propellor.hs
new file mode 100644
index 00000000..e4653f30
--- /dev/null
+++ b/propellor.hs
@@ -0,0 +1,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."
+ )