From 8a69240d88470c3f6076c8dd9130144a2e231a46 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 20 Oct 2023 19:23:21 +0200 Subject: [PATCH] Add librsync and dmd --- Rakefile | 16 ------- app/Main.hs | 83 +++++++++++++++++++++++++++++---- app/SlackBuilder/CommandLine.hs | 11 ++--- lib/up2date.rb | 58 ----------------------- slackbuilder.cabal | 2 + 5 files changed, 81 insertions(+), 89 deletions(-) delete mode 100644 lib/up2date.rb diff --git a/Rakefile b/Rakefile index 45a6821..98ef806 100644 --- a/Rakefile +++ b/Rakefile @@ -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,18 +41,3 @@ task :hhvm, [:version] do |_, arguments| update_slackbuild_version 'development/hhvm', package.version end - -AUTO_UPDATABLE = { - '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 diff --git a/app/Main.hs b/app/Main.hs index 27ae118..1ee4550 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -7,7 +7,7 @@ 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 @@ -23,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(..)) @@ -37,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 = @@ -168,12 +178,51 @@ autoUpdatable = , 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 @@ -187,8 +236,11 @@ updatePackageIfRequired package@Package{..} version = do case parse parseInfoFile packagePath infoContents of Right parsedInfoFile | version == getField @"version" parsedInfoFile -> - liftIO $ Text.IO.putStrLn - $ name <> " is up to date (Version " <> version <> ")." + 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 @@ -256,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 @@ -264,10 +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 + 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 -> diff --git a/app/SlackBuilder/CommandLine.hs b/app/SlackBuilder/CommandLine.hs index 53a6bfb..4890567 100644 --- a/app/SlackBuilder/CommandLine.hs +++ b/app/SlackBuilder/CommandLine.hs @@ -7,7 +7,6 @@ module SlackBuilder.CommandLine ) where import Data.Text (Text) -import qualified Data.Text as Text import Options.Applicative ( Parser , ParserInfo(..) @@ -21,7 +20,7 @@ import Options.Applicative ) data SlackBuilderCommand - = TextCommand TextArguments + = CategoryCommand Text | SlackBuildCommand Text Text | CommitCommand Text Text | ExistsCommand Text @@ -47,16 +46,12 @@ data TextArguments = TextArguments , textURL :: Text } -textArguments :: Parser TextArguments -textArguments = TextArguments Text.strip - <$> argument str (metavar "URL") - slackBuilderParser :: ParserInfo SlackBuilderCommand slackBuilderParser = info slackBuilderCommand fullDesc slackBuilderCommand :: Parser SlackBuilderCommand slackBuilderCommand = subparser - $ command "text" (info (TextCommand <$> textArguments) mempty) + $ command "category" (info categoryCommand mempty) <> command "slackbuild" (info slackBuildCommand mempty) <> command "commit" (info commitCommand mempty) <> command "exists" (info existsCommand mempty) @@ -66,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") diff --git a/lib/up2date.rb b/lib/up2date.rb deleted file mode 100644 index c74dc90..0000000 --- a/lib/up2date.rb +++ /dev/null @@ -1,58 +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 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 diff --git a/slackbuilder.cabal b/slackbuilder.cabal index 48c4c41..c589d0b 100644 --- a/slackbuilder.cabal +++ b/slackbuilder.cabal @@ -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,