port fix-src-url.sh

This commit is contained in:
Jan Tojnar 2018-04-03 23:31:28 +02:00
parent e819684d1d
commit 9da6cfdb43
No known key found for this signature in database
GPG Key ID: 7FAB2A15F7A607A4
3 changed files with 54 additions and 52 deletions

View File

@ -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

53
src/Clean.hs Normal file
View File

@ -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

View File

@ -9,6 +9,7 @@ import qualified Data.Text as T
import Data.Text (Text) import Data.Text (Text)
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Shelly import Shelly
import Clean (fixSrcUrl)
import Check (checkResult) import Check (checkResult)
import Utils (Version, Options(..), ExitCode(..), canFail, orElse, setupNixpkgs, tRead, checkAttrPathVersion) import Utils (Version, Options(..), ExitCode(..), canFail, orElse, setupNixpkgs, tRead, checkAttrPathVersion)
import Data.Semigroup ((<>)) import Data.Semigroup ((<>))
@ -53,8 +54,6 @@ isOnBlackList _ _ = return ""
rawEval :: Text -> Sh Text rawEval :: Text -> Sh Text
rawEval expr = cmd "nix" "eval" "-f" "." "--raw" expr 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 :: Text -> Options -> Sh ()
push branchName options = push branchName options =