Record available hoogle db files per snapshot + hoogle version combination:

* Make sure hoogle db is marked as available, when there is a copy on S3

* Create db even with `--do-no-upload` flag (useful for testing)

* Make sure home page uses latest lts with hoogle db available
This commit is contained in:
Alexey Kuleshevich 2020-02-14 03:54:51 +03:00
parent 96973cac11
commit fe25b2fa2f
No known key found for this signature in database
GPG Key ID: E59B216127119E3E
7 changed files with 146 additions and 67 deletions

View File

@ -36,6 +36,7 @@ getHomeR = track "Handler.Snapshots.getAllSnapshotsR" $ do
getSnapshots Nothing snapshotsPerPage getSnapshots Nothing snapshotsPerPage
((fromIntegral currentPage - 1) * snapshotsPerPage) ((fromIntegral currentPage - 1) * snapshotsPerPage)
let groups = groupUp now' snapshots let groups = groupUp now' snapshots
latestLtsNameWithHoogle <- getLatestLtsNameWithHoogle
latestLtsByGhc <- getLatestLtsByGhc latestLtsByGhc <- getLatestLtsByGhc
defaultLayout $ do defaultLayout $ do
setTitle "Stackage Server" setTitle "Stackage Server"

View File

@ -17,7 +17,7 @@ import Data.Yaml.Config
import Language.Haskell.TH.Syntax (Exp, Name, Q) import Language.Haskell.TH.Syntax (Exp, Name, Q)
import Network.Wai.Handler.Warp (HostPreference) import Network.Wai.Handler.Warp (HostPreference)
import Text.Hamlet import Text.Hamlet
import Yesod.Default.Config2 (applyEnvValue, configSettingsYml) import Yesod.Default.Config2 (configSettingsYml)
import Yesod.Default.Util (WidgetFileSettings, wfsHamletSettings, import Yesod.Default.Util (WidgetFileSettings, wfsHamletSettings,
widgetFileNoReload, widgetFileReload) widgetFileNoReload, widgetFileReload)

View File

