From 6968400a3431626ca06a81fb01635584986085a4 Mon Sep 17 00:00:00 2001 From: aszlig Date: Fri, 17 Aug 2012 12:42:51 +0200 Subject: [PATCH] chromium: Check sha256 per channel in update.sh. Until this commit we had a single hash of the whole version response from omahaproxy. This worked well for not updating unnecessarily but only until one single channel has a new version available. Unfortunately the dev version is released quite frequently, so the hash is of no use at all (we could rather directly fetch everything everytime we execute the script). This led to this commit, which adds two methods of caching: First of all, if a perticular version/channel is already in the previous version of the sources.nix file, don't download it again. And the second method is to check if the current sha256 is already downloaded and reads the corresponding sha256 from the lookup table. So, this should really help to avoid flooding the download servers and to not stress impatient users too much. --- .../networking/browsers/chromium/update.sh | 103 ++++++++++++++---- 1 file changed, 83 insertions(+), 20 deletions(-) diff --git a/pkgs/applications/networking/browsers/chromium/update.sh b/pkgs/applications/networking/browsers/chromium/update.sh index c9dd69df9a2..4721ded385a 100755 --- a/pkgs/applications/networking/browsers/chromium/update.sh +++ b/pkgs/applications/networking/browsers/chromium/update.sh @@ -4,16 +4,92 @@ channels_url="http://omahaproxy.appspot.com/"; bucket_url="http://commondatastorage.googleapis.com/chromium-browser-official/"; output_file="$(cd "$(dirname "$0")" && pwd)/sources.nix"; -get_channels() +nix_getattr() +{ + input_file="$1"; + attr="$2"; + + var="$(nix-instantiate --eval-only -A "$attr" "$output_file")"; + echo "$var" | tr -d '\\"'; +} + +### poor mans key/value-store :-) ### + +ver_sha_table=""; # list of version:sha256 + +sha_lookup() +{ + version="$1"; + + for ver_sha in $ver_sha_table; + do + if [ "x${ver_sha%:*}" = "x$version" ]; + then + echo "${ver_sha##*:}"; + return 0; + fi; + done; + + return 1; +} + +sha_insert() +{ + version="$1"; + sha256="$2"; + + ver_sha_table="$ver_sha_table $version:$sha256"; +} + +if [ -e "$output_file" ]; +then + get_sha256() + { + channel="$1"; + version="$2"; + url="$3"; + + oldver="$(nix_getattr "$output_file" "$channel.version")"; + + echo -n "Checking if $oldver ($channel) is up to date..." >&2; + + if [ "x$version" != "x$oldver" ]; + then + echo " no, getting sha256 for new version $version:" >&2; + sha256="$(nix-prefetch-url "$url")"; + else + echo " yes, keeping old sha256." >&2; + sha256="$(nix_getattr "$output_file" "$channel.sha256")"; + fi; + + sha_insert "$version" "$sha256" + echo "$sha256"; + } +else + get_sha256() + { + nix-prefetch-url "$url"; + } +fi; + +get_channel_exprs() { for chline in $(echo "$1" | cut -d, -f-2); do channel="${chline%%,*}"; version="${chline##*,}"; - url="${bucket_url%/}/chromium-$version.tar.bz2"; - sha256="$(nix-prefetch-url "$url")"; + echo -n "Checking if sha256 of version $version is cached..." >&2; + if sha256="$(sha_lookup "$version")"; + then + echo "yes: $sha256" >&2; + else + echo "no." >&2; + sha256="$(get_sha256 "$channel" "$version" "$url")"; + fi; + + sha_insert "$version" "$sha256"; echo " $channel = {"; echo " version = \"$version\";"; @@ -25,26 +101,13 @@ get_channels() cd "$(dirname "$0")"; -versions="$(curl -s "$channels_url" | sed -n -e 's/^linux,\(\([^,]\+,\)\{2\}\).*$/\1/p')"; - -if [ -e "$output_file" ]; -then - vhash="$(echo "$versions" | sha256sum | cut -d' ' -f1)"; - old_vhash="$(sed -n 's/# *VHASH: *//p' "$output_file")"; - - if [ "x$vhash" = "x$old_vhash" ]; - then - echo "$output_file is already up to date, bailing out." >&2; - exit 1; - fi; -fi; - -channels="$(get_channels "$versions")"; +omaha="$(curl -s "$channels_url")"; +versions="$(echo "$omaha" | sed -n -e 's/^linux,\(\([^,]\+,\)\{2\}\).*$/\1/p')"; +channel_exprs="$(get_channel_exprs "$versions")"; cat > "$output_file" <<-EOF # This file is autogenerated from update.sh in the same directory. -# VHASH: $vhash { -$channels +$channel_exprs } EOF