Compare commits

..

3 Commits

Author SHA1 Message Date
8a69240d88 Add librsync and dmd 2023-10-20 19:23:21 +02:00
3a6d17952b Allow looking on the text page for the latest version 2023-10-20 15:53:48 +02:00
4105ffa91f rdiff-backup: Migrated 2023-10-13 19:34:02 +02:00
6 changed files with 131 additions and 171 deletions

View File

@ -10,7 +10,6 @@ require 'open3'
require_relative 'config/config'
require_relative 'lib/package'
require_relative 'lib/download'
require_relative 'lib/up2date'
task :dmd, [:version] do |_, arguments|
raise 'Version is not specified.' unless arguments.key? :version
@ -42,59 +41,3 @@ task :hhvm, [:version] do |_, arguments|
update_slackbuild_version 'development/hhvm', package.version
end
task :webex do
tarball = 'slackbuilds/network/webex/Webex.deb'
uri = 'https://binaries.webex.com/WebexDesktop-Ubuntu-Official-Package/Webex.deb'
checksum = SlackBuilder.download URI(uri), tarball
last_stdout, = Open3.pipeline_r ['ar', 'p', tarball, 'control.tar.gz'], ['tar', 'zxO', './control']
version = last_stdout.read.lines
.find { |line| line.start_with? 'Version: ' }
.split.last
package = Package.new 'network/webex',
version: version,
homepage: 'https://www.webex.com'
write_info package,
downloads: [Download.new(uri, checksum, is64: true)]
update_slackbuild_version 'network/webex', package.version
commit 'network/webex', package.version
end
task 'rdiff-backup', [:version] do |_, arguments|
raise 'Version is not specified.' unless arguments.key? :version
package = Package.new 'system/rdiff-backup',
version: arguments[:version],
homepage: 'https://rdiff-backup.net/',
requires: ['librsync']
uri = "https://github.com/rdiff-backup/rdiff-backup/releases/download/v#{arguments[:version]}/rdiff-backup-#{arguments[:version]}.tar.gz"
tarball = "system/rdiff-backup/rdiff-backup-#{arguments[:version]}.tar.gz"
checksum = SlackBuilder.download_and_deploy URI(uri), tarball
download = "https://download.dlackware.com/hosted-sources/rdiff-backup/rdiff-backup-#{arguments[:version]}.tar.gz"
write_info package, downloads: [Download.new(download, checksum)]
update_slackbuild_version 'system/rdiff-backup', arguments[:version]
commit 'system/rdiff-backup', arguments[:version]
end
AUTO_UPDATABLE = {
'rdiff-backup' => [SlackBuilder::GitHub.new('rdiff-backup', 'rdiff-backup', 'rdiff-backup')],
'dmd' => [SlackBuilder::LatestText.new('https://downloads.dlang.org/releases/LATEST')]
}.freeze
task :up2date do
AUTO_UPDATABLE.each do |key, value|
repository, updater = value
latest_version = SlackBuilder.check_for_latest key, repository
next if latest_version.nil? || updater.nil?
puts "Would like to update #{key} to #{latest_version} (y/N)? "
updater.update latest_version if $stdin.gets.chomp.downcase.start_with? 'y'
end
end

View File

