@@ -20,11 +20,13 @@ import Data.List
20
20
import Data.Maybe
21
21
import Data.IORef
22
22
import Data.Time
23
+ import Control.Applicative ((<$>) , (<*>) )
23
24
import Control.Exception
24
25
import Control.Monad
25
26
import Control.Monad.Trans
26
27
import qualified Data.ByteString.Lazy as BS
27
28
import qualified Data.Map as M
29
+ import qualified Data.Set as S
28
30
29
31
import qualified Codec.Compression.GZip as GZip
30
32
import qualified Codec.Archive.Tar as Tar
@@ -137,6 +139,23 @@ initialise opts uri auxUris
137
139
where
138
140
readMissingOpt prompt = maybe (putStrLn prompt >> getLine ) return
139
141
142
+
143
+ -- | Parse the @00-index.cache@ file of the available package repositories.
144
+ parseRepositoryIndices :: IO (S. Set PackageIdentifier )
145
+ parseRepositoryIndices = do
146
+ cabalDir <- getAppUserDataDirectory " cabal/packages"
147
+ cacheDirs <- listDirectory cabalDir
148
+ indexFiles <- filterM doesFileExist $ map (\ dir -> cabalDir </> dir </> " 00-index.cache" ) cacheDirs
149
+ S. unions <$> mapM readCache indexFiles
150
+ where
151
+ readCache fname =
152
+ S. fromList . mapMaybe parseLine . lines <$> readFile fname
153
+ parseLine line
154
+ | " pkg:" : name : ver : _ <- words line
155
+ = PackageIdentifier <$> simpleParse name <*> simpleParse ver
156
+ | otherwise
157
+ = Nothing
158
+
140
159
writeConfig :: BuildOpts -> BuildConfig -> IO ()
141
160
writeConfig opts BuildConfig {
142
161
bc_srcURI = uri,
@@ -391,6 +410,11 @@ getDocumentationStats verbosity config didFail = do
391
410
buildOnce :: BuildOpts -> [PackageId ] -> IO ()
392
411
buildOnce opts pkgs = keepGoing $ do
393
412
config <- readConfig opts
413
+ -- Due to caching sometimes the package repository state may lag behind the
414
+ -- documentation index. Consequently, we make sure that the packages we are
415
+ -- going to build actually appear in the repository before building. See
416
+ -- #543.
417
+ repoIndex <- parseRepositoryIndices
394
418
395
419
notice verbosity " Initialising"
396
420
(has_failed, mark_as_failed, persist_failed) <- mkPackageFailed opts
@@ -409,6 +433,7 @@ buildOnce opts pkgs = keepGoing $ do
409
433
-- Find those files *not* marked as having documentation in our cache
410
434
let toBuild :: [DocInfo ]
411
435
toBuild = filter shouldBuild
436
+ . filter (flip S. member repoIndex . docInfoPackage)
412
437
. latestFirst
413
438
. map (sortBy (flip (comparing docInfoPackageVersion)))
414
439
. groupBy (equating docInfoPackageName)
0 commit comments