summary refs log blame commit diff
path: root/maintainers/scripts/gnome.sh
blob: e5a8d606f1a3b41279577fd015e316793e28f998 (plain) (tree)
1
2
3
4
5
6
7
8
9
                   
 
               
 
                                         
 

                                                                                 
                                 
 
         

                                                                                           
        

 
                       
       

  
            
     
 
         








                                                                                
                    


   
                
                                                             


                


                       


                                                

                                                                                                                        






                                                                                      

    

                                                                     
                         
                                                            
    
  
                                                      



























                                                                                    
                                                                                                        









                                                                 
                                                                      

















                                                                             


                                   

                  
                                                                                                  
                           
    

  



                  

                       
 
                                
                                                     




                                                      



                                                
                                           




          

                                     











                                                     
                                               


              
    

                 





                                            



                                             




                                     
#!/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"

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