@@ -35,6 +35,7 @@ import qualified System.Process as Process
35
35
import qualified Text.ParserCombinators.ReadP as Read
36
36
import Turtle hiding (echo , fold , s , x )
37
37
import qualified Turtle
38
+ import Types (PackageName , mkPackageName , runPackageName , untitledPackageName , preludePackageName )
38
39
39
40
echoT :: Text -> IO ()
40
41
echoT = Turtle. printf (Turtle. s % " \n " )
@@ -43,19 +44,19 @@ packageFile :: Path.FilePath
43
44
packageFile = " psc-package.json"
44
45
45
46
data PackageConfig = PackageConfig
46
- { name :: Text
47
- , depends :: [Text ]
47
+ { name :: PackageName
48
+ , depends :: [PackageName ]
48
49
, set :: Text
49
50
, source :: Text
50
51
} deriving (Show , Generic , Aeson.FromJSON , Aeson.ToJSON )
51
52
52
53
pathToTextUnsafe :: Turtle. FilePath -> Text
53
54
pathToTextUnsafe = either (error " Path.toText failed" ) id . Path. toText
54
55
55
- defaultPackage :: Version -> Text -> PackageConfig
56
+ defaultPackage :: Version -> PackageName -> PackageConfig
56
57
defaultPackage pursVersion pkgName =
57
58
PackageConfig { name = pkgName
58
- , depends = [ " prelude " ]
59
+ , depends = [ preludePackageName ]
59
60
, set = " psc-" <> pack (showVersion pursVersion)
60
61
, source = " https://github.com/purescript/package-sets.git"
61
62
}
@@ -104,10 +105,10 @@ writePackageFile =
104
105
data PackageInfo = PackageInfo
105
106
{ repo :: Text
106
107
, version :: Text
107
- , dependencies :: [Text ]
108
+ , dependencies :: [PackageName ]
108
109
} deriving (Show , Eq , Generic , Aeson.FromJSON , Aeson.ToJSON )
109
110
110
- type PackageSet = Map. Map Text PackageInfo
111
+ type PackageSet = Map. Map PackageName PackageInfo
111
112
112
113
cloneShallow
113
114
:: Text
@@ -165,20 +166,20 @@ writePackageSet PackageConfig{ set } =
165
166
let dbFile = " .psc-package" </> fromText set </> " .set" </> " packages.json"
166
167
in writeTextFile dbFile . packageSetToJSON
167
168
168
- installOrUpdate :: Text -> Text -> PackageInfo -> IO Turtle. FilePath
169
+ installOrUpdate :: Text -> PackageName -> PackageInfo -> IO Turtle. FilePath
169
170
installOrUpdate set pkgName PackageInfo { repo, version } = do
170
- echoT (" Updating " <> pkgName)
171
- let pkgDir = " .psc-package" </> fromText set </> fromText pkgName </> fromText version
171
+ echoT (" Updating " <> runPackageName pkgName)
172
+ let pkgDir = " .psc-package" </> fromText set </> fromText (runPackageName pkgName) </> fromText version
172
173
exists <- testdir pkgDir
173
174
unless exists . void $ cloneShallow repo version pkgDir
174
175
pure pkgDir
175
176
176
- getTransitiveDeps :: PackageSet -> [Text ] -> IO [(Text , PackageInfo )]
177
+ getTransitiveDeps :: PackageSet -> [PackageName ] -> IO [(PackageName , PackageInfo )]
177
178
getTransitiveDeps db depends = do
178
179
pkgs <- for depends $ \ pkg ->
179
180
case Map. lookup pkg db of
180
181
Nothing -> do
181
- echoT (" Package " <> pkg <> " does not exist in package set" )
182
+ echoT (" Package " <> runPackageName pkg <> " does not exist in package set" )
182
183
exit (ExitFailure 1 )
183
184
Just PackageInfo { dependencies } -> return (pkg : dependencies)
184
185
let unique = Set. toList (foldMap Set. fromList pkgs)
@@ -211,42 +212,57 @@ initialize = do
211
212
echoT " psc-package.json already exists"
212
213
exit (ExitFailure 1 )
213
214
echoT " Initializing new project in current directory"
214
- pkgName <- pathToTextUnsafe . Path. filename <$> pwd
215
+ pkgName <- packageNameFromPWD . pathToTextUnsafe . Path. filename <$> pwd
215
216
pursVersion <- getPureScriptVersion
216
217
echoT (" Using the default package set for PureScript compiler version " <>
217
218
fromString (showVersion pursVersion))
218
219
let pkg = defaultPackage pursVersion pkgName
219
220
writePackageFile pkg
220
221
updateImpl pkg
221
222
223
+ where
224
+ packageNameFromPWD =
225
+ either (const untitledPackageName) id . mkPackageName
226
+
222
227
update :: IO ()
223
228
update = do
224
229
pkg <- readPackageFile
225
230
updateImpl pkg
226
231
echoT " Update complete"
227
232
228
233
install :: String -> IO ()
229
- install pkgName = do
234
+ install pkgName' = do
230
235
pkg <- readPackageFile
231
- let pkg' = pkg { depends = nub (pack pkgName : depends pkg) }
236
+ pkgName <- packageNameFromString pkgName'
237
+ let pkg' = pkg { depends = nub (pkgName : depends pkg) }
232
238
updateImpl pkg'
233
239
writePackageFile pkg'
234
240
echoT " psc-package.json file was updated"
235
241
236
242
uninstall :: String -> IO ()
237
- uninstall pkgName = do
243
+ uninstall pkgName' = do
238
244
pkg <- readPackageFile
239
- let pkg' = pkg { depends = filter (/= pack pkgName) $ depends pkg }
245
+ pkgName <- packageNameFromString pkgName'
246
+ let pkg' = pkg { depends = filter (/= pkgName) $ depends pkg }
240
247
updateImpl pkg'
241
248
writePackageFile pkg'
242
249
echoT " psc-package.json file was updated"
243
250
251
+ packageNameFromString :: String -> IO PackageName
252
+ packageNameFromString str =
253
+ case mkPackageName (pack str) of
254
+ Right pkgName ->
255
+ pure pkgName
256
+ Left _ -> do
257
+ echoT (" Invalid package name: " <> pack (show str))
258
+ exit (ExitFailure 1 )
259
+
244
260
listDependencies :: IO ()
245
261
listDependencies = do
246
262
pkg@ PackageConfig { depends } <- readPackageFile
247
263
db <- readPackageSet pkg
248
264
trans <- getTransitiveDeps db depends
249
- traverse_ (echoT . fst ) trans
265
+ traverse_ (echoT . runPackageName . fst ) trans
250
266
251
267
listPackages :: Bool -> IO ()
252
268
listPackages sorted = do
@@ -256,8 +272,9 @@ listPackages sorted = do
256
272
then traverse_ echoT (fmt <$> inOrder (Map. assocs db))
257
273
else traverse_ echoT (fmt <$> Map. assocs db)
258
274
where
259
- fmt :: (Text , PackageInfo ) -> Text
260
- fmt (name, PackageInfo { version, repo }) = name <> " (" <> version <> " , " <> repo <> " )"
275
+ fmt :: (PackageName , PackageInfo ) -> Text
276
+ fmt (name, PackageInfo { version, repo }) =
277
+ runPackageName name <> " (" <> version <> " , " <> repo <> " )"
261
278
262
279
inOrder xs = fromNode . fromVertex <$> vs where
263
280
(gr, fromVertex) =
@@ -267,12 +284,12 @@ listPackages sorted = do
267
284
vs = G. topSort (G. transposeG gr)
268
285
fromNode (pkg, name, _) = (name, pkg)
269
286
270
- getSourcePaths :: PackageConfig -> PackageSet -> [Text ] -> IO [Turtle. FilePath ]
287
+ getSourcePaths :: PackageConfig -> PackageSet -> [PackageName ] -> IO [Turtle. FilePath ]
271
288
getSourcePaths PackageConfig {.. } db pkgNames = do
272
289
trans <- getTransitiveDeps db pkgNames
273
290
let paths = [ " .psc-package"
274
291
</> fromText set
275
- </> fromText pkgName
292
+ </> fromText (runPackageName pkgName)
276
293
</> fromText version
277
294
</> " src" </> " **" </> " *.purs"
278
295
| (pkgName, PackageInfo { version }) <- trans
@@ -315,7 +332,7 @@ checkForUpdates applyMinorUpdates applyMajorUpdates = do
315
332
echoT " Warning: this could take some time!"
316
333
317
334
newDb <- Map. fromList <$> (for (Map. toList db) $ \ (name, p@ PackageInfo { repo, version }) -> do
318
- echoT (" Checking package " <> name)
335
+ echoT (" Checking package " <> runPackageName name)
319
336
tagLines <- Turtle. fold (listRemoteTags repo) Foldl. list
320
337
let tags = mapMaybe parseTag tagLines
321
338
newVersion <- case parsePackageVersion version of
@@ -397,7 +414,7 @@ verifyPackageSet = do
397
414
398
415
for_ (Map. toList db) $ \ (name, PackageInfo {.. }) -> do
399
416
let dirFor pkgName = fromMaybe (error (" verifyPackageSet: no directory for " <> show pkgName)) (Map. lookup pkgName paths)
400
- echoT (" Verifying package " <> name)
417
+ echoT (" Verifying package " <> runPackageName name)
401
418
let srcGlobs = map (pathToTextUnsafe . (</> (" src" </> " **" </> " *.purs" )) . dirFor) (name : dependencies)
402
419
procs " purs" (" compile" : srcGlobs) empty
403
420
0 commit comments