@@ -10,6 +10,8 @@ module Language.PureScript.Publish
10 , runPrepareM
10 , runPrepareM
11 , PublishOptions(..)
11 , PublishOptions(..)
12 , defaultPublishOptions
12 , defaultPublishOptions
13+ , getGitWorkingTreeStatus
14+ , requireCleanWorkingTree
13 , getVersionFromGitTag
15 , getVersionFromGitTag
14 , getBowerInfo
16 , getBowerInfo
15 , getModulesAndBookmarks
17 , getModulesAndBookmarks
@@ -112,6 +114,8 @@ preparePackage' opts = do
112 exists <- liftIO (doesFileExist "bower.json")
114 exists <- liftIO (doesFileExist "bower.json")
113 unless exists (userError BowerJSONNotFound)
115 unless exists (userError BowerJSONNotFound)
117+ requireCleanWorkingTree
115 pkgMeta <- liftIO (Bower.decodeFile "bower.json")
119 pkgMeta <- liftIO (Bower.decodeFile "bower.json")
116 >>= flip catchLeft (userError . CouldntParseBowerJSON)
120 >>= flip catchLeft (userError . CouldntParseBowerJSON)
117 (pkgVersionTag, pkgVersion) <- publishGetVersion opts
121 (pkgVersionTag, pkgVersion) <- publishGetVersion opts
@@ -136,6 +140,22 @@ getModulesAndBookmarks = do
136 renderModules bookmarks modules =
140 renderModules bookmarks modules =
137 return (bookmarks, map D.convertModule modules)
141 return (bookmarks, map D.convertModule modules)
143+data TreeStatus = Clean | Dirty deriving (Show, Eq, Ord, Enum)
145+getGitWorkingTreeStatus :: PrepareM TreeStatus
146+getGitWorkingTreeStatus = do
147+ out <- readProcess' "git" ["status", "--porcelain"] ""
149+ if null . filter (not . null) . lines $ out
153+requireCleanWorkingTree :: PrepareM ()
154+requireCleanWorkingTree = do
155+ status <- getGitWorkingTreeStatus
156+ unless (status == Clean) $
157+ userError DirtyWorkingTree
139getVersionFromGitTag :: PrepareM (String, Version)
159getVersionFromGitTag :: PrepareM (String, Version)
140getVersionFromGitTag = do
160getVersionFromGitTag = do
141 out <- readProcess' "git" ["tag", "--list", "--points-at", "HEAD"] ""
161 out <- readProcess' "git" ["tag", "--list", "--points-at", "HEAD"] ""