#!/bin/sh channels_url="http://omahaproxy.appspot.com/"; bucket_url="http://commondatastorage.googleapis.com/chromium-browser-official/"; output_file="$(cd "$(dirname "$0")" && pwd)/sources.nix"; 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"; 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\";"; echo " url = \"$url\";"; echo " sha256 = \"$sha256\";"; echo " };"; done; } cd "$(dirname "$0")"; 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. { $channel_exprs } EOF