mirror of
https://github.com/commercialhaskell/stackage-server.git
synced 2026-01-20 07:51:55 +01:00
Allow uploading LTS and nightly snapshots
This commit is contained in:
parent
529f9483cd
commit
45e7f50fea
@ -6,7 +6,6 @@ module Handler.Alias
|
|||||||
|
|
||||||
import Import
|
import Import
|
||||||
import Data.Slug (Slug)
|
import Data.Slug (Slug)
|
||||||
import Data.Text.Read (decimal)
|
|
||||||
import Handler.StackageHome (getStackageHomeR, getStackageMetadataR, getStackageCabalConfigR)
|
import Handler.StackageHome (getStackageHomeR, getStackageMetadataR, getStackageCabalConfigR)
|
||||||
import Handler.StackageIndex (getStackageIndexR, getStackageBundleR)
|
import Handler.StackageIndex (getStackageIndexR, getStackageBundleR)
|
||||||
import Handler.StackageSdist (getStackageSdistR)
|
import Handler.StackageSdist (getStackageSdistR)
|
||||||
@ -22,13 +21,6 @@ handleAliasR user name pieces = do
|
|||||||
Nothing -> notFound
|
Nothing -> notFound
|
||||||
Just route -> redirect (route :: Route App)
|
Just route -> redirect (route :: Route App)
|
||||||
|
|
||||||
parseLtsPair :: Text -> Maybe (Int, Int)
|
|
||||||
parseLtsPair t1 = do
|
|
||||||
(x, t2) <- either (const Nothing) Just $ decimal t1
|
|
||||||
t3 <- stripPrefix "." t2
|
|
||||||
(y, "") <- either (const Nothing) Just $ decimal t3
|
|
||||||
Just (x, y)
|
|
||||||
|
|
||||||
getLtsR :: [Text] -> Handler ()
|
getLtsR :: [Text] -> Handler ()
|
||||||
getLtsR pieces0 =
|
getLtsR pieces0 =
|
||||||
case pieces0 of
|
case pieces0 of
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
module Handler.UploadStackage where
|
module Handler.UploadStackage where
|
||||||
|
|
||||||
import Import hiding (catch, get, update)
|
import Import hiding (catch, get, update)
|
||||||
|
import qualified Import
|
||||||
import System.IO.Temp (withSystemTempFile, withSystemTempDirectory, openBinaryTempFile)
|
import System.IO.Temp (withSystemTempFile, withSystemTempDirectory, openBinaryTempFile)
|
||||||
import Crypto.Hash.Conduit (sinkHash)
|
import Crypto.Hash.Conduit (sinkHash)
|
||||||
import Crypto.Hash (Digest, SHA1)
|
import Crypto.Hash (Digest, SHA1)
|
||||||
@ -18,7 +19,7 @@ import Control.Monad.Trans.Resource (allocate)
|
|||||||
import System.Directory (removeFile, getTemporaryDirectory)
|
import System.Directory (removeFile, getTemporaryDirectory)
|
||||||
import System.Process (runProcess, waitForProcess)
|
import System.Process (runProcess, waitForProcess)
|
||||||
import System.Exit (ExitCode (ExitSuccess))
|
import System.Exit (ExitCode (ExitSuccess))
|
||||||
import Data.Slug (mkSlug, SnapSlug (..), safeMakeSlug)
|
import Data.Slug (mkSlug, SnapSlug (..), safeMakeSlug, unSlug)
|
||||||
|
|
||||||
fileKey :: Text
|
fileKey :: Text
|
||||||
fileKey = "stackage"
|
fileKey = "stackage"
|
||||||
@ -42,6 +43,9 @@ putUploadStackageR = do
|
|||||||
Nothing -> invalidArgs ["Upload missing"]
|
Nothing -> invalidArgs ["Upload missing"]
|
||||||
Just file -> do
|
Just file -> do
|
||||||
malias <- lookupPostParam "alias"
|
malias <- lookupPostParam "alias"
|
||||||
|
extra <- getExtra
|
||||||
|
mlts <- lookupPostParam "lts"
|
||||||
|
mnightly <- lookupPostParam "nightly"
|
||||||
|
|
||||||
tempDir <- liftIO getTemporaryDirectory
|
tempDir <- liftIO getTemporaryDirectory
|
||||||
(_releaseKey, (fp, handleOut)) <- allocate
|
(_releaseKey, (fp, handleOut)) <- allocate
|
||||||
@ -67,13 +71,32 @@ putUploadStackageR = do
|
|||||||
done msg url = updateHelper (ProgressDone msg url)
|
done msg url = updateHelper (ProgressDone msg url)
|
||||||
onExc e = done ("Exception occurred: " ++ tshow e) ProfileR
|
onExc e = done ("Exception occurred: " ++ tshow e) ProfileR
|
||||||
setAlias = do
|
setAlias = do
|
||||||
forM_ (malias >>= mkSlug) $ \alias -> runDB $ do
|
forM_ (malias >>= mkSlug) $ \alias -> do
|
||||||
deleteWhere [AliasUser ==. uid, AliasName ==. alias]
|
deleteWhere [AliasUser ==. uid, AliasName ==. alias]
|
||||||
insert_ Alias
|
insert_ Alias
|
||||||
{ aliasUser = uid
|
{ aliasUser = uid
|
||||||
, aliasName = alias
|
, aliasName = alias
|
||||||
, aliasTarget = ident
|
, aliasTarget = ident
|
||||||
}
|
}
|
||||||
|
whenAdmin inner = do
|
||||||
|
muser <- Import.get uid
|
||||||
|
forM_ muser $ \user ->
|
||||||
|
when (unSlug (userHandle user) `member` adminUsers extra)
|
||||||
|
inner
|
||||||
|
setLts sid = forM_ mlts
|
||||||
|
$ \lts -> whenAdmin
|
||||||
|
$ forM_ (parseLtsPair lts) $ \(major, minor) -> do
|
||||||
|
mx <- getBy $ UniqueLts major minor
|
||||||
|
when (isNothing mx) $ insert_ $ Lts major minor sid
|
||||||
|
setNightly sid = forM_ mnightly $ \nightly -> whenAdmin $ do
|
||||||
|
now <- liftIO getCurrentTime
|
||||||
|
let day = utctDay now
|
||||||
|
mx <- getBy $ UniqueNightly day
|
||||||
|
when (isNothing mx) $ insert_ Nightly
|
||||||
|
{ nightlyDay = day
|
||||||
|
, nightlyGhcVersion = nightly
|
||||||
|
, nightlyStackage = sid
|
||||||
|
}
|
||||||
|
|
||||||
update "Starting"
|
update "Starting"
|
||||||
|
|
||||||
@ -121,9 +144,12 @@ putUploadStackageR = do
|
|||||||
, packageVersion = version
|
, packageVersion = version
|
||||||
, packageOverwrite = overwrite
|
, packageOverwrite = overwrite
|
||||||
}
|
}
|
||||||
return slug
|
|
||||||
|
|
||||||
setAlias
|
setAlias
|
||||||
|
setLts sid
|
||||||
|
setNightly sid
|
||||||
|
|
||||||
|
return slug
|
||||||
|
|
||||||
done "Stackage created" $ SnapshotR slug StackageHomeR
|
done "Stackage created" $ SnapshotR slug StackageHomeR
|
||||||
else do
|
else do
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import Types as Import
|
|||||||
import Yesod.Auth as Import
|
import Yesod.Auth as Import
|
||||||
import Data.Slug (mkSlug)
|
import Data.Slug (mkSlug)
|
||||||
import Data.WebsiteContent as Import (WebsiteContent (..))
|
import Data.WebsiteContent as Import (WebsiteContent (..))
|
||||||
|
import Data.Text.Read (decimal)
|
||||||
|
|
||||||
requireAuthIdOrToken :: Handler UserId
|
requireAuthIdOrToken :: Handler UserId
|
||||||
requireAuthIdOrToken = do
|
requireAuthIdOrToken = do
|
||||||
@ -26,3 +27,10 @@ requireAuthIdOrToken = do
|
|||||||
case muser of
|
case muser of
|
||||||
Nothing -> invalidArgs ["Unknown token: " ++ token]
|
Nothing -> invalidArgs ["Unknown token: " ++ token]
|
||||||
Just (Entity uid _) -> return uid
|
Just (Entity uid _) -> return uid
|
||||||
|
|
||||||
|
parseLtsPair :: Text -> Maybe (Int, Int)
|
||||||
|
parseLtsPair t1 = do
|
||||||
|
(x, t2) <- either (const Nothing) Just $ decimal t1
|
||||||
|
t3 <- stripPrefix "." t2
|
||||||
|
(y, "") <- either (const Nothing) Just $ decimal t3
|
||||||
|
Just (x, y)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user