nixpkgs/pkgs/applications/networking/browsers/chromium/update.sh
aszlig 777351bce4
chromium/updater: Avoid downgrading versions.
Previously we have just checked for equality. When going back in history, that
way if the history is somewhat out-of-sync, we could end up "updating" to an
older version, which we definitely don't want.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
2013-06-14 17:50:36 +02:00

160 lines
3.7 KiB
Bash
Executable file

#!/bin/sh
channels_url="http://omahaproxy.appspot.com/all?csv=1";
history_url="http://omahaproxy.appspot.com/history";
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";
}
get_newest_ver()
{
versions="$(for v in $@; do echo "$v"; done)";
if oldest="$(echo "$versions" | sort -V 2> /dev/null | tail -n1)";
then
echo "$oldest";
else
echo "$versions" | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n1;
fi;
}
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$(get_newest_ver "$version" "$oldver")" != "x$oldver" ];
then
echo " no, getting sha256 for new version $version:" >&2;
sha256="$(nix-prefetch-url "$url")" || return 1;
else
echo " yes, keeping old sha256." >&2;
sha256="$(nix_getattr "$output_file" "$channel.sha256")" \
|| return 1;
fi;
sha_insert "$version" "$sha256";
echo "$sha256";
return 0;
}
else
get_sha256()
{
nix-prefetch-url "$3";
}
fi;
fetch_filtered_history()
{
curl -s "$history_url" | sed -nr 's/^'"linux,$1"',([^,]+).*$/\1/p';
}
get_prev_sha256()
{
channel="$1";
current_version="$2";
for version in $(fetch_filtered_history "$channel");
do
[ "x$version" = "x$current_version" ] && continue;
url="${bucket_url%/}/chromium-$version.tar.xz";
sha256="$(get_sha256 "$channel" "$version" "$url")" || continue;
echo "$sha256:$version:$url";
return 0;
done;
}
get_channel_exprs()
{
for chline in $1;
do
channel="${chline%%,*}";
version="${chline##*,}";
url="${bucket_url%/}/chromium-$version.tar.xz";
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")";
if [ $? -ne 0 ];
then
echo "Whoops, failed to fetch $version, trying previous" \
"versions:" >&2;
sha_ver_url="$(get_prev_sha256 "$channel" "$version")";
sha256="${sha_ver_url%%:*}";
ver_url="${sha_ver_url#*:}";
version="${ver_url%%:*}";
url="${ver_url#*:}";
fi;
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 -nr -e 's/^linux,([^,]+,[^,]+).*$/\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