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