2019-01-29 01:33:21 +01:00
#!/usr/bin/env bash
2019-05-12 21:10:11 +02:00
# shellcheck disable=SC2034
2019-01-29 01:33:21 +01:00
# for mod in $(nix eval --raw '(
# with import <nixpkgs> { };
# with lib;
# let mods = attrNames (removeAttrs openraPackages.mods [ "recurseForDerivations" ]);
# in concatStringsSep " " mods
# )'); do
# ./mod-update.sh "$mod"
# done
2019-05-12 21:10:11 +02:00
# Uses: https://github.com/msteen/nix-upfetch
2019-01-29 01:33:21 +01:00
mod = $1
commit_count = $2
token =
nixpkgs = '<nixpkgs>'
die( ) {
2019-05-12 21:10:11 +02:00
local ret = $?
2019-01-29 01:33:21 +01:00
echo " $* " >& 2
exit $ret
}
curl( ) {
command curl --silent --show-error " $@ "
}
get_sha1( ) {
local owner = $1 repo = $2 ref = $3
# https://developer.github.com/v3/#authentication
curl -H " Authorization: token $token " -H 'Accept: application/vnd.github.VERSION.sha' " https://api.github.com/repos/ $owner / $repo /commits/ $ref "
}
2019-05-12 21:10:11 +02:00
[ [ -n $mod ] ] || die "The first argument of this script has to be a mod identifier."
2019-01-29 01:33:21 +01:00
[ [ -n $token ] ] || die " Please edit this script to include a GitHub API access token, which is required for API v4:
https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/"
# Get current mod_owner and mod_repo.
2019-05-12 21:10:11 +02:00
vars = $( nix-prefetch --file " $nixpkgs " " openraPackages.mods. $mod " --index 0 --quiet --output json --no-compute-hash > >(
2019-01-29 01:33:21 +01:00
jq --raw-output 'with_entries(select(.value | contains("\n") | not)) | to_entries | .[] | .key + "=" + .value' ) ) || exit
2019-05-12 21:10:11 +02:00
mod_owner = ; mod_repo = ; mod_rev =
2019-01-29 01:33:21 +01:00
while IFS = '=' read -r key val; do
declare " mod_ ${ key } = ${ val } "
done <<< " $vars "
if [ [ -n $commit_count ] ] ; then
query_on_commit = ' {
history( first: 10) {
nodes {
abbreviatedOid
oid
}
totalCount
}
} '
else
query_on_commit = ' {
history( first: 0) {
totalCount
}
abbreviatedOid
oid
} '
fi
2019-05-12 21:10:11 +02:00
# shellcheck disable=SC2089
query = ' {
repository( owner: " ' $mod_owner ' " , name: " ' $mod_repo ' " ) {
2019-01-29 01:33:21 +01:00
defaultBranchRef {
target {
2019-05-12 21:10:11 +02:00
... on Commit '$query_on_commit'
2019-01-29 01:33:21 +01:00
}
}
licenseInfo {
key
}
}
} '
# Newlines are not allowed in a query.
# https://developer.github.com/v4/guides/forming-calls/#communicating-with-graphql
2019-05-12 21:10:11 +02:00
# shellcheck disable=SC2086 disable=SC2090 disable=SC2116
2019-01-29 01:33:21 +01:00
query = $( echo $query )
2019-05-12 21:10:11 +02:00
query = ${ query // \" / \\ \" }
2019-01-29 01:33:21 +01:00
# https://developer.github.com/v4/guides/using-the-explorer/#configuring-graphiql
json = $( curl -H " Authorization: bearer $token " -X POST -d '{ "query": "' " $query " '" }' https://api.github.com/graphql) || exit
if [ [ -n $commit_count ] ] ; then
json = $( jq " $commit_count " ' as $commit_count
| .data.repository.defaultBranchRef.target
| = ( .history | = ( . | del( .nodes) | .totalCount = $commit_count ) )
+ ( .history | .nodes[ .totalCount - $commit_count ] ) ' <<< " $json " ) || exit
fi
vars = $( jq --raw-output ' .data.repository | {
license_key: .licenseInfo.key,
} + ( .defaultBranchRef.target | {
version: ( ( .history.totalCount | tostring) + ".git." + .abbreviatedOid) ,
rev: .oid,
} ) | to_entries | .[ ] | .key + "=" + ( .value | tostring) ' <<< " $json " ) || exit
2019-05-12 21:10:11 +02:00
mod_license_key = ; mod_version = ; mod_rev =
2019-01-29 01:33:21 +01:00
while IFS = '=' read -r key val; do
declare " mod_ ${ key } = ${ val } "
done <<< " $vars "
mod_config = $( curl " https://raw.githubusercontent.com/ $mod_owner / $mod_repo / $mod_rev /mod.config " ) || exit
2019-05-12 21:10:11 +02:00
mod_id = ; engine_version = ; automatic_engine_management = ; automatic_engine_source =
2019-01-29 01:33:21 +01:00
while IFS = '=' read -r key val; do
declare " ${ key ,, } = $( jq --raw-output . <<< " $val " ) "
done < <( grep '^\(MOD_ID\|ENGINE_VERSION\|AUTOMATIC_ENGINE_MANAGEMENT\|AUTOMATIC_ENGINE_SOURCE\)=' <<< " $mod_config " )
for var in mod_id engine_version automatic_engine_management automatic_engine_source; do
echo " $var = ${ !var } " >& 2
done
echo >& 2
[ [ $mod_id = = " $mod " ] ] ||
die " The mod ' $mod ' reports being mod ' $mod_id ' instead. "
2019-05-12 21:10:11 +02:00
# shellcheck disable=SC2005 disable=SC2046
2019-01-29 01:33:21 +01:00
[ [ $mod_license_key = = gpl-3.0 ] ] ||
[ [ $( echo $( head -2 <( curl " https://raw.githubusercontent.com/ $mod_owner / $mod_repo / $mod_rev /COPYING " ) ) ) = = 'GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007' ] ] ||
die " The mod ' $mod ' is licensed under ' $mod_license_key ' while expecting 'gpl-3.0'. "
[ [ $automatic_engine_management = = True ] ] ||
die " The mod ' $mod ' engine is not managed as a read-only dependency. "
[ [ $automatic_engine_source = ~ https://github.com/( [ a-zA-Z0-9_\- ] +) /( [ a-zA-Z0-9_\- ] +) /archive/( [ a-zA-Z0-9_\- \$ \{ \} ] +) .zip ] ] ||
die " The mod ' $mod ' engine is not hosted on GitHub as an archive. "
engine_owner = ${ BASH_REMATCH [1] }
engine_repo = ${ BASH_REMATCH [2] }
2019-05-12 21:10:11 +02:00
# shellcheck disable=SC2016
2019-01-29 01:33:21 +01:00
[ [ ${ BASH_REMATCH [3] } = = '${ENGINE_VERSION}' ] ] || engine_version = ${ BASH_REMATCH [3] }
engine_rev = $( get_sha1 " $engine_owner " " $engine_repo " " $engine_version " )
for type in mod engine; do
for name in version owner repo rev; do
var = " ${ type } _ ${ name } "
echo " $var = ${ !var } " >& 2
done
echo >& 2
done
i = 0
for type in mod engine; do
fetcher_args = ( )
for name in owner repo rev; do
var = " ${ type } _ ${ name } "
fetcher_args += ( " -- $name " " ${ !var } " )
done
var = " ${ type } _version "
version = ${ !var }
2019-05-12 21:10:11 +02:00
nix-upfetch --yes --version " $version " " $( nix-preupfetch --file " $nixpkgs " " openraPackages.mods. $mod " --index $i -- " ${ fetcher_args [@] } " ) "
2019-01-29 01:33:21 +01:00
( ( i++ ) )
done