@@ -28,9 +28,12 @@ import GHC.Generics (Generic)
2828import qualified Options.Applicative as Opts
2929import qualified Paths_purescript as Paths
3030import qualified System.IO as IO
31−import Turtle hiding (fold, s, x)
31+import Turtle hiding (echo, fold, s, x)
3232import qualified Turtle
3333
34+echoT :: Text -> IO ()
35+echoT = Turtle.printf (Turtle.s % "\n")
36+
3437packageFile :: Path.FilePath
3538packageFile = "psc-package.json"
3639
@@ -56,12 +59,12 @@ readPackageFile :: IO PackageConfig
5659readPackageFile = do
5760 exists <- testfile packageFile
5861 unless exists $ do
59− echo "psc-package.json does not exist"
62+ echoT "psc-package.json does not exist"
6063 exit (ExitFailure 1)
6164 mpkg <- Aeson.decodeStrict . encodeUtf8 <$> readTextFile packageFile
6265 case mpkg of
6366 Nothing -> do
64− echo "Unable to parse psc-package.json"
67+ echoT "Unable to parse psc-package.json"
6568 exit (ExitFailure 1)
6669 Just pkg -> return pkg
6770
@@ -124,13 +127,13 @@ listRemoteTags
124127 :: Text
125128 -- ^ repo
126129 -> Turtle.Shell Text
127−listRemoteTags from =
128− inproc "git"
129− [ "ls-remote"
130− , "-q"
131− , "-t"
132− , from
133− ] empty
130+listRemoteTags from = let gitProc = inproc "git"
131+ [ "ls-remote"
132+ , "-q"
133+ , "-t"
134+ , from
135+ ] empty
136+ in lineToText <$> gitProc
134137
135138getPackageSet :: PackageConfig -> IO ()
136139getPackageSet PackageConfig{ source, set } = do
@@ -143,12 +146,12 @@ readPackageSet PackageConfig{ set } = do
143146 let dbFile = ".psc-package" </> fromText set </> ".set" </> "packages.json"
144147 exists <- testfile dbFile
145148 unless exists $ do
146− echo $ format (fp%" does not exist") dbFile
149+ echoT $ format (fp%" does not exist") dbFile
147150 exit (ExitFailure 1)
148151 mdb <- Aeson.decodeStrict . encodeUtf8 <$> readTextFile dbFile
149152 case mdb of
150153 Nothing -> do
151− echo "Unable to parse packages.json"
154+ echoT "Unable to parse packages.json"
152155 exit (ExitFailure 1)
153156 Just db -> return db
154157
@@ -159,7 +162,7 @@ writePackageSet PackageConfig{ set } =
159162
160163installOrUpdate :: Text -> Text -> PackageInfo -> IO Turtle.FilePath
161164installOrUpdate set pkgName PackageInfo{ repo, version } = do
162− echo ("Updating " <> pkgName)
165+ echoT ("Updating " <> pkgName)
163166 let pkgDir = ".psc-package" </> fromText set </> fromText pkgName </> fromText version
164167 exists <- testdir pkgDir
165168 unless exists . void $ cloneShallow repo version pkgDir
@@ -170,7 +173,7 @@ getTransitiveDeps db depends = do
170173 pkgs <- for depends $ \pkg ->
171174 case Map.lookup pkg db of
172175 Nothing -> do
173− echo ("Package " <> pkg <> " does not exist in package set")
176+ echoT ("Package " <> pkg <> " does not exist in package set")
174177 exit (ExitFailure 1)
175178 Just PackageInfo{ dependencies } -> return (pkg : dependencies)
176179 let unique = Set.toList (foldMap Set.fromList pkgs)
@@ -181,16 +184,16 @@ updateImpl config@PackageConfig{ depends } = do
181184 getPackageSet config
182185 db <- readPackageSet config
183186 trans <- getTransitiveDeps db depends
184− echo ("Updating " <> pack (show (length trans)) <> " packages...")
187+ echoT ("Updating " <> pack (show (length trans)) <> " packages...")
185188 for_ trans $ \(pkgName, pkg) -> installOrUpdate (set config) pkgName pkg
186189
187190initialize :: IO ()
188191initialize = do
189192 exists <- testfile "psc-package.json"
190193 when exists $ do
191− echo "psc-package.json already exists"
194+ echoT "psc-package.json already exists"
192195 exit (ExitFailure 1)
193− echo "Initializing new project in current directory"
196+ echoT "Initializing new project in current directory"
194197 pkgName <- pathToTextUnsafe . Path.filename <$> pwd
195198 let pkg = defaultPackage pkgName
196199 writePackageFile pkg
@@ -200,7 +203,7 @@ update :: IO ()
200203update = do
201204 pkg <- readPackageFile
202205 updateImpl pkg
203− echo "Update complete"
206+ echoT "Update complete"
204207
205208install :: String -> IO ()
206209install pkgName = do
@@ -208,7 +211,7 @@ install pkgName = do
208211 let pkg' = pkg { depends = nub (pack pkgName : depends pkg) }
209212 updateImpl pkg'
210213 writePackageFile pkg'
211− echo "psc-package.json file was updated"
214+ echoT "psc-package.json file was updated"
212215
213216uninstall :: String -> IO ()
214217uninstall pkgName = do
@@ -216,20 +219,20 @@ uninstall pkgName = do
216219 let pkg' = pkg { depends = filter (/= pack pkgName) $ depends pkg }
217220 updateImpl pkg'
218221 writePackageFile pkg'
219− echo "psc-package.json file was updated"
222+ echoT "psc-package.json file was updated"
220223
221224listDependencies :: IO ()
222225listDependencies = do
223226 pkg@PackageConfig{ depends } <- readPackageFile
224227 db <- readPackageSet pkg
225228 trans <- getTransitiveDeps db depends
226− traverse_ (echo . fst) trans
229+ traverse_ (echoT . fst) trans
227230
228231listPackages :: IO ()
229232listPackages = do
230233 pkg <- readPackageFile
231234 db <- readPackageSet pkg
232− traverse_ echo (fmt <$> Map.assocs db)
235+ traverse_ echoT (fmt <$> Map.assocs db)
233236 where
234237 fmt :: (Text, PackageInfo) -> Text
235238 fmt (name, PackageInfo{ version }) = name <> " (" <> version <> ")"
@@ -251,7 +254,7 @@ listSourcePaths = do
251254 pkg@PackageConfig{ depends } <- readPackageFile
252255 db <- readPackageSet pkg
253256 paths <- getSourcePaths pkg db depends
254− traverse_ (echo . pathToTextUnsafe) paths
257+ traverse_ (echoT . pathToTextUnsafe) paths
255258
256259exec :: Text -> IO ()
257260exec exeName = do
@@ -267,11 +270,11 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
267270 pkg <- readPackageFile
268271 db <- readPackageSet pkg
269272
270− echo ("Checking " <> pack (show (Map.size db)) <> " packages for updates.")
271− echo "Warning: this could take some time!"
273+ echoT ("Checking " <> pack (show (Map.size db)) <> " packages for updates.")
274+ echoT "Warning: this could take some time!"
272275
273276 newDb <- Map.fromList <$> (for (Map.toList db) $ \(name, p@PackageInfo{ repo, version }) -> do
274− echo ("Checking package " <> name)
277+ echoT ("Checking package " <> name)
275278 tagLines <- Turtle.fold (listRemoteTags repo) Foldl.list
276279 let tags = mapMaybe parseTag tagLines
277280 newVersion <- case parseVersion version of
@@ -280,7 +283,7 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
280283 case filter (isMinorReleaseFrom parts) tags of
281284 [] -> pure version
282285 minorReleases -> do
283− echo ("New minor release available")
286+ echoT ("New minor release available")
284287 case applyMinorUpdates of
285288 True -> do
286289 let latestMinorRelease = maximum minorReleases
@@ -290,7 +293,7 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
290293 case filter (isMajorReleaseFrom parts) tags of
291294 [] -> applyMinor
292295 newReleases -> do
293− echo ("New major release available")
296+ echoT ("New major release available")
294297 case applyMajorUpdates of
295298 True -> do
296299 let latestRelease = maximum newReleases
@@ -298,7 +301,7 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
298301 False -> applyMinor
299302 in applyMajor
300303 _ -> do
301− echo "Unable to parse version string"
304+ echoT "Unable to parse version string"
302305 pure version
303306 pure (name, p { version = newVersion }))
304307
@@ -345,15 +348,15 @@ verifyPackageSet = do
345348 pkg <- readPackageFile
346349 db <- readPackageSet pkg
347350
348− echo ("Verifying " <> pack (show (Map.size db)) <> " packages.")
349− echo "Warning: this could take some time!"
351+ echoT ("Verifying " <> pack (show (Map.size db)) <> " packages.")
352+ echoT "Warning: this could take some time!"
350353
351354 let installOrUpdate' (name, pkgInfo) = (name, ) <$> installOrUpdate (set pkg) name pkgInfo
352355 paths <- Map.fromList <$> traverse installOrUpdate' (Map.toList db)
353356
354357 for_ (Map.toList db) $ \(name, PackageInfo{..}) -> do
355358 let dirFor = fromMaybe (error "verifyPackageSet: no directory") . (`Map.lookup` paths)
356− echo ("Verifying package " <> name)
359+ echoT ("Verifying package " <> name)
357360 let srcGlobs = map (pathToTextUnsafe . (</> ("src" </> "**" </> "*.purs")) . dirFor) (name : dependencies)
358361 procs "psc" srcGlobs empty
359362