@ -38,11 +38,11 @@ import Network.HTTP.Simple (getResponseBody, httpJSONEither)
import Network.HTTP.Types (status200, status404) import Network.HTTP.Types (status200, status404)
import Pantry (CabalFileInfo(..), DidUpdateOccur(..), import Pantry (CabalFileInfo(..), DidUpdateOccur(..),
HpackExecutable(HpackBundled), PackageIdentifierRevision(..), HpackExecutable(HpackBundled), PackageIdentifierRevision(..),
defaultHackageSecurityConfig, defaultCasaRepoPrefix, defaultCasaMaxPerRequest) defaultCasaMaxPerRequest, defaultCasaRepoPrefix,
import Pantry.Internal.Stackage (HackageTarballResult(..), defaultHackageSecurityConfig)
PantryConfig(..), Storage(..), import Pantry.Internal.Stackage (HackageTarballResult(..), PantryConfig(..),
forceUpdateHackageIndex, getHackageTarball, Storage(..), forceUpdateHackageIndex,
packageTreeKey) getHackageTarball, packageTreeKey)
import Path (parseAbsDir, toFilePath) import Path (parseAbsDir, toFilePath)
import RIO import RIO
import RIO.Directory import RIO.Directory
@ -171,7 +171,7 @@ stackageServerCron StackageCronOptions {..} = do
gpdCache <- newIORef IntMap.empty gpdCache <- newIORef IntMap.empty
defaultProcessContext <- mkDefaultProcessContext defaultProcessContext <- mkDefaultProcessContext
aws <- newEnv Discover aws <- newEnv Discover
withLogFunc (setLogMinLevel scoLogLevel lo) $ \logFunc -> withLogFunc (setLogMinLevel scoLogLevel lo) $ \logFunc -> do
let pantryConfig = let pantryConfig =
PantryConfig PantryConfig
{ pcHackageSecurity = defaultHackageSecurityConfig { pcHackageSecurity = defaultHackageSecurityConfig
@ -185,7 +185,9 @@ stackageServerCron StackageCronOptions {..} = do
, pcCasaRepoPrefix = defaultCasaRepoPrefix , pcCasaRepoPrefix = defaultCasaRepoPrefix
, pcCasaMaxPerRequest = defaultCasaMaxPerRequest , pcCasaMaxPerRequest = defaultCasaMaxPerRequest
} }
stackage = currentHoogleVersionId <-
runRIO logFunc $ getCurrentHoogleVersionIdWithPantryConfig pantryConfig
let stackage =
StackageCron StackageCron
{ scPantryConfig = pantryConfig { scPantryConfig = pantryConfig
, scStackageRoot = stackageRootDir , scStackageRoot = stackageRootDir
@ -199,8 +201,9 @@ stackageServerCron StackageCronOptions {..} = do
, scSnapshotsRepo = scoSnapshotsRepo , scSnapshotsRepo = scoSnapshotsRepo
, scReportProgress = scoReportProgress , scReportProgress = scoReportProgress
, scCacheCabalFiles = scoCacheCabalFiles , scCacheCabalFiles = scoCacheCabalFiles
, scHoogleVersionId = currentHoogleVersionId
} }
in runRIO stackage (runStackageUpdate scoDoNotUpload) runRIO stackage (runStackageUpdate scoDoNotUpload)
runStackageUpdate :: Bool -> RIO StackageCron () runStackageUpdate :: Bool -> RIO StackageCron ()
@ -210,7 +213,7 @@ runStackageUpdate doNotUpload = do
runStackageMigrations runStackageMigrations
didUpdate <- forceUpdateHackageIndex (Just "stackage-server cron job") didUpdate <- forceUpdateHackageIndex (Just "stackage-server cron job")
case didUpdate of case didUpdate of
UpdateOccurred -> logInfo "Updated hackage index" UpdateOccurred -> logInfo "Updated hackage index"
NoUpdateOccurred -> logInfo "No new packages in hackage index" NoUpdateOccurred -> logInfo "No new packages in hackage index"
logInfo "Getting deprecated info now" logInfo "Getting deprecated info now"
getHackageDeprecations >>= setDeprecations getHackageDeprecations >>= setDeprecations
@ -218,10 +221,9 @@ runStackageUpdate doNotUpload = do
runResourceT $ runResourceT $
join $ join $
runConduit $ sourceSnapshots .| foldMC (createOrUpdateSnapshot corePackageGetters) (pure ()) runConduit $ sourceSnapshots .| foldMC (createOrUpdateSnapshot corePackageGetters) (pure ())
unless doNotUpload uploadSnapshotsJSON
buildAndUploadHoogleDB doNotUpload
run $ mapM_ (`rawExecute` []) ["COMMIT", "VACUUM", "BEGIN"] run $ mapM_ (`rawExecute` []) ["COMMIT", "VACUUM", "BEGIN"]
unless doNotUpload $ do
uploadSnapshotsJSON
buildAndUploadHoogleDB
-- | This will look at 'global-hints.yaml' and will create core package getters that are reused -- | This will look at 'global-hints.yaml' and will create core package getters that are reused
@ -677,7 +679,6 @@ uploadHoogleDB fp key =
withTempFile (takeDirectory fp) (takeFileName fp <.> "gz") $ \fpgz h -> do withTempFile (takeDirectory fp) (takeFileName fp <.> "gz") $ \fpgz h -> do
runConduitRes $ sourceFile fp .| compress 9 (WindowBits 31) .| CB.sinkHandle h runConduitRes $ sourceFile fp .| compress 9 (WindowBits 31) .| CB.sinkHandle h
hClose h hClose h
-- FIXME body <- chunkedFile defaultChunkSize fpgz
body <- toBody <$> readFileBinary fpgz body <- toBody <$> readFileBinary fpgz
uploadBucket <- scUploadBucketName <$> ask uploadBucket <- scUploadBucketName <$> ask
uploadFromRIO key $ uploadFromRIO key $
@ -694,26 +695,30 @@ uploadFromRIO key po = do
logError $ "Couldn't upload " <> displayShow key <> " to S3 becuase " <> displayShow e logError $ "Couldn't upload " <> displayShow key <> " to S3 becuase " <> displayShow e
Right _ -> logInfo $ "Successfully uploaded " <> displayShow key <> " to S3" Right _ -> logInfo $ "Successfully uploaded " <> displayShow key <> " to S3"
buildAndUploadHoogleDB :: RIO StackageCron () buildAndUploadHoogleDB :: Bool -> RIO StackageCron ()
buildAndUploadHoogleDB = do buildAndUploadHoogleDB doNotUpload = do
snapshots <- lastLtsNightly 80 5 snapshots <- lastLtsNightlyWithoutHoogleDb 5 5
let snapshots' = sortBy (\x y -> compare (snd (snd y)) (snd (snd x))) $ Map.toList snapshots
env <- ask env <- ask
locker <- newHoogleLocker (env ^. logFuncL) (env ^. envManager) locker <- newHoogleLocker (env ^. logFuncL) (env ^. envManager)
for_ snapshots' $ \(snapshotId, (snapName, _created)) -> do for_ snapshots $ \(snapshotId, snapName) ->
logInfo $ "Starting Hoogle DB download: " <> display (hoogleKey snapName) unlessM (checkInsertSnapshotHoogleDb False snapshotId) $ do
mfp <- singleRun locker snapName logInfo $ "Starting Hoogle database download: " <> display (hoogleKey snapName)
case mfp of mfp <- singleRun locker snapName
Just _ -> logInfo $ "Hoogle database exists for: " <> display snapName case mfp of
Nothing -> do Just _ -> do
logInfo $ "Hoogle database does not exist for: " <> display snapName logInfo $ "Current hoogle database exists for: " <> display snapName
mfp' <- createHoogleDB snapshotId snapName void $ checkInsertSnapshotHoogleDb True snapshotId
forM_ mfp' $ \fp -> do Nothing -> do
let key = hoogleKey snapName logInfo $ "Current hoogle database does not yet exist for: " <> display snapName
uploadHoogleDB fp (ObjectKey key) mfp' <- createHoogleDB snapshotId snapName
let dest = T.unpack key forM_ mfp' $ \fp -> do
createDirectoryIfMissing True $ takeDirectory dest let key = hoogleKey snapName
renamePath fp dest dest = T.unpack key
createDirectoryIfMissing True $ takeDirectory dest
renamePath fp dest
unless doNotUpload $ do
uploadHoogleDB dest (ObjectKey key)
void $ checkInsertSnapshotHoogleDb True snapshotId
createHoogleDB :: SnapshotId -> SnapName -> RIO StackageCron (Maybe FilePath) createHoogleDB :: SnapshotId -> SnapName -> RIO StackageCron (Maybe FilePath)
createHoogleDB snapshotId snapName = createHoogleDB snapshotId snapName =
@ -726,9 +731,11 @@ createHoogleDB snapshotId snapName =
tarKey = toPathPiece snapName <> "/hoogle/orig.tar" tarKey = toPathPiece snapName <> "/hoogle/orig.tar"
tarUrl = "https://s3.amazonaws.com/" <> downloadBucket <> "/" <> tarKey tarUrl = "https://s3.amazonaws.com/" <> downloadBucket <> "/" <> tarKey
tarFP = root </> T.unpack tarKey tarFP = root </> T.unpack tarKey
req <- parseRequest $ T.unpack tarUrl -- When tarball is downloaded it is saved with durability and atomicity, so if it
man <- view envManager -- is present it is not in a corrupted state
unlessM (doesFileExist tarFP) $ unlessM (doesFileExist tarFP) $ do
req <- parseRequest $ T.unpack tarUrl
man <- view envManager
withResponseUnliftIO req {decompress = const True} man $ \res -> do withResponseUnliftIO req {decompress = const True} man $ \res -> do
throwErrorStatusCodes req res throwErrorStatusCodes req res
createDirectoryIfMissing True $ takeDirectory tarFP createDirectoryIfMissing True $ takeDirectory tarFP
@ -740,8 +747,9 @@ createHoogleDB snapshotId snapName =
withSystemTempDirectory ("hoogle-" ++ T.unpack (textDisplay snapName)) $ \tmpdir -> do withSystemTempDirectory ("hoogle-" ++ T.unpack (textDisplay snapName)) $ \tmpdir -> do
Any hasRestored <- Any hasRestored <-
runConduitRes $ runConduitRes $
sourceFile tarFP .| untar (restoreHoogleTxtFileWithCabal tmpdir snapshotId snapName) .| sourceFile tarFP .|
foldC untar (restoreHoogleTxtFileWithCabal tmpdir snapshotId snapName) .|
foldMapC Any
unless hasRestored $ error "No Hoogle .txt files found" unless hasRestored $ error "No Hoogle .txt files found"
let args = ["generate", "--database=" ++ outname, "--local=" ++ tmpdir] let args = ["generate", "--database=" ++ outname, "--local=" ++ tmpdir]
logInfo $ logInfo $
@ -758,12 +766,16 @@ createHoogleDB snapshotId snapName =
logError ("Problem creating hoogle db for " <> display snapName <> ": " <> displayShow exc) $> logError ("Problem creating hoogle db for " <> display snapName <> ": " <> displayShow exc) $>
Nothing Nothing
-- | Grabs hoogle txt file from the tarball and a matching cabal file from pantry. Writes
-- them into supplied temp directory and yields the result of operation as a boolean for
-- every tar entry.
restoreHoogleTxtFileWithCabal :: restoreHoogleTxtFileWithCabal ::
FilePath FilePath
-> SnapshotId -> SnapshotId
-> SnapName -> SnapName
-> FileInfo -> FileInfo
-> ConduitM ByteString Any (ResourceT (RIO StackageCron)) () -> ConduitM ByteString Bool (ResourceT (RIO StackageCron)) ()
restoreHoogleTxtFileWithCabal tmpdir snapshotId snapName fileInfo = restoreHoogleTxtFileWithCabal tmpdir snapshotId snapName fileInfo =
case fileType fileInfo of case fileType fileInfo of
FTNormal -> do FTNormal -> do
@ -776,12 +788,12 @@ restoreHoogleTxtFileWithCabal tmpdir snapshotId snapName fileInfo =
"Unexpected hoogle filename: " <> display txtFileName <> "Unexpected hoogle filename: " <> display txtFileName <>
" in orig.tar for snapshot: " <> " in orig.tar for snapshot: " <>
display snapName display snapName
yield $ Any False yield False
Just cabal -> do Just cabal -> do
writeFileBinary (tmpdir </> T.unpack txtPackageName <.> "cabal") cabal writeFileBinary (tmpdir </> T.unpack txtPackageName <.> "cabal") cabal
sinkFile (tmpdir </> T.unpack txtFileName) sinkFile (tmpdir </> T.unpack txtFileName)
yield $ Any True yield True
_ -> yield $ Any False _ -> yield False
pathToPackageModule :: Text -> Maybe (PackageIdentifierP, ModuleNameP) pathToPackageModule :: Text -> Maybe (PackageIdentifierP, ModuleNameP)

