Skip to content

Commit e215922

Browse files
committed
Merge pull request #3380 from hvr/pr/cache-entry-masking
Resolve tar-entry masking in `packageListFromCache`
2 parents 936c29b + a01696f commit e215922

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

cabal-install/Distribution/Client/IndexUtils.hs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -472,19 +472,23 @@ packageIndexFromCache mkPkg hnd cache mode = do
472472

473473
-- | Read package list
474474
--
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.
478482
packageListFromCache :: (PackageEntry -> pkg)
479483
-> Handle
480484
-> Cache
481485
-> ReadPackageIndexMode
482486
-> IO ([pkg], [Dependency])
483-
packageListFromCache mkPkg hnd Cache{..} mode = accum mempty [] cacheEntries
487+
packageListFromCache mkPkg hnd Cache{..} mode = accum mempty [] mempty cacheEntries
484488
where
485-
accum srcpkgs prefs [] = return (reverse srcpkgs, prefs)
489+
accum !srcpkgs btrs !prefs [] = return (Map.elems srcpkgs ++ btrs, Map.elems prefs)
486490

487-
accum srcpkgs prefs (CachePackageId pkgid blockno : entries) = do
491+
accum srcpkgs btrs prefs (CachePackageId pkgid blockno : entries) = do
488492
-- Given the cache entry, make a package index entry.
489493
-- The magic here is that we use lazy IO to read the .cabal file
490494
-- from the index tarball if it turns out that we need it.
@@ -499,9 +503,9 @@ packageListFromCache mkPkg hnd Cache{..} mode = accum mempty [] cacheEntries
499503
ReadPackageIndexStrict ->
500504
pkg `seq` pkgtxt `seq` mkPkg (NormalPackage pkgid pkg
501505
pkgtxt blockno)
502-
accum (srcpkg:srcpkgs) prefs entries
506+
accum (Map.insert pkgid srcpkg srcpkgs) btrs prefs entries
503507

504-
accum srcpkgs prefs (CacheBuildTreeRef refType blockno : entries) = do
508+
accum srcpkgs btrs prefs (CacheBuildTreeRef refType blockno : entries) = do
505509
-- We have to read the .cabal file eagerly here because we can't cache the
506510
-- package id for build tree references - the user might edit the .cabal
507511
-- file after the reference was added to the index.
@@ -510,10 +514,10 @@ packageListFromCache mkPkg hnd Cache{..} mode = accum mempty [] cacheEntries
510514
file <- tryFindAddSourcePackageDesc path err
511515
PackageDesc.Parse.readPackageDescription normal file
512516
let srcpkg = mkPkg (BuildTreeRef refType (packageId pkg) pkg path blockno)
513-
accum (srcpkg:srcpkgs) prefs entries
517+
accum srcpkgs (srcpkg:btrs) prefs entries
514518

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
517521

518522
getEntryContent :: BlockNo -> IO ByteString
519523
getEntryContent blockno = do

0 commit comments

Comments
 (0)