#!/usr/bin/env bash set -o pipefail GNOME_FTP=ftp.gnome.org/pub/GNOME/sources # projects that don't follow the GNOME major versioning, or that we don't want to # programmatically update NO_GNOME_MAJOR="ghex gtkhtml gdm gucharmap" usage() { echo "Usage: $0 || [major.minor]" >&2 exit 0 } if [ "$#" -lt 1 ]; then usage fi GNOME_TOP=pkgs/desktops/gnome-3 action=$1 # curl -l ftp://... doesn't work from my office in HSE, and I don't want to have # any conversations with sysadmin. Somehow lftp works. if [ "$FTP_CLIENT" = "lftp" ]; then ls_ftp() { lftp -c "open $1; cls" } else ls_ftp() { curl -s -l "$1"/ } fi find_project() { exec find "$GNOME_TOP" -mindepth 2 -maxdepth 2 -type d "$@" } show_project() { local project=$1 local majorVersion=$2 local version= if [ -z "$majorVersion" ]; then echo "Looking for available versions..." >&2 local available_baseversions=$(ls_ftp ftp://${GNOME_FTP}/${project} | grep '[0-9]\.[0-9]' | sort -t. -k1,1n -k 2,2n) if [ "$?" -ne 0 ]; then echo "Project $project not found" >&2 return 1 fi echo -e "The following versions are available:\n ${available_baseversions[@]}" >&2 echo -en "Choose one of them: " >&2 read majorVersion fi if echo "$majorVersion" | grep -q "[0-9]\+\.[0-9]\+\.[0-9]\+"; then # not a major version version=$majorVersion majorVersion=$(echo "$majorVersion" | cut -d '.' -f 1,2) fi local FTPDIR=${GNOME_FTP}/${project}/${majorVersion} #version=`curl -l ${FTPDIR}/ 2>/dev/null | grep LATEST-IS | sed -e s/LATEST-IS-//` # gnome's LATEST-IS is broken. Do not trust it. if [ -z "$version" ]; then local files=$(ls_ftp "${FTPDIR}") declare -A versions for f in $files; do case $f in (LATEST-IS-*|*.news|*.changes|*.sha256sum|*.diff*): ;; ($project-*.*.9*.tar.*): tmp=${f#$project-} tmp=${tmp%.tar*} echo "Ignored unstable version ${tmp}" >&2 ;; ($project-*.tar.*): tmp=${f#$project-} tmp=${tmp%.tar*} versions[${tmp}]=1 ;; (*): echo "UNKNOWN FILE $f" >&2 ;; esac done echo "Found versions ${!versions[@]}" >&2 version=$(echo ${!versions[@]} | sed -e 's/ /\n/g' | sort -t. -k1,1n -k 2,2n -k 3,3n | tail -n1) if [ -z "$version" ]; then echo "No version available for major $majorVersion" >&2 return 1 fi echo "Latest version is: ${version}" >&2 fi local name=${project}-${version} echo "Fetching .sha256 file" >&2 local sha256out=$(curl -s -f http://"${FTPDIR}"/"${name}".sha256sum) if [ "$?" -ne "0" ]; then echo "Version not found" >&2 return 1 fi extensions=( "xz" "bz2" "gz" ) echo "Choosing archive extension (known are ${extensions[@]})..." >&2 for ext in ${extensions[@]}; do if echo -e "$sha256out" | grep -q "\\.tar\\.${ext}$"; then ext_pref=$ext sha256=$(echo -e "$sha256out" | grep "\\.tar\\.${ext}$" | cut -f1 -d\ ) break fi done echo "Chosen ${ext_pref}, hash is ${sha256}" >&2 echo "# Autogenerated by maintainers/scripts/gnome.sh update fetchurl: { name = \"${project}-${version}\"; src = fetchurl { url = mirror://gnome/sources/${project}/${majorVersion}/${project}-${version}.tar.${ext_pref}; sha256 = \"${sha256}\"; }; }" return 0 } update_project() { local project=$1 local majorVersion=$2 # find project in nixpkgs tree projectPath=$(find_project -name "$project" -print) if [ -z "$projectPath" ]; then echo "Project $project not found under $GNOME_TOP" exit 1 fi src=$(show_project "$project" "$majorVersion") if [ "$?" -eq "0" ]; then echo "Updating $projectPath/src.nix" >&2 echo -e "$src" > "$projectPath"/src.nix fi return 0 } if [ "$action" = "update-all" ]; then majorVersion=$2 if [ -z "$majorVersion" ]; then echo "No major version specified" >&2 usage fi # find projects projects=$(find_project -exec basename '{}' \;) for project in $projects; do if echo "$NO_GNOME_MAJOR"|grep -q $project; then echo "Skipping $project" else echo "= Updating $project to $majorVersion" >&2 update_project "$project" "$majorVersion" echo >&2 fi done else project=$2 majorVersion=$3 if [ -z "$project" ]; then echo "No project specified, exiting" >&2 usage fi if [ "$action" = show ]; then show_project "$project" "$majorVersion" elif [ "$action" = update ]; then update_project "$project" "$majorVersion" else echo "Unknown action $action" >&2 usage fi fi