View File

@ -16,9 +16,9 @@ module Stackage.Database.Query
, snapshotBefore , snapshotBefore
, lookupSnapshot , lookupSnapshot
, snapshotTitle , snapshotTitle
, lastXLts5Nightly
, snapshotsJSON , snapshotsJSON
, getLatestLtsByGhc , getLatestLtsByGhc
, getLatestLtsNameWithHoogle
, getSnapshotModules , getSnapshotModules
, getSnapshotPackageModules , getSnapshotPackageModules
@ -52,6 +52,7 @@ module Stackage.Database.Query
, loadBlobById , loadBlobById
, getTreeForKey , getTreeForKey
, treeCabal , treeCabal
, getVersionId
-- ** Stackage server -- ** Stackage server
, CabalFileIds , CabalFileIds
, addCabalFile , addCabalFile
@ -64,8 +65,9 @@ module Stackage.Database.Query
, markModuleHasDocs , markModuleHasDocs
, insertDeps , insertDeps
-- ** For Hoogle db creation -- ** For Hoogle db creation
, lastLtsNightly , lastLtsNightlyWithoutHoogleDb
, getSnapshotPackageCabalBlob , getSnapshotPackageCabalBlob
, checkInsertSnapshotHoogleDb
) where ) where
import qualified Data.Aeson as A import qualified Data.Aeson as A
@ -159,23 +161,29 @@ ltsBefore x y = do
go (Entity _ lts) = (ltsSnap lts, SNLts (ltsMajor lts) (ltsMinor lts)) go (Entity _ lts) = (ltsSnap lts, SNLts (ltsMajor lts) (ltsMinor lts))
lastLtsNightlyWithoutHoogleDb :: Int -> Int -> RIO StackageCron [(SnapshotId, SnapName)]
lastXLts5Nightly :: GetStackageDatabase env m => Int -> m [SnapName] lastLtsNightlyWithoutHoogleDb ltsCount nightlyCount = do
lastXLts5Nightly ltsCount = run $ do currentHoogleVersionId <- scHoogleVersionId <$> ask
ls <- P.selectList [] [P.Desc LtsMajor, P.Desc LtsMinor, P.LimitTo ltsCount] let getSnapshotsWithoutHoogeDb snapId snapCount =
ns <- P.selectList [] [P.Desc NightlyDay, P.LimitTo 5] map (unValue *** unValue) <$>
return $ map l ls <> map n ns select
where (from $ \(snap `InnerJoin` snapshot) -> do
l (Entity _ x) = SNLts (ltsMajor x) (ltsMinor x) on $ snap ^. snapId ==. snapshot ^. SnapshotId
n (Entity _ x) = SNNightly (nightlyDay x) where_ $
notExists $
lastLtsNightly :: GetStackageDatabase env m => Int -> Int -> m (Map SnapshotId (SnapName, Day)) from $ \snapshotHoogleDb ->
lastLtsNightly ltsCount nightlyCount = where_ $
(snapshotHoogleDb ^. SnapshotHoogleDbSnapshot ==. snapshot ^.
SnapshotId) &&.
(snapshotHoogleDb ^. SnapshotHoogleDbVersion ==.
val currentHoogleVersionId)
orderBy [desc (snapshot ^. SnapshotCreated)]
limit $ fromIntegral snapCount
pure (snapshot ^. SnapshotId, snapshot ^. SnapshotName))
run $ do run $ do
ls <- P.selectList [] [P.Desc LtsMajor, P.Desc LtsMinor, P.LimitTo ltsCount] lts <- getSnapshotsWithoutHoogeDb LtsSnap ltsCount
ns <- P.selectList [] [P.Desc NightlyDay, P.LimitTo nightlyCount] nightly <- getSnapshotsWithoutHoogeDb NightlySnap nightlyCount
Map.map (snapshotName &&& snapshotCreated) <$> pure $ lts ++ nightly
P.getMany (map (ltsSnap . P.entityVal) ls <> map (nightlySnap . P.entityVal) ns)
snapshotsJSON :: GetStackageDatabase env m => m A.Value snapshotsJSON :: GetStackageDatabase env m => m A.Value
@ -221,6 +229,20 @@ getLatestLtsByGhc =
dedupe (x:xs) = x : dedupe (dropWhile (\y -> thd x == thd y) xs) dedupe (x:xs) = x : dedupe (dropWhile (\y -> thd x == thd y) xs)
thd (_, _, x, _) = x thd (_, _, x, _) = x
getLatestLtsNameWithHoogle :: GetStackageDatabase env m => m Text
getLatestLtsNameWithHoogle =
run $ do
currentHoogleVersionId <- getCurrentHoogleVersionId
maybe "lts" (textDisplay . unValue) . listToMaybe <$>
select
(from $ \(lts `InnerJoin` snapshot `InnerJoin` snapshotHoogleDb) -> do
on $ snapshotHoogleDb ^. SnapshotHoogleDbSnapshot ==. snapshot ^. SnapshotId
on $ lts ^. LtsSnap ==. snapshot ^. SnapshotId
where_ $
snapshotHoogleDb ^. SnapshotHoogleDbVersion ==. val currentHoogleVersionId
orderBy [desc (lts ^. LtsMajor), desc (lts ^. LtsMinor)]
limit 1
return (snapshot ^. SnapshotName))
-- | Count snapshots that belong to a specific SnapshotBranch -- | Count snapshots that belong to a specific SnapshotBranch
countSnapshots :: (GetStackageDatabase env m) => Maybe SnapshotBranch -> m Int countSnapshots :: (GetStackageDatabase env m) => Maybe SnapshotBranch -> m Int
@ -1089,3 +1111,26 @@ markModuleHasDocs snapshotId pid mSnapshotPackageId modName =
return $ Just snapshotPackageId return $ Just snapshotPackageId
Nothing -> return Nothing Nothing -> return Nothing
-- | We can either check or insert hoogle db for current hoogle version for current
-- snapshot. Returns True if current hoogle version was not in the database.
checkInsertSnapshotHoogleDb :: Bool -> SnapshotId -> RIO StackageCron Bool
checkInsertSnapshotHoogleDb shouldInsert snapshotId = do
hoogleVersionId <- scHoogleVersionId <$> ask
let sh = SnapshotHoogleDb snapshotId hoogleVersionId
run $
if shouldInsert
then do
mhver <-
(fmap unValue . listToMaybe) <$>
select
(from
(\v -> do
where_ $ v ^. VersionId ==. val hoogleVersionId
pure (v ^. VersionVersion)))
forM_ mhver $ \hver ->
lift $
logInfo $
"Marking hoogle database for version " <> display hver <> " as available."
isJust <$> P.insertUniqueEntity sh
else isJust <$> P.checkUnique sh

