@@ -28,9 +28,12 @@ import GHC.Generics (Generic)
28import qualified Options.Applicative as Opts
28import qualified Options.Applicative as Opts
29import qualified Paths_purescript as Paths
29import qualified Paths_purescript as Paths
30import qualified System.IO as IO
30import qualified System.IO as IO
31−import Turtle hiding (fold, s, x)
31+import Turtle hiding (echo, fold, s, x)
32import qualified Turtle
32import qualified Turtle
34+echoT :: Text -> IO ()
35+echoT = Turtle.printf (Turtle.s % "\n")
34packageFile :: Path.FilePath
37packageFile :: Path.FilePath
35packageFile = "psc-package.json"
38packageFile = "psc-package.json"
@@ -56,12 +59,12 @@ readPackageFile :: IO PackageConfig
56readPackageFile = do
59readPackageFile = do
57 exists <- testfile packageFile
60 exists <- testfile packageFile
58 unless exists $ do
61 unless exists $ do
59− echo "psc-package.json does not exist"
62+ echoT "psc-package.json does not exist"
60 exit (ExitFailure 1)
63 exit (ExitFailure 1)
61 mpkg <- Aeson.decodeStrict . encodeUtf8 <$> readTextFile packageFile
64 mpkg <- Aeson.decodeStrict . encodeUtf8 <$> readTextFile packageFile
62 case mpkg of
65 case mpkg of
63 Nothing -> do
66 Nothing -> do
64− echo "Unable to parse psc-package.json"
67+ echoT "Unable to parse psc-package.json"
65 exit (ExitFailure 1)
68 exit (ExitFailure 1)
66 Just pkg -> return pkg
69 Just pkg -> return pkg
@@ -124,13 +127,13 @@ listRemoteTags
125 -- ^ repo
128 -- ^ repo
126 -> Turtle.Shell Text
129 -> Turtle.Shell Text
127−listRemoteTags from =
130+listRemoteTags from = let gitProc = inproc "git"
129− [ "ls-remote"
131+ [ "ls-remote"
136+ in lineToText <$> gitProc
135getPackageSet :: PackageConfig -> IO ()
138getPackageSet :: PackageConfig -> IO ()
136getPackageSet PackageConfig{ source, set } = do
139getPackageSet PackageConfig{ source, set } = do
@@ -143,12 +146,12 @@ readPackageSet PackageConfig{ set } = do
143 let dbFile = ".psc-package" </> fromText set </> ".set" </> "packages.json"
146 let dbFile = ".psc-package" </> fromText set </> ".set" </> "packages.json"
144 exists <- testfile dbFile
147 exists <- testfile dbFile
145 unless exists $ do
148 unless exists $ do
146− echo $ format (fp%" does not exist") dbFile
149+ echoT $ format (fp%" does not exist") dbFile
147 exit (ExitFailure 1)
150 exit (ExitFailure 1)
148 mdb <- Aeson.decodeStrict . encodeUtf8 <$> readTextFile dbFile
151 mdb <- Aeson.decodeStrict . encodeUtf8 <$> readTextFile dbFile
149 case mdb of
152 case mdb of
150 Nothing -> do
153 Nothing -> do
151− echo "Unable to parse packages.json"
154+ echoT "Unable to parse packages.json"
152 exit (ExitFailure 1)
155 exit (ExitFailure 1)
153 Just db -> return db
156 Just db -> return db
@@ -159,7 +162,7 @@ writePackageSet PackageConfig{ set } =
160installOrUpdate :: Text -> Text -> PackageInfo -> IO Turtle.FilePath
163installOrUpdate :: Text -> Text -> PackageInfo -> IO Turtle.FilePath
161installOrUpdate set pkgName PackageInfo{ repo, version } = do
164installOrUpdate set pkgName PackageInfo{ repo, version } = do
162− echo ("Updating " <> pkgName)
165+ echoT ("Updating " <> pkgName)
163 let pkgDir = ".psc-package" </> fromText set </> fromText pkgName </> fromText version
166 let pkgDir = ".psc-package" </> fromText set </> fromText pkgName </> fromText version
164 exists <- testdir pkgDir
167 exists <- testdir pkgDir
165 unless exists . void $ cloneShallow repo version pkgDir
168 unless exists . void $ cloneShallow repo version pkgDir
@@ -170,7 +173,7 @@ getTransitiveDeps db depends = do
170 pkgs <- for depends $ \pkg ->
173 pkgs <- for depends $ \pkg ->
171 case Map.lookup pkg db of
174 case Map.lookup pkg db of
172 Nothing -> do
175 Nothing -> do
173− echo ("Package " <> pkg <> " does not exist in package set")
176+ echoT ("Package " <> pkg <> " does not exist in package set")
174 exit (ExitFailure 1)
177 exit (ExitFailure 1)
175 Just PackageInfo{ dependencies } -> return (pkg : dependencies)
178 Just PackageInfo{ dependencies } -> return (pkg : dependencies)
176 let unique = Set.toList (foldMap Set.fromList pkgs)
179 let unique = Set.toList (foldMap Set.fromList pkgs)
@@ -181,16 +184,16 @@ updateImpl config@PackageConfig{ depends } = do
181 getPackageSet config
184 getPackageSet config
182 db <- readPackageSet config
185 db <- readPackageSet config
183 trans <- getTransitiveDeps db depends
186 trans <- getTransitiveDeps db depends
184− echo ("Updating " <> pack (show (length trans)) <> " packages...")
187+ echoT ("Updating " <> pack (show (length trans)) <> " packages...")
185 for_ trans $ \(pkgName, pkg) -> installOrUpdate (set config) pkgName pkg
188 for_ trans $ \(pkgName, pkg) -> installOrUpdate (set config) pkgName pkg
187initialize :: IO ()
190initialize :: IO ()
188initialize = do
191initialize = do
189 exists <- testfile "psc-package.json"
192 exists <- testfile "psc-package.json"
190 when exists $ do
193 when exists $ do
191− echo "psc-package.json already exists"
194+ echoT "psc-package.json already exists"
192 exit (ExitFailure 1)
195 exit (ExitFailure 1)
193− echo "Initializing new project in current directory"
196+ echoT "Initializing new project in current directory"
194 pkgName <- pathToTextUnsafe . Path.filename <$> pwd
197 pkgName <- pathToTextUnsafe . Path.filename <$> pwd
195 let pkg = defaultPackage pkgName
198 let pkg = defaultPackage pkgName
196 writePackageFile pkg
199 writePackageFile pkg
@@ -200,7 +203,7 @@ update :: IO ()
200update = do
203update = do
201 pkg <- readPackageFile
204 pkg <- readPackageFile
202 updateImpl pkg
205 updateImpl pkg
203− echo "Update complete"
206+ echoT "Update complete"
205install :: String -> IO ()
208install :: String -> IO ()
206install pkgName = do
209install pkgName = do
@@ -208,7 +211,7 @@ install pkgName = do
208 let pkg' = pkg { depends = nub (pack pkgName : depends pkg) }
211 let pkg' = pkg { depends = nub (pack pkgName : depends pkg) }
209 updateImpl pkg'
212 updateImpl pkg'
210 writePackageFile pkg'
213 writePackageFile pkg'
211− echo "psc-package.json file was updated"
214+ echoT "psc-package.json file was updated"
213uninstall :: String -> IO ()
216uninstall :: String -> IO ()
214uninstall pkgName = do
217uninstall pkgName = do
@@ -216,20 +219,20 @@ uninstall pkgName = do
216 let pkg' = pkg { depends = filter (/= pack pkgName) $ depends pkg }
219 let pkg' = pkg { depends = filter (/= pack pkgName) $ depends pkg }
217 updateImpl pkg'
220 updateImpl pkg'
218 writePackageFile pkg'
221 writePackageFile pkg'
219− echo "psc-package.json file was updated"
222+ echoT "psc-package.json file was updated"
221listDependencies :: IO ()
224listDependencies :: IO ()
222listDependencies = do
225listDependencies = do
223 pkg@PackageConfig{ depends } <- readPackageFile
226 pkg@PackageConfig{ depends } <- readPackageFile
224 db <- readPackageSet pkg
227 db <- readPackageSet pkg
225 trans <- getTransitiveDeps db depends
228 trans <- getTransitiveDeps db depends
226− traverse_ (echo . fst) trans
229+ traverse_ (echoT . fst) trans
228listPackages :: IO ()
231listPackages :: IO ()
229listPackages = do
232listPackages = do
230 pkg <- readPackageFile
233 pkg <- readPackageFile
231 db <- readPackageSet pkg
234 db <- readPackageSet pkg
232− traverse_ echo (fmt <$> Map.assocs db)
235+ traverse_ echoT (fmt <$> Map.assocs db)
234 fmt :: (Text, PackageInfo) -> Text
237 fmt :: (Text, PackageInfo) -> Text
235 fmt (name, PackageInfo{ version }) = name <> " (" <> version <> ")"
238 fmt (name, PackageInfo{ version }) = name <> " (" <> version <> ")"
@@ -251,7 +254,7 @@ listSourcePaths = do
251 pkg@PackageConfig{ depends } <- readPackageFile
254 pkg@PackageConfig{ depends } <- readPackageFile
252 db <- readPackageSet pkg
255 db <- readPackageSet pkg
253 paths <- getSourcePaths pkg db depends
256 paths <- getSourcePaths pkg db depends
254− traverse_ (echo . pathToTextUnsafe) paths
257+ traverse_ (echoT . pathToTextUnsafe) paths
256exec :: Text -> IO ()
259exec :: Text -> IO ()
257exec exeName = do
260exec exeName = do
@@ -267,11 +270,11 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
267 pkg <- readPackageFile
270 pkg <- readPackageFile
268 db <- readPackageSet pkg
271 db <- readPackageSet pkg
270− echo ("Checking " <> pack (show (Map.size db)) <> " packages for updates.")
273+ echoT ("Checking " <> pack (show (Map.size db)) <> " packages for updates.")
271− echo "Warning: this could take some time!"
274+ echoT "Warning: this could take some time!"
273 newDb <- Map.fromList <$> (for (Map.toList db) $ \(name, p@PackageInfo{ repo, version }) -> do
276 newDb <- Map.fromList <$> (for (Map.toList db) $ \(name, p@PackageInfo{ repo, version }) -> do
274− echo ("Checking package " <> name)
277+ echoT ("Checking package " <> name)
275 tagLines <- Turtle.fold (listRemoteTags repo) Foldl.list
278 tagLines <- Turtle.fold (listRemoteTags repo) Foldl.list
276 let tags = mapMaybe parseTag tagLines
279 let tags = mapMaybe parseTag tagLines
277 newVersion <- case parseVersion version of
280 newVersion <- case parseVersion version of
@@ -280,7 +283,7 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
280 case filter (isMinorReleaseFrom parts) tags of
283 case filter (isMinorReleaseFrom parts) tags of
281 [] -> pure version
284 [] -> pure version
282 minorReleases -> do
285 minorReleases -> do
283− echo ("New minor release available")
286+ echoT ("New minor release available")
284 case applyMinorUpdates of
287 case applyMinorUpdates of
285 True -> do
288 True -> do
286 let latestMinorRelease = maximum minorReleases
289 let latestMinorRelease = maximum minorReleases
@@ -290,7 +293,7 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
290 case filter (isMajorReleaseFrom parts) tags of
293 case filter (isMajorReleaseFrom parts) tags of
291 [] -> applyMinor
294 [] -> applyMinor
292 newReleases -> do
295 newReleases -> do
293− echo ("New major release available")
296+ echoT ("New major release available")
294 case applyMajorUpdates of
297 case applyMajorUpdates of
295 True -> do
298 True -> do
296 let latestRelease = maximum newReleases
299 let latestRelease = maximum newReleases
@@ -298,7 +301,7 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
298 False -> applyMinor
301 False -> applyMinor
299 in applyMajor
302 in applyMajor
301− echo "Unable to parse version string"
304+ echoT "Unable to parse version string"
302 pure version
305 pure version
303 pure (name, p { version = newVersion }))
306 pure (name, p { version = newVersion }))
@@ -345,15 +348,15 @@ verifyPackageSet = do
345 pkg <- readPackageFile
348 pkg <- readPackageFile
346 db <- readPackageSet pkg
349 db <- readPackageSet pkg
348− echo ("Verifying " <> pack (show (Map.size db)) <> " packages.")
351+ echoT ("Verifying " <> pack (show (Map.size db)) <> " packages.")
349− echo "Warning: this could take some time!"
352+ echoT "Warning: this could take some time!"
351 let installOrUpdate' (name, pkgInfo) = (name, ) <$> installOrUpdate (set pkg) name pkgInfo
354 let installOrUpdate' (name, pkgInfo) = (name, ) <$> installOrUpdate (set pkg) name pkgInfo
352 paths <- Map.fromList <$> traverse installOrUpdate' (Map.toList db)
355 paths <- Map.fromList <$> traverse installOrUpdate' (Map.toList db)
354 for_ (Map.toList db) $ \(name, PackageInfo{..}) -> do
357 for_ (Map.toList db) $ \(name, PackageInfo{..}) -> do
355 let dirFor = fromMaybe (error "verifyPackageSet: no directory") . (`Map.lookup` paths)
358 let dirFor = fromMaybe (error "verifyPackageSet: no directory") . (`Map.lookup` paths)
356− echo ("Verifying package " <> name)
359+ echoT ("Verifying package " <> name)
357 let srcGlobs = map (pathToTextUnsafe . (</> ("src" </> "**" </> "*.purs")) . dirFor) (name : dependencies)
360 let srcGlobs = map (pathToTextUnsafe . (</> ("src" </> "**" </> "*.purs")) . dirFor) (name : dependencies)
358 procs "psc" srcGlobs empty
361 procs "psc" srcGlobs empty