@@ -472,19 +472,23 @@ packageIndexFromCache mkPkg hnd cache mode = do
472
472
473
473
-- | Read package list
474
474
--
475
- -- The result packages (though not the preferences) are guaranteed to be listed
476
- -- in the same order as they are in the tar file (because later entries in a tar
477
- -- file mask earlier ones).
475
+ -- The result package releases and preference entries are guaranteed
476
+ -- to be unique.
477
+ --
478
+ -- Note: 01-index.tar is an append-only index and therefore contains
479
+ -- all .cabal edits and preference-updates. The masking happens
480
+ -- here, i.e. the semantics that later entries in a tar file mask
481
+ -- earlier ones is resolved in this function.
478
482
packageListFromCache :: (PackageEntry -> pkg )
479
483
-> Handle
480
484
-> Cache
481
485
-> ReadPackageIndexMode
482
486
-> IO ([pkg ], [Dependency ])
483
- packageListFromCache mkPkg hnd Cache {.. } mode = accum mempty [] cacheEntries
487
+ packageListFromCache mkPkg hnd Cache {.. } mode = accum mempty [] mempty cacheEntries
484
488
where
485
- accum srcpkgs prefs [] = return (reverse srcpkgs, prefs)
489
+ accum ! srcpkgs btrs ! prefs [] = return (Map. elems srcpkgs ++ btrs, Map. elems prefs)
486
490
487
- accum srcpkgs prefs (CachePackageId pkgid blockno : entries) = do
491
+ accum srcpkgs btrs prefs (CachePackageId pkgid blockno : entries) = do
488
492
-- Given the cache entry, make a package index entry.
489
493
-- The magic here is that we use lazy IO to read the .cabal file
490
494
-- from the index tarball if it turns out that we need it.
@@ -499,9 +503,9 @@ packageListFromCache mkPkg hnd Cache{..} mode = accum mempty [] cacheEntries
499
503
ReadPackageIndexStrict ->
500
504
pkg `seq` pkgtxt `seq` mkPkg (NormalPackage pkgid pkg
501
505
pkgtxt blockno)
502
- accum (srcpkg: srcpkgs) prefs entries
506
+ accum (Map. insert pkgid srcpkg srcpkgs) btrs prefs entries
503
507
504
- accum srcpkgs prefs (CacheBuildTreeRef refType blockno : entries) = do
508
+ accum srcpkgs btrs prefs (CacheBuildTreeRef refType blockno : entries) = do
505
509
-- We have to read the .cabal file eagerly here because we can't cache the
506
510
-- package id for build tree references - the user might edit the .cabal
507
511
-- file after the reference was added to the index.
@@ -510,10 +514,10 @@ packageListFromCache mkPkg hnd Cache{..} mode = accum mempty [] cacheEntries
510
514
file <- tryFindAddSourcePackageDesc path err
511
515
PackageDesc.Parse. readPackageDescription normal file
512
516
let srcpkg = mkPkg (BuildTreeRef refType (packageId pkg) pkg path blockno)
513
- accum (srcpkg: srcpkgs ) prefs entries
517
+ accum srcpkgs (srcpkg: btrs ) prefs entries
514
518
515
- accum srcpkgs prefs (CachePreference pref : entries) =
516
- accum srcpkgs ( pref: prefs) entries
519
+ accum srcpkgs btrs prefs (CachePreference pref@ ( Dependency pn _) : entries) =
520
+ accum srcpkgs btrs ( Map. insert pn pref prefs) entries
517
521
518
522
getEntryContent :: BlockNo -> IO ByteString
519
523
getEntryContent blockno = do
0 commit comments