View File

@ -1,3 +1,4 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleInstances #-}
@ -21,12 +22,15 @@ module Stackage.Database.Schema
, GetStackageDatabase(..) , GetStackageDatabase(..)
, withStackageDatabase , withStackageDatabase
, runStackageMigrations , runStackageMigrations
, getCurrentHoogleVersionId
, getCurrentHoogleVersionIdWithPantryConfig
-- * Tables -- * Tables
, Unique(..) , Unique(..)
, EntityField(..) , EntityField(..)
-- ** Snapshot -- ** Snapshot
, Snapshot(..) , Snapshot(..)
, SnapshotId , SnapshotId
, SnapshotHoogleDb(..)
, Lts(..) , Lts(..)
, Nightly(..) , Nightly(..)
-- ** Package -- ** Package
@ -48,12 +52,12 @@ import Data.Pool (destroyAllResources)
import Database.Persist import Database.Persist
import Database.Persist.Postgresql import Database.Persist.Postgresql
import Database.Persist.TH import Database.Persist.TH
import Pantry (HasPantryConfig(..), Revision) import Pantry (HasPantryConfig(..), Revision, parseVersionThrowing)
import Pantry.Internal.Stackage as PS (BlobId, HackageCabalId, ModuleNameId, import Pantry.Internal.Stackage as PS (BlobId, HackageCabalId, ModuleNameId,
PackageNameId, Tree(..), PackageNameId, Tree(..),
TreeEntryId, TreeId, Unique(..), TreeEntryId, TreeId, Unique(..),
VersionId, unBlobKey) VersionId, unBlobKey)
import Pantry.Internal.Stackage (PantryConfig(..), Storage(..)) import Pantry.Internal.Stackage (PantryConfig(..), Storage(..), getVersionId)
import qualified Pantry.Internal.Stackage as Pantry (migrateAll) import qualified Pantry.Internal.Stackage as Pantry (migrateAll)
import RIO import RIO
import RIO.Time import RIO.Time
@ -82,6 +86,10 @@ Nightly
snap SnapshotId snap SnapshotId
day Day day Day
UniqueNightly day UniqueNightly day
SnapshotHoogleDb
snapshot SnapshotId
version VersionId
UniqueSnapshotHoogleVersion snapshot version
SnapshotPackage SnapshotPackage
snapshot SnapshotId snapshot SnapshotId
packageName PackageNameId packageName PackageNameId
@ -113,7 +121,7 @@ Deprecated
UniqueDeprecated package UniqueDeprecated package
|] |]
_hideUnusedWarnings :: (SchemaId, LtsId, NightlyId) -> () _hideUnusedWarnings :: (SchemaId, LtsId, NightlyId, SnapshotHoogleDbId) -> ()
_hideUnusedWarnings _ = () _hideUnusedWarnings _ = ()
@ -146,12 +154,24 @@ class (MonadThrow m, MonadIO m) => GetStackageDatabase env m | m -> env where
instance (HasLogFunc env, HasPantryConfig env) => GetStackageDatabase env (RIO env) where instance (HasLogFunc env, HasPantryConfig env) => GetStackageDatabase env (RIO env) where
getStackageDatabase = do getStackageDatabase = view pantryConfigL >>= getStackageDatabaseFromPantry
env <- view pantryConfigL
let Storage runStorage _ = pcStorage env
pure $ StackageDatabase runStorage
getLogFunc = view logFuncL getLogFunc = view logFuncL
getStackageDatabaseFromPantry :: PantryConfig -> RIO env StackageDatabase
getStackageDatabaseFromPantry pc = do
let Storage runStorage _ = pcStorage pc
pure $ StackageDatabase runStorage
getCurrentHoogleVersionId :: HasLogFunc env => ReaderT SqlBackend (RIO env) VersionId
getCurrentHoogleVersionId = do
currentHoogleVersion <- parseVersionThrowing VERSION_hoogle
getVersionId currentHoogleVersion
getCurrentHoogleVersionIdWithPantryConfig :: HasLogFunc env => PantryConfig -> RIO env VersionId
getCurrentHoogleVersionIdWithPantryConfig pantryConfig = do
stackageDb <- getStackageDatabaseFromPantry pantryConfig
runDatabase stackageDb getCurrentHoogleVersionId
run :: GetStackageDatabase env m => SqlPersistT (RIO RIO.LogFunc) a -> m a run :: GetStackageDatabase env m => SqlPersistT (RIO RIO.LogFunc) a -> m a

View File

@ -88,6 +88,7 @@ data StackageCron = StackageCron
, scSnapshotsRepo :: !GithubRepo , scSnapshotsRepo :: !GithubRepo
, scReportProgress :: !Bool , scReportProgress :: !Bool
, scCacheCabalFiles :: !Bool , scCacheCabalFiles :: !Bool
, scHoogleVersionId :: !VersionId
} }
instance HasEnv StackageCron where instance HasEnv StackageCron where

View File

@ -3,7 +3,7 @@
<div .span6> <div .span6>
<img src=@{StaticR img_logo_png} .logo> <img src=@{StaticR img_logo_png} .logo>
<div .span6> <div .span6>
<form class="hoogle" action="/lts/hoogle"> <form class="hoogle" action="/#{latestLtsNameWithHoogle}/hoogle">
<div class="input-append hoogle-q"> <div class="input-append hoogle-q">
<input class="search span3" type="search" autofocus="" name="q" value="" placeholder="E.g. map, a -> a, etc."> <input class="search span3" type="search" autofocus="" name="q" value="" placeholder="E.g. map, a -> a, etc.">
<button class="btn" type="submit"> <button class="btn" type="submit">