androidenv: update repo.json with a new strategy to expire

This commit is contained in:
Hadi 2023-04-22 14:45:57 -04:00
parent d6259e6e5d
commit 3310972785
No known key found for this signature in database
GPG key ID: 416AD9E8E372C075
6 changed files with 1633 additions and 165 deletions

View file

@ -2,12 +2,12 @@
, licenseAccepted ? false
}:
{ cmdLineToolsVersion ? "8.0"
{ cmdLineToolsVersion ? "9.0"
, toolsVersion ? "26.1.1"
, platformToolsVersion ? "33.0.3"
, buildToolsVersions ? [ "33.0.1" ]
, platformToolsVersion ? "34.0.1"
, buildToolsVersions ? [ "33.0.2" ]
, includeEmulator ? false
, emulatorVersion ? "31.3.14"
, emulatorVersion ? "33.1.6"
, platformVersions ? []
, includeSources ? false
, includeSystemImages ? false
@ -15,7 +15,7 @@
, abiVersions ? [ "armeabi-v7a" "arm64-v8a" ]
, cmakeVersions ? [ ]
, includeNDK ? false
, ndkVersion ? "25.1.8937393"
, ndkVersion ? "25.2.9519653"
, ndkVersions ? [ndkVersion]
, useGoogleAPIs ? false
, useGoogleTVAddOns ? false

View file

@ -115,7 +115,7 @@ pkgs.mkShell rec {
echo "installed_packages_section: ''${installed_packages_section}"
packages=(
"build-tools;33.0.1" "cmdline-tools;8.0" \
"build-tools;33.0.2" "cmdline-tools;9.0" \
"emulator" "patcher;v4" "platform-tools" "platforms;android-33" \
"system-images;android-33;google_apis;arm64-v8a" \
"system-images;android-33;google_apis;x86_64"

View file

@ -25,15 +25,15 @@ let
# versions may be used in multiple places in this Nix expression.
android = {
versions = {
cmdLineToolsVersion = "8.0";
platformTools = "33.0.3";
buildTools = "30.0.3";
cmdLineToolsVersion = "9.0";
platformTools = "34.0.1";
buildTools = "33.0.2";
ndk = [
"25.1.8937393" # LTS NDK
"24.0.8215888"
"25.2.9519653"
];
cmake = "3.22.1";
emulator = "31.3.14";
cmake = "3.6.4111459";
emulator = "33.1.6";
};
platforms = ["23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33"];
@ -165,7 +165,7 @@ pkgs.mkShell rec {
installed_packages_section=$(echo "''${output%%Available Packages*}" | awk 'NR>4 {print $1}')
packages=(
"build-tools;30.0.3" "platform-tools" \
"build-tools;33.0.2" "platform-tools" \
"platforms;android-23" "platforms;android-24" "platforms;android-25" "platforms;android-26" \
"platforms;android-27" "platforms;android-28" "platforms;android-29" "platforms;android-30" \
"platforms;android-31" "platforms;android-32" "platforms;android-33" \

View file

@ -177,8 +177,8 @@ def empty? value
!value || value.empty?
end
# Fixes up returned hashes by sorting keys.
# Will also convert archives (e.g. {'linux' => {'sha1' => ...}, 'macosx' => ...} to
# Fixes up returned hashes by converting archives like
# (e.g. {'linux' => {'sha1' => ...}, 'macosx' => ...} to
# [{'os' => 'linux', 'sha1' => ...}, {'os' => 'macosx', ...}, ...].
def fixup value
Hash[value.map do |k, v|
@ -191,7 +191,35 @@ def fixup value
else
[k, v]
end
end.sort {|(k1, v1), (k2, v2)| k1 <=> k2 }]
end]
end
# Today since Unix Epoch, January 1, 1970.
def today
Time.now.utc.to_i / 24 / 60 / 60
end
# The expiration strategy. Expire if the last available day was before the `oldest_valid_day`.
def expire_records record, oldest_valid_day
if record.is_a?(Hash)
if record.has_key?('last-available-day') &&
record['last-available-day'] < oldest_valid_day
return nil
end
update = {}
# This should only happen in the first run of this scrip after adding the `expire_record` function.
if record.has_key?('displayName') &&
!record.has_key?('last-available-day')
update['last-available-day'] = today
end
record.each {|key, value|
v = expire_records value, oldest_valid_day
update[key] = v if v
}
update
else
record
end
end
# Normalize the specified license text.
@ -253,6 +281,7 @@ def parse_package_xml doc
target['dependencies'] ||= dependencies if dependencies
target['archives'] ||= {}
merge target['archives'], archives
target['last-available-day'] = today
end
[licenses, packages]
@ -294,6 +323,7 @@ def parse_image_xml doc
target['dependencies'] ||= dependencies if dependencies
target['archives'] ||= {}
merge target['archives'], archives
target['last-available-day'] = today
end
[licenses, images]
@ -351,19 +381,36 @@ def parse_addon_xml doc
target['dependencies'] ||= dependencies if dependencies
target['archives'] ||= {}
merge target['archives'], archives
target['last-available-day'] = today
end
[licenses, addons, extras]
end
# Make the clean diff by always sorting the result before puting it in the stdout.
def sort_recursively value
if value.is_a?(Hash)
Hash[
value.map do |k, v|
[k, sort_recursively(v)]
end.sort_by {|(k, v)| k }
]
elsif value.is_a?(Array)
value.map do |v| sort_recursively(v) end
else
value
end
end
def merge_recursively a, b
a.merge!(b) {|key, a_item, b_item|
if a_item.is_a?(Hash) && b_item.is_a?(Hash)
merge_recursively(a_item, b_item)
else
a[key] = b_item
elsif b_item != nil
b_item
end
}
a
end
def merge dest, src
@ -376,31 +423,55 @@ opts = Slop.parse do |o|
o.array '-a', '--addons', 'addon repo XMLs to parse'
end
result = {
licenses: {},
packages: {},
images: {},
addons: {},
extras: {}
}
result = {}
result['licenses'] = {}
result['packages'] = {}
result['images'] = {}
result['addons'] = {}
result['extras'] = {}
opts[:packages].each do |filename|
licenses, packages = parse_package_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
merge result[:licenses], licenses
merge result[:packages], packages
merge result['licenses'], licenses
merge result['packages'], packages
end
opts[:images].each do |filename|
licenses, images = parse_image_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
merge result[:licenses], licenses
merge result[:images], images
merge result['licenses'], licenses
merge result['images'], images
end
opts[:addons].each do |filename|
licenses, addons, extras = parse_addon_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
merge result[:licenses], licenses
merge result[:addons], addons
merge result[:extras], extras
merge result['licenses'], licenses
merge result['addons'], addons
merge result['extras'], extras
end
puts JSON.pretty_generate(fixup(result))
# As we keep the old packages in the repo JSON file, we should have
# a strategy to remove them at some point!
# So with this variable we claim it's okay to remove them from the
# JSON after two years that they are not available.
two_years_ago = today - 2 * 365
input = {}
begin
input_json = (STDIN.tty?) ? "{}" : $stdin.read
if input_json != nil && !input_json.empty?
input = expire_records(JSON.parse(input_json), two_years_ago)
end
rescue JSON::ParserError => e
$stderr.write(e.message)
return
end
fixup_result = fixup(result)
# Regular installation of Android SDK would keep the previously installed packages even if they are not
# in the uptodate XML files, so here we try to support this logic by keeping un-available packages,
# therefore the old packages will work as long as the links are working on the Google servers.
output = merge input, fixup_result
puts JSON.pretty_generate(sort_recursively(output))

View file

@ -1,12 +1,12 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p "ruby.withPackages (pkgs: with pkgs; [ slop nokogiri ])"
#!nix-shell -i bash -p "ruby.withPackages (pkgs: with pkgs; [ slop nokogiri moreutils ])"
set -e
pushd "$(dirname "$0")" &>/dev/null || exit 1
echo "Writing repo.json" >&2
ruby mkrepo.rb \
cat ./repo.json | ruby mkrepo.rb \
--packages ./xml/repository2-1.xml \
--images ./xml/android-sys-img2-1.xml \
--images ./xml/android-tv-sys-img2-1.xml \
@ -14,6 +14,7 @@ ruby mkrepo.rb \
--images ./xml/android-wear-sys-img2-1.xml \
--images ./xml/google_apis-sys-img2-1.xml \
--images ./xml/google_apis_playstore-sys-img2-1.xml \
--addons ./xml/addon2-1.xml > repo.json
--addons ./xml/addon2-1.xml \
| sponge repo.json
popd &>/dev/null

File diff suppressed because it is too large Load diff