Compare repos dir and repos in DB when launching Vervis
This commit is contained in:
parent
59d08782ba
commit
54ea66878f
1 changed files with 52 additions and 1 deletions
|
@ -1,6 +1,6 @@
|
||||||
{- This file is part of Vervis.
|
{- This file is part of Vervis.
|
||||||
-
|
-
|
||||||
- Written in 2016, 2018, 2019 by fr33domlover <fr33domlover@riseup.net>.
|
- Written in 2016, 2018, 2019, 2020 by fr33domlover <fr33domlover@riseup.net>.
|
||||||
-
|
-
|
||||||
- ♡ Copying is an act of love. Please copy, reuse and share.
|
- ♡ Copying is an act of love. Please copy, reuse and share.
|
||||||
-
|
-
|
||||||
|
@ -36,6 +36,10 @@ import Control.Monad
|
||||||
import Control.Monad.Logger (liftLoc, runLoggingT, logInfo, logError)
|
import Control.Monad.Logger (liftLoc, runLoggingT, logInfo, logError)
|
||||||
import Control.Monad.Trans.Reader
|
import Control.Monad.Trans.Reader
|
||||||
import Data.Default.Class
|
import Data.Default.Class
|
||||||
|
import Data.Foldable
|
||||||
|
import Data.List.NonEmpty (nonEmpty)
|
||||||
|
import Data.Maybe
|
||||||
|
import Data.Traversable
|
||||||
import Database.Persist.Postgresql
|
import Database.Persist.Postgresql
|
||||||
import Graphics.SVGFonts.Fonts (lin2)
|
import Graphics.SVGFonts.Fonts (lin2)
|
||||||
import Graphics.SVGFonts.ReadFont (loadFont)
|
import Graphics.SVGFonts.ReadFont (loadFont)
|
||||||
|
@ -51,6 +55,8 @@ import Network.Wai.Middleware.RequestLogger (Destination (Logger),
|
||||||
IPAddrSource (..),
|
IPAddrSource (..),
|
||||||
OutputFormat (..), destination,
|
OutputFormat (..), destination,
|
||||||
mkRequestLogger, outputFormat)
|
mkRequestLogger, outputFormat)
|
||||||
|
import System.Directory
|
||||||
|
import System.FilePath
|
||||||
import System.Log.FastLogger
|
import System.Log.FastLogger
|
||||||
import Yesod.Auth
|
import Yesod.Auth
|
||||||
import Yesod.Core
|
import Yesod.Core
|
||||||
|
@ -60,7 +66,9 @@ import Yesod.Default.Config2
|
||||||
import Yesod.Persist.Core
|
import Yesod.Persist.Core
|
||||||
import Yesod.Static
|
import Yesod.Static
|
||||||
|
|
||||||
|
import qualified Data.CaseInsensitive as CI
|
||||||
import qualified Data.Text as T (unpack)
|
import qualified Data.Text as T (unpack)
|
||||||
|
import qualified Database.Esqueleto as E
|
||||||
|
|
||||||
import Database.Persist.Schema.PostgreSQL (schemaBackend)
|
import Database.Persist.Schema.PostgreSQL (schemaBackend)
|
||||||
import Yesod.Mail.Send (runMailer)
|
import Yesod.Mail.Send (runMailer)
|
||||||
|
@ -71,6 +79,7 @@ import Network.FedURI
|
||||||
import Yesod.MonadSite
|
import Yesod.MonadSite
|
||||||
|
|
||||||
import Control.Concurrent.Local
|
import Control.Concurrent.Local
|
||||||
|
import Data.List.NonEmpty.Local
|
||||||
import Web.Hashids.Local
|
import Web.Hashids.Local
|
||||||
|
|
||||||
import Vervis.ActorKey (generateActorKey, actorKeyRotator)
|
import Vervis.ActorKey (generateActorKey, actorKeyRotator)
|
||||||
|
@ -101,6 +110,9 @@ import Vervis.Handler.Wiki
|
||||||
import Vervis.Handler.Workflow
|
import Vervis.Handler.Workflow
|
||||||
|
|
||||||
import Vervis.Migration (migrateDB)
|
import Vervis.Migration (migrateDB)
|
||||||
|
import Vervis.Model
|
||||||
|
import Vervis.Model.Ident
|
||||||
|
import Vervis.Path
|
||||||
import Vervis.Settings
|
import Vervis.Settings
|
||||||
import Vervis.Ssh (runSsh)
|
import Vervis.Ssh (runSsh)
|
||||||
|
|
||||||
|
@ -197,6 +209,7 @@ makeFoundation appSettings = do
|
||||||
error $ T.unpack msg
|
error $ T.unpack msg
|
||||||
Right (_from, _to) -> do
|
Right (_from, _to) -> do
|
||||||
$logInfo "DB migration success"
|
$logInfo "DB migration success"
|
||||||
|
verifyRepoDir
|
||||||
fixRunningDeliveries
|
fixRunningDeliveries
|
||||||
deleteUnusedURAs
|
deleteUnusedURAs
|
||||||
writePostReceiveHooks
|
writePostReceiveHooks
|
||||||
|
@ -211,6 +224,44 @@ makeFoundation appSettings = do
|
||||||
|
|
||||||
-- Return the foundation
|
-- Return the foundation
|
||||||
return app
|
return app
|
||||||
|
where
|
||||||
|
verifyRepoDir = do
|
||||||
|
repos <- lift repoTreeFromDir
|
||||||
|
repos' <- repoTreeFromDB
|
||||||
|
unless (repos == repos') $
|
||||||
|
error "Repo dir check failed!"
|
||||||
|
liftIO $
|
||||||
|
for_ repos $ \ (shr, rps) ->
|
||||||
|
for_ rps $ \ rp ->
|
||||||
|
putStrLn $ "Found repo " ++ shr ++ " / " ++ rp
|
||||||
|
repoTreeFromDir = do
|
||||||
|
dir <- askRepoRootDir
|
||||||
|
outers <- liftIO $ listDirectory dir
|
||||||
|
repos <- for outers $ \ outer -> do
|
||||||
|
let path = dir </> outer
|
||||||
|
checkDir path
|
||||||
|
inners <- liftIO $ listDirectory path
|
||||||
|
traverse_ (checkDir . (path </>)) inners
|
||||||
|
return $ (outer,) <$> nonEmpty inners
|
||||||
|
return $ catMaybes repos
|
||||||
|
where
|
||||||
|
checkDir path = liftIO $ do
|
||||||
|
isdir <- doesDirectoryExist path
|
||||||
|
islink <- pathIsSymbolicLink path
|
||||||
|
unless (isdir && not islink) $
|
||||||
|
error $ "Non-dir file: " ++ path
|
||||||
|
repoTreeFromDB =
|
||||||
|
fmap adapt $ E.select $ E.from $ \ (s `E.InnerJoin` r) -> do
|
||||||
|
E.on $ s E.^. SharerId E.==. r E.^. RepoSharer
|
||||||
|
E.orderBy [E.asc $ s E.^. SharerIdent, E.asc $ r E.^. RepoIdent]
|
||||||
|
return (s E.^. SharerIdent, r E.^. RepoIdent)
|
||||||
|
where
|
||||||
|
adapt =
|
||||||
|
groupWithExtract
|
||||||
|
(lower . unShrIdent . E.unValue . fst)
|
||||||
|
(lower . unRpIdent . E.unValue . snd)
|
||||||
|
where
|
||||||
|
lower = T.unpack . CI.foldedCase
|
||||||
|
|
||||||
-- | Convert our foundation to a WAI Application by calling @toWaiAppPlain@ and
|
-- | Convert our foundation to a WAI Application by calling @toWaiAppPlain@ and
|
||||||
-- applying some additional middlewares.
|
-- applying some additional middlewares.
|
||||||
|
|
Loading…
Reference in a new issue