@ -2,10 +2,12 @@ module Main
( main
) where
import Data.Char (isNumber)
import Control.Applicative (Applicative(liftA2))
import Data.List.NonEmpty (NonEmpty(..))
import qualified Data.List.NonEmpty as NonEmpty
import Control.Monad.IO.Class (MonadIO(..))
import Data.Maybe (fromJust, fromMaybe)
import Data.Maybe (fromJust)
import Options.Applicative (execParser)
import SlackBuilder.CommandLine
import SlackBuilder.Config
@ -21,9 +23,9 @@ import SlackBuilder.Download
import SlackBuilder.Package (Package(..))
import qualified SlackBuilder.Package as Package
import Text.URI (mkURI)
import Data.Foldable (for_)
import Data.Foldable (for_, find)
import qualified Text.URI as URI
import System.FilePath ((</>), (<.>), dropExtension, takeBaseName)
import System.FilePath ((</>), (<.>), dropExtension, takeBaseName, makeRelative, splitFileName)
import SlackBuilder.Info
import Text.Megaparsec (parse, errorBundlePretty)
import GHC.Records (HasField(..))
@ -35,6 +37,16 @@ import System.Process
, withCreateProcess
, waitForProcess
)
import System.Console.ANSI
( setSGR
, SGR(..)
, ColorIntensity(..)
, Color(..)
, ConsoleLayer(..)
)
import System.Directory (listDirectory, doesDirectoryExist)
import Control.Monad (filterM)
import Data.List (isPrefixOf, isSuffixOf)
autoUpdatable :: [Package]
autoUpdatable =
@ -93,7 +105,8 @@ autoUpdatable =
, transform = Nothing
}
checkVersion x
| Text.isPrefixOf "php-8.2." x = Text.stripPrefix "php-" x
| not $ Text.isInfixOf "RC" x
, Text.isPrefixOf "php-8.2." x = Text.stripPrefix "php-" x
| otherwise = Nothing
latest' = latestGitHub ghArguments checkVersion
template = Package.DownloadTemplate
@ -127,12 +140,89 @@ autoUpdatable =
, name = "kitty"
, reupload = Just [RawCommand "go" ["mod", "vendor"]]
}
, Package
{ latest =
let ghArguments = GhArguments
{ owner = "rdiff-backup"
, name = "rdiff-backup"
, transform = Nothing
}
latest' = latestGitHub ghArguments $ Text.stripPrefix "v"
template = Package.DownloadTemplate
$ Package.StaticPlaceholder "https://github.com/rdiff-backup/rdiff-backup/releases/download/v"
:| Package.VersionPlaceholder
: Package.StaticPlaceholder "/rdiff-backup-"
: Package.VersionPlaceholder
: [Package.StaticPlaceholder ".tar.gz"]
in Package.Updater latest' template
, category = "system"
, name = "rdiff-backup"
, reupload = Just mempty
}
, Package
{ latest =
let needle = "Linux—"
textArguments = TextArguments
{ textURL = "https://help.webex.com/en-us/article/mqkve8/Webex-App-%7C-Release-notes"
, versionPicker = Text.takeWhile (liftA2 (||) (== '.') isNumber)
. Text.drop (Text.length needle)
. snd
. Text.breakOn needle
}
latest' = latestText textArguments
template = Package.DownloadTemplate $ pure
$ Package.StaticPlaceholder
"https://binaries.webex.com/WebexDesktop-Ubuntu-Official-Package/Webex.deb"
in Package.Updater latest' template
, category = "network"
, name = "webex"
, reupload = Nothing
}
, Package
{ latest =
let ghArguments = GhArguments
{ owner = "librsync"
, name = "librsync"
, transform = Nothing
}
latest' = latestGitHub ghArguments $ Text.stripPrefix "v"
template = Package.DownloadTemplate
$ Package.StaticPlaceholder "https://github.com/librsync/librsync/archive/v"
:| Package.VersionPlaceholder
: Package.StaticPlaceholder "/librsync-"
: Package.VersionPlaceholder
: [Package.StaticPlaceholder ".tar.gz"]
in Package.Updater latest' template
, category = "libraries"
, name = "librsync"
, reupload = Just mempty
}
, Package
{ latest =
let textArguments = TextArguments
{ textURL = "https://downloads.dlang.org/releases/LATEST"
, versionPicker = Text.strip
}
latest' = latestText textArguments
template = Package.DownloadTemplate
$ Package.StaticPlaceholder "https://downloads.dlang.org/releases/2.x/"
:| Package.VersionPlaceholder
: Package.StaticPlaceholder "/dmd."
: Package.VersionPlaceholder
: [Package.StaticPlaceholder ".linux.tar.xz"]
in Package.Updater latest' template
, category = "development"
, name = "dmd"
, reupload = Nothing
}
]
up2Date :: SlackBuilderT ()
up2Date = for_ autoUpdatable go
where
go package = getAndLogLatest package >>= mapM_ (updatePackageIfRequired package)
go package = getAndLogLatest package
>>= mapM_ (updatePackageIfRequired package)
>> liftIO (putStrLn "")
getAndLogLatest Package{ latest = Package.Updater getLatest _, name }
= liftIO (putStrLn $ Text.unpack name <> ": Retreiving the latest version.")
>> getLatest
@ -146,8 +236,11 @@ updatePackageIfRequired package@Package{..} version = do
case parse parseInfoFile packagePath infoContents of
Right parsedInfoFile
| version == getField @"version" parsedInfoFile ->
liftIO $ Text.IO.putStrLn
liftIO $ do
setSGR [SetColor Foreground Dull Green]
Text.IO.putStrLn
$ name <> " is up to date (Version " <> version <> ")."
setSGR [Reset]
| otherwise -> updatePackage package parsedInfoFile version
Left errorBundle -> liftIO $ putStr $ errorBundlePretty errorBundle
@ -215,6 +308,17 @@ updatePackage Package{..} info version = do
, child_group = Nothing
}
findCategory :: FilePath -> IO [FilePath]
findCategory currentDirectory = do
contents <- liftIO $ listDirectory currentDirectory
case find (isSuffixOf ".info") contents of
Just _ -> pure [currentDirectory]
Nothing -> do
let contents' = (currentDirectory </>) <$> filter (not . isPrefixOf ".") contents
directories <- filterM doesDirectoryExist contents'
subCategories <- traverse findCategory directories
pure $ concat subCategories
main :: IO ()
main = do
programCommand <- execParser slackBuilderParser
@ -223,12 +327,14 @@ main = do
$ runSlackBuilderT
$ executeCommand programCommand
Text.IO.putStrLn $ fromMaybe "" latestVersion
maybe (pure ()) Text.IO.putStrLn latestVersion
where
executeCommand = \case
TextCommand textArguments -> latestText textArguments
GhCommand ghArguments@GhArguments{ transform }
-> latestGitHub ghArguments $ chooseTransformFunction transform
CategoryCommand _packageName -> do
repository' <- SlackBuilderT $ asks repository
categories <- liftIO $ findCategory repository'
liftIO $ print $ splitFileName . makeRelative repository' <$> categories
pure Nothing
SlackBuildCommand packagePath version ->
updateSlackBuildVersion packagePath version >> pure Nothing
CommitCommand packagePath version ->
@ -246,13 +352,3 @@ main = do
DownloadAndDeployCommand uri' tarball -> fmap (Text.pack . show)
<$> downloadAndDeploy uri' tarball
Up2DateCommand -> up2Date >> pure Nothing
chooseTransformFunction (Just "php") = phpTransform
chooseTransformFunction (Just "rdiff-backup") = Text.stripPrefix "v"
chooseTransformFunction _ = stripPrefix "v"
stripPrefix prefix string = Just
$ fromMaybe string
$ Text.stripPrefix prefix string
phpTransform version
| (majorPrefix, _patchVersion) <- Text.breakOnEnd "." version
, majorPrefix == "php-8.2." = Just $ Text.drop (Text.length "php-") version
| otherwise = Nothing

