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.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 =