223 lines
6.9 KiB
Bash
Executable file
223 lines
6.9 KiB
Bash
Executable file
#!@bash@/bin/bash
|
|
PATH=@bash@/bin:@nix_prefetch_scripts@/bin:@common_updater_scripts@/bin:@git@/bin:@jq@/bin:@nix@/bin:@gnugrep@/bin:@gnused@/bin:@curl@/bin:$PATH
|
|
#!/usr/bin/env bash
|
|
|
|
set -eu -o pipefail
|
|
|
|
#
|
|
# ─── HOW TO USE ─────────────────────────────────────────────────────────────────
|
|
#
|
|
|
|
function usage ( ) {
|
|
cat <<EOF
|
|
Usage: update.sh <repo_name> <attr>
|
|
EOF
|
|
}
|
|
|
|
#
|
|
# ─── POINTS YOU IN THE RIGHT DIRECTION ──────────────────────────────────────────
|
|
#
|
|
|
|
function usage_tip ( ) {
|
|
echo 'run `update.sh -h` for usage instructions' >&2
|
|
exit 1
|
|
}
|
|
|
|
#
|
|
# ─── OPTIONS: RELEASE | MASTER ────────────────────────────────────────────────────
|
|
#
|
|
|
|
while getopts ":hrm" opt; do
|
|
case $opt in
|
|
r)
|
|
release=1
|
|
master=0
|
|
;;
|
|
m)
|
|
master=1
|
|
release=0
|
|
;;
|
|
h)
|
|
usage
|
|
exit
|
|
;;
|
|
?)
|
|
echo "Invalid option: -$OPTARG" >&2
|
|
usage_tip
|
|
;;
|
|
esac
|
|
done
|
|
|
|
shift $((OPTIND-1))
|
|
|
|
#
|
|
# ─── FAIL WITH MESSAGE AND NON-ZERO EXIT STATUS ─────────────────────────────────
|
|
#
|
|
|
|
function fail ( ) {
|
|
echo "$1" >&2
|
|
exit 1
|
|
}
|
|
|
|
#
|
|
# ─── UPDATES PACKAGE TO LATEST TAGGED RELEASE ───────────────────────────────
|
|
#
|
|
|
|
function update_to_latest_release ( ) {
|
|
repo_name="$1"
|
|
attr="$2"
|
|
|
|
version=$(get_latest_tag "$repo_name")
|
|
fetch=$(fetch "$repo_name" "refs/tags/${version}")
|
|
sha256=$(get_hash "${fetch}")
|
|
|
|
update-source-version "pantheon.$attr" "$version" "$sha256"
|
|
|
|
nix_file=$(get_file_path $attr)
|
|
|
|
if [ ! -f "$nix_file" ]; then
|
|
fail "Couldn't evaluate 'pantheon.$attr.meta.position' to locate the .nix file!"
|
|
fi
|
|
|
|
correct_rev "$attr" "$nix_file" "version"
|
|
}
|
|
|
|
#
|
|
# ─── UPDATES PACKAGE TO MASTER ──────────────────────────────────────────────────
|
|
#
|
|
|
|
function update_to_master ( ) {
|
|
repo_name="$1"
|
|
attr="$2"
|
|
|
|
fetch=$(fetch "$repo_name" "refs/heads/master")
|
|
|
|
version=$(get_version "$fetch")
|
|
sha256=$(get_hash "$fetch")
|
|
proper_version=$(get_master_date "$fetch")
|
|
|
|
update-source-version "pantheon.$attr" "$proper_version" "$sha256"
|
|
|
|
nix_file=$(get_file_path $attr)
|
|
|
|
if [ ! -f "$nix_file" ]; then
|
|
fail "Couldn't evaluate 'pantheon.$attr.meta.position' to locate the .nix file!"
|
|
fi
|
|
|
|
correct_rev "$attr" "$nix_file" '"'$version'"'
|
|
}
|
|
|
|
#
|
|
# ─── GETS THE LATEST TAGGED RELEASE NAME FROM GITHUB ─────────────────────
|
|
#
|
|
|
|
function get_latest_tag ( ) {
|
|
repo_name="$1"
|
|
|
|
# Using github release api because sorting this repo just doesn't work because of old git sillyness
|
|
# Also too lazy to care to adapt `git ls-remote` command to work with it
|
|
if [ $repo_name == "switchboard-plug-pantheon-shell" ]; then
|
|
curl --silent --show-error --fail -X GET "https://api.github.com/repos/elementary/$repo_name/releases/latest" | jq -r '.tag_name'
|
|
else
|
|
git ls-remote --tags --sort="v:refname" "https://github.com/elementary/$repo_name" | tail -n1 | sed 's/.*\///; s/\^{}//'
|
|
fi
|
|
}
|
|
|
|
#
|
|
# ─── FETCHES REPO AND RETURNS RELEVANT INFORMATION ──────────────────
|
|
#
|
|
|
|
function fetch ( ) {
|
|
repo_name="$1"
|
|
version="$2"
|
|
|
|
base_url="https://github.com/elementary"
|
|
full_url="$base_url/$repo_name"
|
|
|
|
nix-prefetch-git --quiet --no-deepClone --url "$full_url" --rev "$version"
|
|
}
|
|
|
|
#
|
|
# ─── PARSES GIT REVISION FROM FETCH ─────────────────────────────────────────────
|
|
#
|
|
|
|
function get_version ( ) {
|
|
fetch_info="$1"
|
|
|
|
echo "$fetch_info" | jq -r '.rev'
|
|
}
|
|
|
|
#
|
|
# ─── PARSES HASH FROM FETCH ─────────────────────────────────────────────────────
|
|
#
|
|
|
|
function get_hash ( ) {
|
|
fetch_info="$1"
|
|
|
|
echo "$fetch_info" | jq -r '.sha256'
|
|
}
|
|
|
|
#
|
|
# ─── PARSES DATE FROM FETCH AND NORMALIZES IT TO NIXPKGS STANDARD ───────────────
|
|
#
|
|
|
|
function get_master_date ( ) {
|
|
fetch_info="$1"
|
|
|
|
full_date=$(echo "$fetch_info" | jq -r '.date')
|
|
short_date=$(date -d "$full_date" +"%Y-%m-%d")
|
|
|
|
echo "unstable-$short_date"
|
|
}
|
|
|
|
#
|
|
# ─── RETURN NIX EXPRESSION PATH ─────────────────────────────────────────────────
|
|
#
|
|
|
|
function get_file_path () {
|
|
attr="$1"
|
|
|
|
nix-instantiate --eval --strict -A "pantheon.$attr.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/'
|
|
}
|
|
|
|
#
|
|
# ─── CORRECTS REV VERSION ───────────────────────────────────────────────────────────
|
|
#
|
|
|
|
function correct_rev ( ) {
|
|
attr="$1"
|
|
nix_file="$2"
|
|
rev="$3"
|
|
|
|
check_pattern1='^\s*rev\s*=\s*"[0-9a-f]{5,40}"'
|
|
check_pattern2='^\s*rev\s*=\s*version'
|
|
|
|
replace_pattern1='/\brev\b\s*=/ s|\"[0-9a-f]{5,40}\"|'$rev'|'
|
|
replace_pattern2='/\brev\b\s*=/ s|version|'$rev'|'
|
|
|
|
if [ $(grep -c -P "$check_pattern1" "$nix_file") = 1 ]; then
|
|
pattern="$replace_pattern1"
|
|
elif [ $(grep -c -P "$check_pattern2" "$nix_file") = 1 ]; then
|
|
pattern="$replace_pattern2"
|
|
else
|
|
fail "Couldn't figure out where out where to patch in the correct version in pantheon.$attr!"
|
|
fi
|
|
|
|
sed -i.bak "$nix_file" -re "$pattern"
|
|
rm -f "$nix_file.bak"
|
|
}
|
|
|
|
|
|
#
|
|
# ─── WHETHER TO UPDATE TO RELEASE OR MASTER ──────────────────────────────────
|
|
#
|
|
|
|
if [ $release = 1 ]; then
|
|
update_to_latest_release $1 $2
|
|
elif [ $master = 1 ]; then
|
|
update_to_master $1 $2
|
|
else
|
|
exit 1
|
|
fi
|
|
|
|
# ────────────────────────────────────────────────────────────────────────────────
|