View File

@ -16,12 +16,11 @@ import Options.Applicative
, info
, fullDesc
, subparser
, command, optional
, command,
)
data SlackBuilderCommand
= TextCommand TextArguments
| GhCommand GhArguments
= CategoryCommand Text
| SlackBuildCommand Text Text
| CommitCommand Text Text
| ExistsCommand Text
@ -30,7 +29,6 @@ data SlackBuilderCommand
| CloneCommand Text Text Text
| DownloadAndDeployCommand Text Text
| Up2DateCommand
deriving (Eq, Show)
data PackagistArguments = PackagistArguments
{ vendor :: Text
@ -43,25 +41,17 @@ data GhArguments = GhArguments
, transform :: Maybe Text
} deriving (Eq, Show)
newtype TextArguments = TextArguments Text
deriving (Eq, Show)
textArguments :: Parser TextArguments
textArguments = TextArguments <$> argument str (metavar "URL")
ghArguments :: Parser GhArguments
ghArguments = GhArguments
<$> argument str (metavar "OWNER")
<*> argument str (metavar "NAME")
<*> optional (argument str (metavar "TRANSFORM"))
data TextArguments = TextArguments
{ versionPicker :: Text -> Text
, textURL :: Text
}
slackBuilderParser :: ParserInfo SlackBuilderCommand
slackBuilderParser = info slackBuilderCommand fullDesc
slackBuilderCommand :: Parser SlackBuilderCommand
slackBuilderCommand = subparser
$ command "text" (info (TextCommand <$> textArguments) mempty)
<> command "github" (info (GhCommand <$> ghArguments) mempty)
$ command "category" (info categoryCommand mempty)
<> command "slackbuild" (info slackBuildCommand mempty)
<> command "commit" (info commitCommand mempty)
<> command "exists" (info existsCommand mempty)
@ -71,6 +61,8 @@ slackBuilderCommand = subparser
<> command "deploy" (info deployCommand mempty)
<> command "up2date" (info up2DateCommand mempty)
where
categoryCommand = CategoryCommand
<$> argument str (metavar "PKGNAM")
slackBuildCommand = SlackBuildCommand
<$> argument str (metavar "PATH")
<*> argument str (metavar "VERSION")

