#!@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 } # # ─── 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 # ────────────────────────────────────────────────────────────────────────────────