nixpkgs-update/app/Main.hs

174 lines
6.0 KiB
Haskell
Raw Normal View History

2018-03-31 06:07:46 +03:00
{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE NamedFieldPuns #-}
2018-04-04 12:24:55 +03:00
{-# LANGUAGE OverloadedStrings #-}
2018-03-31 06:07:46 +03:00
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
2018-04-04 12:24:55 +03:00
module Main where
import Control.Applicative ((<**>))
2018-03-31 06:07:46 +03:00
import qualified Data.Text as T
2018-07-11 05:30:34 +03:00
import qualified Data.Text.IO as T
2018-09-06 16:47:09 +03:00
import DeleteMerged (deleteDone)
import Git
import qualified GitHub as GH
2019-10-07 02:17:08 +03:00
import NVD (withVulnDB)
import qualified Nix
import qualified Options.Applicative as O
2020-01-20 02:13:28 +03:00
import OurPrelude
import qualified Repology
import System.IO (BufferMode (..), hSetBuffering, stderr, stdout)
import qualified System.Posix.Env as P
2023-01-05 07:29:13 +03:00
import Update (cveAll, cveReport, sourceGithubAll, updatePackage)
import Utils (Options (..), UpdateEnv (..), getGithubToken, getGithubUser)
2018-04-04 02:03:46 +03:00
2018-03-31 06:07:46 +03:00
default (T.Text)
2020-07-21 15:36:23 +03:00
data UpdateOptions = UpdateOptions
{ pr :: Bool,
cve :: Bool,
nixpkgsReview :: Bool,
outpaths :: Bool,
attrpathOpt :: Bool
2020-07-21 15:36:23 +03:00
}
data Command
= Update UpdateOptions Text
2022-07-07 18:01:40 +03:00
| UpdateBatch UpdateOptions Text
| DeleteDone Bool
| Version
2019-09-08 02:53:01 +03:00
| UpdateVulnDB
2019-10-07 02:17:08 +03:00
| CheckAllVulnerable
2019-10-13 00:37:34 +03:00
| SourceGithub
2020-01-20 02:13:28 +03:00
| FetchRepology
2019-10-07 02:17:08 +03:00
| CheckVulnerable Text Text Text
2018-04-04 02:03:46 +03:00
updateOptionsParser :: O.Parser UpdateOptions
updateOptionsParser =
UpdateOptions
<$> O.flag False True (O.long "pr" <> O.help "Make a pull request using Hub.")
<*> O.flag False True (O.long "cve" <> O.help "Make a CVE vulnerability report.")
2020-04-13 02:36:59 +03:00
<*> O.flag False True (O.long "nixpkgs-review" <> O.help "Runs nixpkgs-review on update commit rev")
2020-02-22 09:18:14 +03:00
<*> O.flag False True (O.long "outpaths" <> O.help "Calculate outpaths to determine the branch to target")
<*> O.flag False True (O.long "attrpath" <> O.help "UPDATE_INFO uses the exact attrpath.")
updateParser :: O.Parser Command
updateParser =
Update
<$> updateOptionsParser
<*> O.strArgument (O.metavar "UPDATE_INFO" <> O.help "update string of the form: 'pkg oldVer newVer update-page'\n\n example: 'tflint 0.15.0 0.15.1 repology.org'")
2022-07-28 06:24:10 +03:00
updateBatchParser :: O.Parser Command
updateBatchParser =
UpdateBatch
<$> updateOptionsParser
<*> O.strArgument (O.metavar "UPDATE_INFO" <> O.help "update string of the form: 'pkg oldVer newVer update-page'\n\n example: 'tflint 0.15.0 0.15.1 repology.org'")
deleteDoneParser :: O.Parser Command
deleteDoneParser =
DeleteDone
<$> O.flag False True (O.long "delete" <> O.help "Actually delete the done branches. Otherwise just prints the branches to delete.")
commandParser :: O.Parser Command
commandParser =
O.hsubparser
2024-04-03 01:01:16 +03:00
( O.command
"update"
(O.info (updateParser) (O.progDesc "Update one package"))
2022-07-07 18:01:40 +03:00
<> O.command
"update-batch"
2022-07-28 06:24:10 +03:00
(O.info (updateBatchParser) (O.progDesc "Update one package in batch mode."))
2020-01-20 02:13:28 +03:00
<> O.command
"delete-done"
( O.info
deleteDoneParser
2020-01-20 02:13:28 +03:00
(O.progDesc "Deletes branches from PRs that were merged or closed")
)
<> O.command
"version"
( O.info
(pure Version)
( O.progDesc
"Displays version information for nixpkgs-update and dependencies"
)
)
<> O.command
"update-vulnerability-db"
( O.info
(pure UpdateVulnDB)
(O.progDesc "Updates the vulnerability database")
)
<> O.command
"check-vulnerable"
(O.info checkVulnerable (O.progDesc "checks if something is vulnerable"))
<> O.command
"check-all-vulnerable"
( O.info
(pure CheckAllVulnerable)
(O.progDesc "checks all packages to update for vulnerabilities")
)
<> O.command
"source-github"
(O.info (pure SourceGithub) (O.progDesc "looks for updates on GitHub"))
<> O.command
"fetch-repology"
(O.info (pure FetchRepology) (O.progDesc "fetches update from Repology and prints them to stdout"))
)
checkVulnerable :: O.Parser Command
checkVulnerable =
2024-04-03 01:01:16 +03:00
CheckVulnerable
<$> O.strArgument (O.metavar "PRODUCT_ID")
2020-01-20 02:13:28 +03:00
<*> O.strArgument (O.metavar "OLD_VERSION")
<*> O.strArgument (O.metavar "NEW_VERSION")
programInfo :: O.ParserInfo Command
2018-04-06 18:17:22 +03:00
programInfo =
O.info
(commandParser <**> O.helper)
2020-01-20 02:13:28 +03:00
( O.fullDesc
<> O.progDesc "Update packages in the Nixpkgs repository"
<> O.header "nixpkgs-update"
)
2018-03-31 06:07:46 +03:00
main :: IO ()
2018-07-11 05:30:34 +03:00
main = do
2020-01-13 18:52:39 +03:00
hSetBuffering stdout LineBuffering
hSetBuffering stderr LineBuffering
command <- O.execParser programInfo
ghUser <- getGithubUser
token <- fromMaybe "" <$> getGithubToken
P.setEnv "GITHUB_TOKEN" (T.unpack token) True
P.setEnv "GITHUB_API_TOKEN" (T.unpack token) True
P.setEnv "PAGER" "" True
case command of
DeleteDone delete -> do
setupNixpkgs $ GH.untagName ghUser
deleteDone delete token ghUser
2021-11-13 22:58:24 +03:00
Update UpdateOptions {pr, cve, nixpkgsReview, outpaths, attrpathOpt} update -> do
setupNixpkgs $ GH.untagName ghUser
2021-11-13 22:58:24 +03:00
updatePackage (Options pr False ghUser token cve nixpkgsReview outpaths attrpathOpt) update
2022-07-07 18:01:40 +03:00
UpdateBatch UpdateOptions {pr, cve, nixpkgsReview, outpaths, attrpathOpt} update -> do
setupNixpkgs $ GH.untagName ghUser
2022-07-07 18:01:40 +03:00
updatePackage (Options pr True ghUser token cve nixpkgsReview outpaths attrpathOpt) update
Version -> do
2019-09-26 16:56:49 +03:00
v <- runExceptT Nix.version
case v of
Left t -> T.putStrLn ("error:" <> t)
Right t -> T.putStrLn t
UpdateVulnDB -> withVulnDB $ \_conn -> pure ()
2019-10-07 02:17:08 +03:00
CheckAllVulnerable -> do
setupNixpkgs $ GH.untagName ghUser
2019-10-07 02:17:08 +03:00
updates <- T.readFile "packages-to-update.txt"
cveAll undefined updates
2019-10-07 02:17:08 +03:00
CheckVulnerable productID oldVersion newVersion -> do
setupNixpkgs $ GH.untagName ghUser
2019-10-07 02:17:08 +03:00
report <-
cveReport
(UpdateEnv productID oldVersion newVersion Nothing (Options False False ghUser token False False False False))
2019-10-07 02:17:08 +03:00
T.putStrLn report
2019-10-13 00:37:34 +03:00
SourceGithub -> do
updates <- T.readFile "packages-to-update.txt"
setupNixpkgs $ GH.untagName ghUser
sourceGithubAll (Options False False ghUser token False False False False) updates
2020-01-20 02:13:28 +03:00
FetchRepology -> Repology.fetch