View File

@ -107,11 +107,11 @@ latestPackagist PackagistArguments{..} = do
>>= fmap (version . fst) . Vector.uncons
latestText :: TextArguments -> SlackBuilderT (Maybe Text)
latestText (TextArguments textArguments) = do
uri <- liftIO $ useHttpsURI <$> mkURI textArguments
latestText TextArguments{..} = do
uri <- liftIO $ useHttpsURI <$> mkURI textURL
packagistResponse <- traverse (runReq defaultHttpConfig . go . fst) uri
pure $ Text.strip . Text.Encoding.decodeASCII . responseBody
pure $ versionPicker . Text.Encoding.decodeUtf8 . responseBody
<$> packagistResponse
where
go uri = req GET uri NoReqBody bsResponse mempty

View File

@ -1,73 +0,0 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
# frozen_string_literal: true
require 'net/http'
require 'json'
require_relative '../config/config'
require 'term/ansicolor'
module SlackBuilder
extend Term::ANSIColor
# Remote repository for a single package.
class Repository
# Request the latest tag in the given repository.
def latest
raise NotImplementedError
end
end
# Reads the list fo tags from the GitHub API.
class GitHub < Repository
def initialize(owner, name, version_transform = nil)
super()
@owner = owner
@name = name
@version_transform = version_transform
end
def latest
`./bin/slackbuilder github #{@owner} #{@name} #{@version_transform}`.strip
end
end
# Reads a remote LATEST file.
class LatestText < Repository
def initialize(latest_url)
super()
@latest_url = latest_url
end
def latest
`./bin/slackbuilder text #{@latest_url}`.strip
end
end
module_function
# Checks if there is a new version for the package and returns the latest
# version if an update is available, otherwise returns nil.
def check_for_latest(package_name, repository)
package = find_package_info package_name
latest_version = repository.latest
if package.version == latest_version
puts green "#{package_name} is up to date (Version #{package.version})."
nil
else
puts red "#{package_name}: Current version is #{package.version}, #{latest_version} is available."
latest_version
end
end
private_class_method def find_package_info(package_name)
package_path = Pathname.new Dir.glob("#{CONFIG[:repository]}/*/#{package_name}").first
package_category = package_path.dirname.basename.to_s
Package.parse("#{package_category}/#{package_name}", File.read("#{package_path}/#{package_name}.info"))
end
end

View File

@ -20,6 +20,7 @@ common dependencies
base ^>= 4.16.4.0,
bytestring ^>= 0.11.0,
cryptonite >= 0.30,
directory ^>= 1.3.8,
filepath ^>= 1.4.2,
megaparsec ^>= 9.5,
modern-uri ^>= 0.3.6,
@ -67,6 +68,7 @@ executable slackbuilder
SlackBuilder.Updater
build-depends:
aeson ^>= 2.2.0,
ansi-terminal ^>= 1.0,
conduit ^>= 1.3.5,
http-client ^>= 0.7,
optparse-applicative ^>= 0.18.1,