195 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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="gtkhtml gdm"
 | 
						|
 | 
						|
usage() {
 | 
						|
  echo "Usage: $0 gnome_dir <show project>|<update project>|<update-all> [major.minor]" >&2
 | 
						|
  echo "gnome_dir is for example pkgs/desktops/gnome-3/3.18" >&2
 | 
						|
  exit 0
 | 
						|
}
 | 
						|
 | 
						|
if [ "$#" -lt 2 ]; then
 | 
						|
  usage
 | 
						|
fi
 | 
						|
 | 
						|
GNOME_TOP="$1"
 | 
						|
shift
 | 
						|
 | 
						|
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
 |