add ability to specify package architectures for publish script, as well as deindex them

This commit is contained in:
Lucy Cifferello
2023-07-20 11:26:37 -04:00
parent e4cd1bae09
commit e8da4ec893
4 changed files with 47 additions and 20 deletions

View File

@@ -63,6 +63,7 @@ dependencies:
- unliftio - unliftio
- unordered-containers - unordered-containers
- unix - unix
- utility-ht
- wai - wai
- wai-cors - wai-cors
- wai-extra - wai-extra

View File

@@ -70,7 +70,7 @@ import Handler.Admin (
PackageList (..), PackageList (..),
) )
import Lib.External.AppMgr (sourceManifest) import Lib.External.AppMgr (sourceManifest)
import Lib.Types.Core (PkgId (..)) import Lib.Types.Core (PkgId (..), OsArch)
import Lib.Types.Emver (Version (..)) import Lib.Types.Emver (Version (..))
import Lib.Types.Manifest (PackageManifest (..)) import Lib.Types.Manifest (PackageManifest (..))
import Network.HTTP.Client.Conduit ( import Network.HTTP.Client.Conduit (
@@ -109,7 +109,6 @@ import Options.Applicative (
help, help,
helper, helper,
info, info,
liftA3,
long, long,
mappend, mappend,
metavar, metavar,
@@ -205,12 +204,16 @@ import Yesod (
logError, logError,
logWarn, logWarn,
) )
import Prelude (read)
import Options.Applicative (some)
import Control.Applicative.HT (lift4)
data Upload = Upload data Upload = Upload
{ publishRepoName :: !String { publishRepoName :: !String
, publishPkg :: !(Maybe FilePath) , publishPkg :: !(Maybe FilePath)
, publishIndex :: !Bool , publishIndex :: !Bool
, publishArches :: !(Maybe [OsArch])
} }
deriving (Show) deriving (Show)
@@ -253,7 +256,7 @@ data Command
| CmdRegDel !String | CmdRegDel !String
| CmdRegList | CmdRegList
| CmdUpload !Upload | CmdUpload !Upload
| CmdIndex !String !String !Version !Bool | CmdIndex !String !String !Version !(Maybe [OsArch]) !Bool
| CmdListUnindexed !String | CmdListUnindexed !String
| CmdCatAdd !String !String !(Maybe String) !(Maybe Int) | CmdCatAdd !String !String !(Maybe String) !(Maybe Int)
| CmdCatDel !String !String | CmdCatDel !String !String
@@ -281,7 +284,7 @@ parsePublish =
"upload" "upload"
where where
go = go =
liftA3 lift4
Upload Upload
(strOption (short 't' <> long "target" <> metavar "NAME" <> help "Name of registry in publish.dhall")) (strOption (short 't' <> long "target" <> metavar "NAME" <> help "Name of registry in publish.dhall"))
( optional $ ( optional $
@@ -289,7 +292,17 @@ parsePublish =
(short 'p' <> long "package" <> metavar "S9PK" <> help "File path of the package to publish") (short 'p' <> long "package" <> metavar "S9PK" <> help "File path of the package to publish")
) )
(switch (short 'i' <> long "index" <> help "Index the package after uploading")) (switch (short 'i' <> long "index" <> help "Index the package after uploading"))
( optional $
some parseArch
)
parseArch :: Parser OsArch
parseArch = read <$> strOption
( short 'a'
<> long "arches"
<> metavar "ARCHES"
<> help "Single element of package architectures type. Options include x86_64 and aarch64."
)
parseRepoAdd :: Parser Command parseRepoAdd :: Parser Command
parseRepoAdd = subparser $ command "add" (info go $ progDesc "Add a registry to your config") <> metavar "add" parseRepoAdd = subparser $ command "add" (info go $ progDesc "Add a registry to your config") <> metavar "add"
@@ -349,6 +362,7 @@ parseIndexHelper b =
<$> strOption (short 't' <> long "target" <> metavar "REGISTRY_NAME") <$> strOption (short 't' <> long "target" <> metavar "REGISTRY_NAME")
<*> strArgument (metavar "PKG") <*> strArgument (metavar "PKG")
<*> strArgument (metavar "VERSION") <*> strArgument (metavar "VERSION")
<*> optional (some parseArch)
<*> pure b <*> pure b
@@ -430,7 +444,7 @@ cliMain =
CmdRegDel s -> regRm s CmdRegDel s -> regRm s
CmdRegList -> regLs CmdRegList -> regLs
CmdUpload up -> upload up CmdUpload up -> upload up
CmdIndex name pkg v shouldIndex -> if shouldIndex then index name pkg v else deindex name pkg v CmdIndex name pkg v arches shouldIndex -> if shouldIndex then index name pkg v arches else deindex name pkg v arches
CmdListUnindexed name -> listUnindexed name CmdListUnindexed name -> listUnindexed name
CmdCatAdd target cat desc pri -> catAdd target cat desc pri CmdCatAdd target cat desc pri -> catAdd target cat desc pri
CmdCatDel target cat -> catDel target cat CmdCatDel target cat -> catDel target cat
@@ -495,7 +509,7 @@ regLs = do
upload :: Upload -> IO () upload :: Upload -> IO ()
upload (Upload name mpkg shouldIndex) = do upload (Upload name mpkg shouldIndex arches) = do
PublishCfgRepo{..} <- findNameInCfg name PublishCfgRepo{..} <- findNameInCfg name
pkg <- case mpkg of pkg <- case mpkg of
Nothing -> do Nothing -> do
@@ -539,18 +553,18 @@ upload (Upload name mpkg shouldIndex) = do
exitWith $ ExitFailure 1 exitWith $ ExitFailure 1
Right a -> pure a Right a -> pure a
let pkgId = toS $ unPkgId packageManifestId let pkgId = toS $ unPkgId packageManifestId
index name pkgId packageManifestVersion index name pkgId packageManifestVersion arches
putChunkLn $ fromString ("Successfully indexed " <> pkgId <> "@" <> show packageManifestVersion) & fore green putChunkLn $ fromString ("Successfully indexed " <> pkgId <> "@" <> show packageManifestVersion) & fore green
where where
sfs2prog :: StreamFileStatus -> Progress () sfs2prog :: StreamFileStatus -> Progress ()
sfs2prog StreamFileStatus{..} = Progress (fromIntegral readSoFar) (fromIntegral fileSize) () sfs2prog StreamFileStatus{..} = Progress (fromIntegral readSoFar) (fromIntegral fileSize) ()
index :: String -> String -> Version -> IO () index :: String -> String -> Version -> (Maybe [OsArch]) -> IO ()
index name pkg v = performHttp name "POST" [i|/admin/v0/index|] (IndexPkgReq (PkgId $ toS pkg) v) index name pkg v arches = performHttp name "POST" [i|/admin/v0/index|] (IndexPkgReq (PkgId $ toS pkg) v arches)
deindex :: String -> String -> Version -> IO () deindex :: String -> String -> Version -> (Maybe [OsArch]) -> IO ()
deindex name pkg v = performHttp name "POST" [i|/admin/v0/deindex|] (IndexPkgReq (PkgId $ toS pkg) v) deindex name pkg v arches = performHttp name "POST" [i|/admin/v0/deindex|] (IndexPkgReq (PkgId $ toS pkg) v arches)
listUnindexed :: String -> IO () listUnindexed :: String -> IO ()

View File

@@ -11,7 +11,7 @@ import Database.Persist.Sql (
SqlBackend, SqlBackend,
) )
import Lib.Types.Core ( import Lib.Types.Core (
PkgId, OsArch (X86_64, AARCH64_NONFREE), PkgId, OsArch (X86_64, AARCH64),
) )
import Lib.Types.Emver (Version) import Lib.Types.Emver (Version)
import Model ( import Model (
@@ -326,11 +326,13 @@ upsertPackageVersion PackageManifest{..} = do
_res <- try @_ @SomeException $ insertKey pkgId (PkgRecord False now (Just now)) _res <- try @_ @SomeException $ insertKey pkgId (PkgRecord False now (Just now))
repsert (VersionRecordKey pkgId packageManifestVersion) ins repsert (VersionRecordKey pkgId packageManifestVersion) ins
upsertPackageVersionPlatform :: (MonadUnliftIO m) => PackageManifest -> ReaderT SqlBackend m () upsertPackageVersionPlatform :: (MonadUnliftIO m) => (Maybe [OsArch]) -> PackageManifest -> ReaderT SqlBackend m ()
upsertPackageVersionPlatform PackageManifest{..} = do upsertPackageVersionPlatform maybeArches PackageManifest{..} = do
now <- liftIO getCurrentTime now <- liftIO getCurrentTime
let pkgId = PkgRecordKey packageManifestId let pkgId = PkgRecordKey packageManifestId
let arches = [X86_64 .. AARCH64_NONFREE] let arches = case maybeArches of
Just a -> a
Nothing -> [X86_64 .. AARCH64]
let records = createVersionPlatformRecord now pkgId packageManifestVersion <$> arches let records = createVersionPlatformRecord now pkgId packageManifestVersion <$> arches
repsertMany records repsertMany records
where where

View File

@@ -46,7 +46,7 @@ import Database.Persist (
entityVal, entityVal,
insert_, insert_,
selectList, selectList,
(=.), (=.), PersistQueryWrite (deleteWhere),
) )
import Database.Persist.Postgresql (runSqlPoolNoTransaction) import Database.Persist.Postgresql (runSqlPoolNoTransaction)
import Database.Queries (upsertPackageVersion, upsertPackageVersionPlatform) import Database.Queries (upsertPackageVersion, upsertPackageVersionPlatform)
@@ -67,12 +67,12 @@ import Lib.PkgRepository (
getPackages, getPackages,
getVersionsFor, getVersionsFor,
) )
import Lib.Types.Core (PkgId (unPkgId)) import Lib.Types.Core (PkgId (unPkgId), OsArch)
import Lib.Types.Emver (Version (..)) import Lib.Types.Emver (Version (..))
import Lib.Types.Manifest (PackageManifest (..)) import Lib.Types.Manifest (PackageManifest (..))
import Model ( import Model (
Category (..), Category (..),
EntityField (EosHashHash), EntityField (EosHashHash, VersionPlatformArch, VersionPlatformVersionNumber, VersionPlatformPkgId),
EosHash (EosHash), EosHash (EosHash),
Key (AdminKey, PkgRecordKey, VersionRecordKey), Key (AdminKey, PkgRecordKey, VersionRecordKey),
PkgCategory (PkgCategory), PkgCategory (PkgCategory),
@@ -149,6 +149,7 @@ import Yesod.Auth (YesodAuth (maybeAuthId))
import Yesod.Core.Types (JSONResponse (JSONResponse)) import Yesod.Core.Types (JSONResponse (JSONResponse))
import Database.Persist.Sql (runSqlPool) import Database.Persist.Sql (runSqlPool)
import Data.List (elem, length) import Data.List (elem, length)
import Database.Persist ((==.))
postPkgUploadR :: Handler () postPkgUploadR :: Handler ()
postPkgUploadR = do postPkgUploadR = do
@@ -213,12 +214,14 @@ postEosUploadR = do
data IndexPkgReq = IndexPkgReq data IndexPkgReq = IndexPkgReq
{ indexPkgReqId :: !PkgId { indexPkgReqId :: !PkgId
, indexPkgReqVersion :: !Version , indexPkgReqVersion :: !Version
, indexPkgReqArches :: !(Maybe [OsArch])
} }
deriving (Eq, Show) deriving (Eq, Show)
instance FromJSON IndexPkgReq where instance FromJSON IndexPkgReq where
parseJSON = withObject "Index Package Request" $ \o -> do parseJSON = withObject "Index Package Request" $ \o -> do
indexPkgReqId <- o .: "id" indexPkgReqId <- o .: "id"
indexPkgReqVersion <- o .: "version" indexPkgReqVersion <- o .: "version"
indexPkgReqArches <- o .: "arches"
pure IndexPkgReq{..} pure IndexPkgReq{..}
instance ToJSON IndexPkgReq where instance ToJSON IndexPkgReq where
toJSON IndexPkgReq{..} = object ["id" .= indexPkgReqId, "version" .= indexPkgReqVersion] toJSON IndexPkgReq{..} = object ["id" .= indexPkgReqId, "version" .= indexPkgReqVersion]
@@ -235,12 +238,19 @@ postPkgIndexR = do
[i|Could not locate manifest for #{indexPkgReqId}@#{indexPkgReqVersion}|] [i|Could not locate manifest for #{indexPkgReqId}@#{indexPkgReqVersion}|]
pool <- getsYesod appConnPool pool <- getsYesod appConnPool
runSqlPoolNoTransaction (upsertPackageVersion man) pool Nothing runSqlPoolNoTransaction (upsertPackageVersion man) pool Nothing
runSqlPool (upsertPackageVersionPlatform man) pool runSqlPool (upsertPackageVersionPlatform indexPkgReqArches man) pool
postPkgDeindexR :: Handler () postPkgDeindexR :: Handler ()
postPkgDeindexR = do postPkgDeindexR = do
IndexPkgReq{..} <- requireCheckJsonBody IndexPkgReq{..} <- requireCheckJsonBody
runDB $ delete (VersionRecordKey (PkgRecordKey indexPkgReqId) indexPkgReqVersion) case indexPkgReqArches of
Nothing -> runDB $ delete (VersionRecordKey (PkgRecordKey indexPkgReqId) indexPkgReqVersion)
Just a -> do
_ <- traverse (deleteArch indexPkgReqId indexPkgReqVersion) a
pure ()
where
deleteArch :: PkgId -> Version -> OsArch -> Handler ()
deleteArch id v a = runDB $ deleteWhere [VersionPlatformArch ==. a, VersionPlatformVersionNumber ==. v, VersionPlatformPkgId ==. PkgRecordKey id]
newtype PackageList = PackageList {unPackageList :: HashMap PkgId [Version]} newtype PackageList = PackageList {unPackageList :: HashMap PkgId [Version]}