@@ -11,6 +11,7 @@ import qualified Control.Foldl as Foldl
11
11
import qualified Data.Aeson as Aeson
12
12
import Data.Aeson.Encode.Pretty
13
13
import Data.Foldable (fold , for_ , traverse_ )
14
+ import qualified Data.Graph as G
14
15
import Data.List (maximumBy , nub )
15
16
import qualified Data.Map as Map
16
17
import Data.Maybe (fromMaybe , mapMaybe )
@@ -246,14 +247,24 @@ listDependencies = do
246
247
trans <- getTransitiveDeps db depends
247
248
traverse_ (echoT . fst ) trans
248
249
249
- listPackages :: IO ()
250
- listPackages = do
250
+ listPackages :: Bool -> IO ()
251
+ listPackages sorted = do
251
252
pkg <- readPackageFile
252
253
db <- readPackageSet pkg
253
- traverse_ echoT (fmt <$> Map. assocs db)
254
+ if sorted
255
+ then traverse_ echoT (fmt <$> inOrder (Map. assocs db))
256
+ else traverse_ echoT (fmt <$> Map. assocs db)
254
257
where
255
258
fmt :: (Text , PackageInfo ) -> Text
256
- fmt (name, PackageInfo { version }) = name <> " (" <> version <> " )"
259
+ fmt (name, PackageInfo { version, repo }) = name <> " (" <> version <> " , " <> repo <> " )"
260
+
261
+ inOrder xs = fromNode . fromVertex <$> vs where
262
+ (gr, fromVertex) =
263
+ G. graphFromEdges' [ (pkg, name, dependencies pkg)
264
+ | (name, pkg) <- xs
265
+ ]
266
+ vs = G. topSort (G. transposeG gr)
267
+ fromNode (pkg, name, _) = (name, pkg)
257
268
258
269
getSourcePaths :: PackageConfig -> PackageSet -> [Text ] -> IO [Turtle. FilePath ]
259
270
getSourcePaths PackageConfig {.. } db pkgNames = do
@@ -432,7 +443,7 @@ main = do
432
443
(Opts. info (pure listSourcePaths)
433
444
(Opts. progDesc " List all (active) source paths for dependencies" ))
434
445
, Opts. command " available"
435
- (Opts. info (pure listPackages)
446
+ (Opts. info (listPackages <$> sorted )
436
447
(Opts. progDesc " List all packages available in the package set" ))
437
448
, Opts. command " updates"
438
449
(Opts. info (checkForUpdates <$> apply <*> applyMajor Opts. <**> Opts. helper)
@@ -458,3 +469,8 @@ main = do
458
469
Opts. long " only-dependencies"
459
470
<> Opts. short ' d'
460
471
<> Opts. help help
472
+
473
+ sorted = Opts. switch $
474
+ Opts. long " sort"
475
+ <> Opts. short ' s'
476
+ <> Opts. help " Sort packages in dependency order"
0 commit comments