From 9da6cfdb430f08ad9296dfb77a19f495d97eac92 Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Tue, 3 Apr 2018 23:31:28 +0200 Subject: [PATCH] port fix-src-url.sh --- fix-src-url.sh | 50 ----------------------------------------------- src/Clean.hs | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/Update.hs | 3 +-- 3 files changed, 54 insertions(+), 52 deletions(-) delete mode 100755 fix-src-url.sh create mode 100644 src/Clean.hs diff --git a/fix-src-url.sh b/fix-src-url.sh deleted file mode 100755 index 11b1e7b..0000000 --- a/fix-src-url.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash -set -euxo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -GITHUB_TOKEN="$(cat "$SCRIPT_DIR"/github_token.txt)" -export GITHUB_TOKEN - -# shellcheck source=setup-nixpkgs.sh -source "$SCRIPT_DIR/setup-nixpkgs.sh" - -PACKAGE_NAME=$1 -OLD_VERSION=$2 -NEW_VERSION=$3 -DERIVATION_FILE=$4 -ATTR_PATH=$5 -OLD_SRC_URL=$6 - -OLD_DERIVATION_NAME=$(nix eval -f ~/p/nixpkgs --raw "pkgs.$ATTR_PATH.name") -NEW_DERIVATION_NAME=$(sed "s|$OLD_VERSION|$NEW_VERSION|" <<< "$OLD_DERIVATION_NAME") -NAME=$(nix eval --raw "(let pkgs = import ./. {}; in (builtins.parseDrvName pkgs.$ATTR_PATH.name).name)") - -if grep -q "name = \"$NEW_DERIVATION_NAME\"" "$DERIVATION_FILE" -then - # Separate name and version - sed -i "s|$NEW_DERIVATION_NAME|$NAME-\${version}|" "$DERIVATION_FILE" - grep -q "name = \"$NAME-\${version}\"" "$DERIVATION_FILE" - # shellcheck disable=SC2016 - sed -i 's|^\([ ]*\)\(name = "'"$NAME"'-\${version}";\)|\1\2\n\1version = "'"$NEW_VERSION"'";|' "$DERIVATION_FILE" - grep -q "version = \"$NEW_VERSION\";" "$DERIVATION_FILE" -fi - -ESCAPED_NEW_VERSION="${NEW_VERSION//\./\\.}" -DOWNLOADS=$(curl "https://repology.org/api/v1/metapackage/$PACKAGE_NAME" | jq '.[].downloads | select(values) | .[] ') -FILTERED_DOWNLOADS=$(echo "$DOWNLOADS" | grep "$ESCAPED_NEW_VERSION" | grep -vE "${ESCAPED_NEW_VERSION}[^/]+\\.tar" | grep -vE "${ESCAPED_NEW_VERSION}[^/]+\\.zip" | sed 's|"||g') - -for d in $FILTERED_DOWNLOADS -do - OLD_URL="$OLD_SRC_URL" - OLD_URL=$(sed "s|$OLD_DERIVATION_NAME|\${name}|g" <<< "$OLD_URL") - OLD_URL=$(sed "s|$OLD_VERSION|\${version}|g" <<< "$OLD_URL") - - NEW_URL=$(sed "s|$NEW_DERIVATION_NAME|\${name}|g" <<< "$d" | sed "s|$NEW_VERSION|\${version}|g") - sed -i "s|$OLD_URL|$NEW_URL|" "$DERIVATION_FILE" - grep -q 'url = "'"$NEW_URL"'";' "$DERIVATION_FILE" || continue - - nix-prefetch-url -A "$ATTR_PATH.src" && exit 0 -done - -exit 1 diff --git a/src/Clean.hs b/src/Clean.hs new file mode 100644 index 0000000..2a74ae8 --- /dev/null +++ b/src/Clean.hs @@ -0,0 +1,53 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ExtendedDefaultRules #-} +{-# OPTIONS_GHC -fno-warn-type-defaults #-} + +module Clean (fixSrcUrl) where + +import Control.Applicative ((<|>), some) +import Data.Function ((&)) +import qualified Data.Text as T +import Control.Monad (forM_) +import Data.Maybe (isNothing) +import Data.Text (Text) +import Utils (Version, succeded, setupNixpkgs) +import Data.Semigroup ((<>)) +import Shelly +import qualified Text.Regex.Applicative as RE +import Text.Regex.Applicative (RE, (=~)) + +default (T.Text) + +-- | Construct regex: ${version}[^/]+\.(tar|zip) +archiveRegex :: Version -> RE Char () +archiveRegex version = (\_ _ _ _ -> ()) <$> RE.string (T.unpack version) <*> some (RE.psym (/= '/')) <*> RE.sym '.' <*> (RE.string "tar" <|> RE.string "zip") + + +fixSrcUrl :: Text -> Version -> Version -> Text -> Text -> Text -> Sh Text +fixSrcUrl packageName oldVersion newVersion derivationFile attrPath oldSrcUrl = do + nixpkgsPath <- setupNixpkgs + + oldDerivationName <- cmd "nix" "eval" "-f" nixpkgsPath "--raw" ("pkgs." <> attrPath <> ".name") + let newDerivationName = T.replace oldVersion newVersion oldDerivationName + name <- cmd "nix" "eval" "--raw" ("(let pkgs = import ./. {}; in (builtins.parseDrvName pkgs." <> attrPath <> ".name).name)") + + whenM (succeded $ cmd "grep" "-q" ("name = \"" <> newDerivationName <> "\"") derivationFile) $ do + -- Separate name and version + cmd "sed" "-i" ("s|" <> newDerivationName <> "|" <> name <> "-${version}|") derivationFile + cmd "grep" "-q" ("name = \"" <> name <> "-${version}\"") derivationFile + cmd "sed" "-i" ("s|^\\([ ]*\\)\\(name = \"" <> name <> "-${version}\";\\)|\\1\\2\n\\1version = \"" <> newVersion <> "\";|") derivationFile + cmd "grep" "-q" ("version = \"" <> newVersion <> "\";") derivationFile + + downloads <- cmd "curl" ("https://repology.org/api/v1/metapackage/" <> packageName) -|- cmd "jq" ".[].downloads | select(values) | .[]" + let filteredDownloads = downloads & T.lines & filter (\url -> newVersion `T.isInfixOf` url && isNothing (T.unpack url =~ archiveRegex newVersion)) & map (T.replace "\"" "") + + forM_ filteredDownloads $ \downloadUrl -> do + let oldUrl = T.replace oldVersion "${version}" (T.replace oldDerivationName "${name}" oldSrcUrl) + let newUrl = T.replace newVersion "${version}" (T.replace newDerivationName "${name}" downloadUrl) + cmd "sed" "-i" ("s|" <> oldUrl <> "|" <> newUrl <> "|") derivationFile + cmd "grep" "-q" ("url = \"" <> newUrl <> "\";") derivationFile + + whenM (succeded $ cmd "grep" "-q" ("url = \"" <> newUrl <> "\";") derivationFile) $ do + whenM (succeded $ cmd "nix-prefetch-url" "-A" (attrPath <> ".src")) (exit 0) + + exit 1 diff --git a/src/Update.hs b/src/Update.hs index c20a76f..023bec7 100644 --- a/src/Update.hs +++ b/src/Update.hs @@ -9,6 +9,7 @@ import qualified Data.Text as T import Data.Text (Text) import Data.Maybe (fromMaybe) import Shelly +import Clean (fixSrcUrl) import Check (checkResult) import Utils (Version, Options(..), ExitCode(..), canFail, orElse, setupNixpkgs, tRead, checkAttrPathVersion) import Data.Semigroup ((<>)) @@ -53,8 +54,6 @@ isOnBlackList _ _ = return "" rawEval :: Text -> Sh Text rawEval expr = cmd "nix" "eval" "-f" "." "--raw" expr -fixSrcUrl :: Text -> Version -> Version -> Text -> Text -> Text -> Sh Text -fixSrcUrl packageName oldVersion newVersion derivationFile attrPath oldSrcUrl = cmd "./fix-src-url.sh" packageName oldVersion newVersion derivationFile attrPath oldSrcUrl push :: Text -> Options -> Sh () push branchName options =