mirror of
https://gitlab.com/fdroid/gradlew-fdroid.git
synced 2025-12-07 18:25:32 +01:00
423 lines
22 KiB
Python
Executable file
423 lines
22 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
"""A reimplementation of gradlew script."""
|
|
|
|
import hashlib
|
|
import json
|
|
import os
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
from argparse import ArgumentParser
|
|
from collections import OrderedDict
|
|
from pathlib import Path
|
|
from typing import Union
|
|
|
|
import requests
|
|
|
|
BINDIR = Path(__file__).parent
|
|
BASEDIR = BINDIR.parent
|
|
CHECKSUMS_URL = [
|
|
"https://gitlab.com/fdroid/gradle-transparency-log/-/raw/master/checksums.json",
|
|
"https://fdroid.gitlab.io/gradle-transparency-log/checksums.json",
|
|
"https://raw.githubusercontent.com/f-droid/gradle-transparency-log/master/checksums.json",
|
|
]
|
|
RETRY = 3
|
|
|
|
CHECKSUM = OrderedDict(
|
|
[
|
|
("0.7", "4e354fcb0d5c0b0e7789cd6ee900456edaf993f6dd890c4a1c217d90d2a6a6ad"),
|
|
("0.8", "940e623ea98e40ea9ad398770a6ebb91a61c0869d394dda81aa86b0f4f0025e7"),
|
|
("0.9", "994e46d4b467254a0f25ce92b602618331b9b3ac8b32a094fd84ff0e0ceec135"),
|
|
("0.9.1", "5d48cba95db031ec109ae9ab60561e960b6507046036e8191aa78572ec27e2a5"),
|
|
("0.9.2", "f94d7642348c558fc05ab5fd6fb947fb1ed8fed5931ddb73dd04fb0de22d669b"),
|
|
("1.0", "894bca0360a7e2040815096788f118a2dd106ff6694221b274efb9c32bce0384"),
|
|
("1.1", "552c1fc9f3a1b9668b79cc447370f0263e664ffb6d5c6e1c21e77ce0c8a20d4c"),
|
|
("1.2", "eb53da3704d24cabb7565f34a3bf16bcd863c4b0c139917606fb15d4f27c7bdf"),
|
|
("1.3", "ada68561efbb9f1cae0f9063974cbde15c180351a2f92bc2f1106e39ddcae5ba"),
|
|
("1.4", "cd99e85fbcd0ae8b99e81c9992a2f10cceb7b5f009c3720ef3a0078f4f92e94e"),
|
|
("1.5", "a5511a0659caa47d9d74fd2844c9da43157d2f78e63a0223c6289d88f5aaecbe"),
|
|
("1.6", "de3e89d2113923dcc2e0def62d69be0947ceac910abd38b75ec333230183fac4"),
|
|
("1.7", "360c97d51621b5a1ecf66748c718594e5f790ae4fbc1499543e0c006033c9d30"),
|
|
("1.8", "a342bbfa15fd18e2482287da4959588f45a41b60910970a16e6d97959aea5703"),
|
|
("1.9", "097ddc2bcbc9da2bb08cbf6bf8079585e35ad088bafd42e8716bc96405db98e9"),
|
|
("1.10", "6e6db4fc595f27ceda059d23693b6f6848583950606112b37dfd0e97a0a0a4fe"),
|
|
("1.11", "07e235df824964f0e19e73ea2327ce345c44bcd06d44a0123d29ab287fc34091"),
|
|
("1.12", "8734b13a401f4311ee418173ed6ca8662d2b0a535be8ff2a43ecb1c13cd406ea"),
|
|
("2.0", "a1eb880c8755333c4d33c4351b269bebe517002532d3142c0b6164c9e8c081c3"),
|
|
("2.1", "3eee4f9ea2ab0221b89f8e4747a96d4554d00ae46d8d633f11cfda60988bf878"),
|
|
("2.2", "91e5655fe11ef414449f218c4fa2985b3a49b7903c57556da109c84fa26e1dfb"),
|
|
("2.2.1", "420aa50738299327b611c10b8304b749e8d3a579407ee9e755b15921d95ff418"),
|
|
("2.3", "010dd9f31849abc3d5644e282943b1c1c355f8e2635c5789833979ce590a3774"),
|
|
("2.4", "c4eaecc621a81f567ded1aede4a5ddb281cc02a03a6a87c4f5502add8fc2f16f"),
|
|
("2.5", "3f953e0cb14bb3f9ebbe11946e84071547bf5dfd575d90cfe9cc4e788da38555"),
|
|
("2.6", "18a98c560af231dfa0d3f8e0802c20103ae986f12428bb0a6f5396e8f14e9c83"),
|
|
("2.7", "cde43b90945b5304c43ee36e58aab4cc6fb3a3d5f9bd9449bb1709a68371cb06"),
|
|
("2.8", "a88db9c2f104defdaa8011c58cf6cda6c114298ae3695ecfb8beb30da3a903cb"),
|
|
("2.9", "c9159ec4362284c0a38d73237e224deae6139cbde0db4f0f44e1c7691dd3de2f"),
|
|
("2.10", "66406247f745fc6f05ab382d3f8d3e120c339f34ef54b86f6dc5f6efc18fbb13"),
|
|
("2.11", "8d7437082356c9fd6309a4479c8db307673965546daea445c6c72759cd6b1ed6"),
|
|
("2.12", "e77064981906cd0476ff1e0de3e6fef747bd18e140960f1915cca8ff6c33ab5c"),
|
|
("2.13", "0f665ec6a5a67865faf7ba0d825afb19c26705ea0597cec80dd191b0f2cbb664"),
|
|
("2.14", "993b4f33b652c689e9721917d8e021cab6bbd3eae81b39ab2fd46fdb19a928d5"),
|
|
("2.14.1", "cfc61eda71f2d12a572822644ce13d2919407595c2aec3e3566d2aab6f97ef39"),
|
|
("3.0", "39c906941a474444afbddc38144ed44166825acb0a57b0551dddb04bbf157f80"),
|
|
("3.1", "c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc"),
|
|
("3.2", "5321b36837226dc0377047a328f12010f42c7bf88ee4a3b1cee0c11040082935"),
|
|
("3.2.1", "9843a3654d3e57dce54db06d05f18b664b95c22bf90c6becccb61fc63ce60689"),
|
|
("3.3", "c58650c278d8cf0696cab65108ae3c8d95eea9c1938e0eb8b997095d5ca9a292"),
|
|
("3.4", "72d0cd4dcdd5e3be165eb7cd7bbd25cf8968baf400323d9ab1bba622c3f72205"),
|
|
("3.4.1", "db1db193d479cc1202be843f17e4526660cfb0b21b57d62f3a87f88c878af9b2"),
|
|
("3.5", "0b7450798c190ff76b9f9a3d02e18b33d94553f708ebc08ebe09bdf99111d110"),
|
|
("3.5.1", "8dce35f52d4c7b4a4946df73aa2830e76ba7148850753d8b5e94c5dc325ceef8"),
|
|
("4.0", "56bd2dde29ba2a93903c557da1745cafd72cdd8b6b0b83c05a40ed7896b79dfe"),
|
|
("4.0.1", "d717e46200d1359893f891dab047fdab98784143ac76861b53c50dbd03b44fd4"),
|
|
("4.0.2", "79ac421342bd11f6a4f404e0988baa9c1f5fabf07e3c6fa65b0c15c1c31dda22"),
|
|
("4.1", "d55dfa9cfb5a3da86a1c9e75bb0b9507f9a8c8c100793ccec7beb6e259f9ed43"),
|
|
("4.2", "515dd63d32e55a9c05667809c5e40a947529de3054444ad274b3b75af5582eae"),
|
|
("4.2.1", "b551cc04f2ca51c78dd14edb060621f0e5439bdfafa6fd167032a09ac708fbc0"),
|
|
("4.3", "8dcbf44eef92575b475dcb1ce12b5f19d38dc79e84c662670248dc8b8247654c"),
|
|
("4.3.1", "15ebe098ce0392a2d06d252bff24143cc88c4e963346582c8d88814758d93ac7"),
|
|
("4.4", "fa4873ae2c7f5e8c02ec6948ba95848cedced6134772a0169718eadcb39e0a2f"),
|
|
("4.4.1", "e7cf7d1853dfc30c1c44f571d3919eeeedef002823b66b6a988d27e919686389"),
|
|
("4.5", "03f2a43a314ff0fb843a85ef68078e06d181c4549c1e5fb983f289382b59b5e3"),
|
|
("4.5.1", "3e2ea0d8b96605b7c528768f646e0975bd9822f06df1f04a64fd279b1a17805e"),
|
|
("4.6", "98bd5fd2b30e070517e03c51cbb32beee3e2ee1a84003a5a5d748996d4b1b915"),
|
|
("4.7", "fca5087dc8b50c64655c000989635664a73b11b9bd3703c7d6cabd31b7dcdb04"),
|
|
("4.8", "f3e29692a8faa94eb0b02ebf36fa263a642b3ae8694ef806c45c345b8683f1ba"),
|
|
("4.8.1", "af334d994b5e69e439ab55b5d2b7d086da5ea6763d78054f49f147b06370ed71"),
|
|
("4.9", "e66e69dce8173dd2004b39ba93586a184628bc6c28461bc771d6835f7f9b0d28"),
|
|
("4.10", "248cfd92104ce12c5431ddb8309cf713fe58de8e330c63176543320022f59f18"),
|
|
("4.10.1", "e53ce3a01cf016b5d294eef20977ad4e3c13e761ac1e475f1ffad4c6141a92bd"),
|
|
("4.10.2", "b49c6da1b2cb67a0caf6c7480630b51c70a11ca2016ff2f555eaeda863143a29"),
|
|
("4.10.3", "8626cbf206b4e201ade7b87779090690447054bc93f052954c78480fa6ed186e"),
|
|
("5.0", "6157ac9f3410bc63644625b3b3e9e96c963afd7910ae0697792db57813ee79a6"),
|
|
("5.1", "7506638a380092a0406364c79d6c87d03d23017fc25a5770379d1ce23c3fcd4d"),
|
|
("5.1.1", "4953323605c5d7b89e97d0dc7779e275bccedefcdac090aec123375eae0cc798"),
|
|
("5.2", "ff322863250159595e93b5a4d17a6f0d21c59a1a0497c1e1cf1d53826485503f"),
|
|
("5.2.1", "748c33ff8d216736723be4037085b8dc342c6a0f309081acf682c9803e407357"),
|
|
("5.3", "bed2bdd3955be5a09ca7e0201e9d131f194f7f6c466e1795a733733ccfb09f25"),
|
|
("5.3.1", "1c59a17a054e9c82f0dd881871c9646e943ec4c71dd52ebc6137d17f82337436"),
|
|
("5.4", "c8c17574245ecee9ed7fe4f6b593b696d1692d1adbfef425bef9b333e3a0e8de"),
|
|
("5.4.1", "7bdbad1e4f54f13c8a78abc00c26d44dd8709d4aedb704d913fb1bb78ac025dc"),
|
|
("5.5", "8d78b2ed63e7f07ad169c1186d119761c4773e681f332cfe1901045b1b0141bc"),
|
|
("5.5.1", "222a03fcf2fcaf3691767ce9549f78ebd4a77e73f9e23a396899fb70b420cd00"),
|
|
("5.6", "15c02ef5dd3631ec02ac52e8725703e0285d9a7eecbf4e5939aa9e924604d01d"),
|
|
("5.6.1", "0986244820e4a35d32d91df2ec4b768b5ba5d6c8246753794f85159f9963ec12"),
|
|
("5.6.2", "32fce6628848f799b0ad3205ae8db67d0d828c10ffe62b748a7c0d9f4a5d9ee0"),
|
|
("5.6.3", "60a6d8f687e3e7a4bc901cc6bc3db190efae0f02f0cc697e323e0f9336f224a3"),
|
|
("5.6.4", "1f3067073041bc44554d0efe5d402a33bc3d3c93cc39ab684f308586d732a80d"),
|
|
("6.0", "5a3578b9f0bb162f5e08cf119f447dfb8fa950cedebb4d2a977e912a11a74b91"),
|
|
("6.0.1", "d364b7098b9f2e58579a3603dc0a12a1991353ac58ed339316e6762b21efba44"),
|
|
("6.1", "d0c43d14e1c70a48b82442f435d06186351a2d290d72afd5b8866f15e6d7038a"),
|
|
("6.1.1", "9d94e6e4a28ad328072ef6e56bce79a810494ae756751fdcedffdeaf27c093b1"),
|
|
("6.2", "b93a5f30d01195ec201e240f029c8b42d59c24086b8d1864112c83558e23cf8a"),
|
|
("6.2.1", "a68ca7ba57f3404c3f6fc1f70a02d3a7d78652e6b46bbfaff83fc9a17168c279"),
|
|
("6.2.2", "0f6ba231b986276d8221d7a870b4d98e0df76e6daf1f42e7c0baec5032fb7d17"),
|
|
("6.3", "038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768"),
|
|
("6.4", "b888659f637887e759749f6226ddfcb1cb04f828c58c41279de73c463fdbacc9"),
|
|
("6.4.1", "e58cdff0cee6d9b422dcd08ebeb3177bc44eaa09bd9a2e838ff74c408fe1cbcd"),
|
|
("6.5", "23e7d37e9bb4f8dabb8a3ea7fdee9dd0428b9b1a71d298aefd65b11dccea220f"),
|
|
("6.5.1", "50a7d30529fa939721fe9268a0205142f3f2302bcac5fb45b27a3902e58db54a"),
|
|
("6.6", "e6f83508f0970452f56197f610d13c5f593baaf43c0e3c6a571e5967be754025"),
|
|
("6.6.1", "7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac"),
|
|
("6.7", "8ad57759019a9233dc7dc4d1a530cefe109dc122000d57f7e623f8cf4ba9dfc4"),
|
|
("6.7.1", "3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d"),
|
|
("6.8", "e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c"),
|
|
("6.8.1", "fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd"),
|
|
("6.8.2", "8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610"),
|
|
("6.8.3", "7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205"),
|
|
("6.9", "765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e"),
|
|
("6.9.1", "8c12154228a502b784f451179846e518733cf856efc7d45b2e6691012977b2fe"),
|
|
("6.9.2", "8b356fd8702d5ffa2e066ed0be45a023a779bba4dd1a68fd11bc2a6bdc981e8f"),
|
|
("6.9.3", "dcf350b8ae1aa192fc299aed6efc77b43825d4fedb224c94118ae7faf5fb035d"),
|
|
("6.9.4", "3e240228538de9f18772a574e99a0ba959e83d6ef351014381acd9631781389a"),
|
|
("7.0", "eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305"),
|
|
("7.0.1", "dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb"),
|
|
("7.0.2", "0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c"),
|
|
("7.1", "2debee19271e1b82c6e41137d78e44e6e841035230a1a169ca47fd3fb09ed87b"),
|
|
("7.1.1", "bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d"),
|
|
("7.2", "f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd"),
|
|
("7.3", "de8f52ad49bdc759164f72439a3bf56ddb1589c4cde802d3cec7d6ad0e0ee410"),
|
|
("7.3.1", "9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66"),
|
|
("7.3.2", "23b89f8eac363f5f4b8336e0530c7295c55b728a9caa5268fdd4a532610d5392"),
|
|
("7.3.3", "b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302"),
|
|
("7.4", "8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634"),
|
|
("7.4.1", "e5444a57cda4a95f90b0c9446a9e1b47d3d7f69057765bfb54bd4f482542d548"),
|
|
("7.4.2", "29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda"),
|
|
("7.5", "cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2"),
|
|
("7.5.1", "f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4"),
|
|
("7.6", "7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b"),
|
|
("7.6.1", "6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87"),
|
|
("7.6.2", "a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac"),
|
|
("7.6.3", "740c2e472ee4326c33bf75a5c9f5cd1e69ecf3f9b580f6e236c86d1f3d98cfac"),
|
|
("7.6.4", "bed1da33cca0f557ab13691c77f38bb67388119e4794d113e051039b80af9bb1"),
|
|
("7.6.5", "b812fec0edb7d27e0ae35955887bb2954536fa3e44edaf481150da058e154d9a"),
|
|
("7.6.6", "673d9776f303bc7048fc3329d232d6ebf1051b07893bd9d11616fad9a8673be0"),
|
|
("8.0", "4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788"),
|
|
("8.0.1", "1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909"),
|
|
("8.0.2", "ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7"),
|
|
("8.1", "a62c5f99585dd9e1f95dab7b9415a0e698fa9dd1e6c38537faa81ac078f4d23e"),
|
|
("8.1.1", "e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f"),
|
|
("8.2", "38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3"),
|
|
("8.2.1", "03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1"),
|
|
("8.3", "591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225"),
|
|
("8.4", "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae"),
|
|
("8.5", "9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026"),
|
|
("8.6", "9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c"),
|
|
("8.7", "544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d"),
|
|
("8.8", "a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612"),
|
|
("8.9", "d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab"),
|
|
("8.10", "5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a"),
|
|
("8.10.1", "1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1"),
|
|
("8.10.2", "31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26"),
|
|
("8.11", "57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9"),
|
|
("8.11.1", "f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6"),
|
|
("8.12", "7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03"),
|
|
("8.12.1", "8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94"),
|
|
("8.13", "20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78"),
|
|
("8.14", "61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa"),
|
|
("8.14.1", "845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf"),
|
|
("8.14.2", "7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999"),
|
|
("8.14.3", "bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531"),
|
|
("9.0.0", "8fad3d78296ca518113f3d29016617c7f9367dc005f932bd9d93bf45ba46072b"),
|
|
("9.1.0", "a17ddd85a26b6a7f5ddb71ff8b05fc5104c0202c6e64782429790c933686c806"),
|
|
("9.2.0", "df67a32e86e3276d011735facb1535f64d0d88df84fa87521e90becc2d735444"),
|
|
]
|
|
)
|
|
|
|
# key-value pairs of what Gradle version (value) each Gradle plugin version
|
|
# (key) should accept. The plugin versions are actually prefixes and catch sub-
|
|
# versions as well. Pairs are taken from:
|
|
# https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
|
|
MIN_GRADLE_VERSION = OrderedDict(
|
|
[
|
|
("8.13", "8.13"),
|
|
("8.11", "8.13"),
|
|
("8.10", "8.11.1"),
|
|
("8.9", "8.11.1"),
|
|
("8.8", "8.10.2"),
|
|
("8.7", "8.9"),
|
|
("8.6", "8.7"),
|
|
("8.5", "8.7"),
|
|
("8.4", "8.6"),
|
|
("8.3", "8.4"),
|
|
("8.2", "8.2"),
|
|
("8.1", "8.0"),
|
|
("8.0", "8.0"),
|
|
("7.4", "7.5"),
|
|
("7.3", "7.4"),
|
|
("7.2", "7.3.3"),
|
|
("7.1", "7.2"),
|
|
("7.0", "7.0.2"),
|
|
("4.2", "6.7.1"),
|
|
("4.1", "6.5"),
|
|
("4.0", "6.1.1"),
|
|
("3.6", "5.6.4"),
|
|
("3.5", "5.4.1"),
|
|
("3.4", "5.1.1"),
|
|
("3.3", "4.10.1"),
|
|
("3.2", "4.6"),
|
|
("3.1", "4.4"),
|
|
("3.0", "4.1"),
|
|
("2.3", "3.3"),
|
|
("2.2", "2.14.1"),
|
|
("2.1.3", "2.14.1"),
|
|
("2.1", "2.12"),
|
|
("2.0", "2.12"),
|
|
]
|
|
)
|
|
|
|
GRADLE_WRAPPER_PAT = re.compile(
|
|
r"^distributionUrl=https\\?://(?:services|downloads)\.gradle\.org/distributions/gradle-(.*)-(?:bin|all)\.zip",
|
|
re.MULTILINE,
|
|
)
|
|
AGP_PAT = re.compile(r"""["']com\.android\.tools\.build:gradle:(.+)["']""")
|
|
GRADLE_VERSION_PAT = re.compile(r"""gradleVersion = ["'](.+)["']""")
|
|
GRADLE_LOG_PAT = re.compile(r".*/gradle-([\d.]+)-bin.zip")
|
|
|
|
|
|
# Check if CACHEDIR is set from environment
|
|
try:
|
|
import platformdirs
|
|
|
|
DEFAULT_CACHEDIR = Path(platformdirs.user_cache_dir("gradlew-fdroid", "F-Droid"))
|
|
except ImportError:
|
|
DEFAULT_CACHEDIR = Path.home() / ".cache/gradlew-fdroid"
|
|
CACHEDIR = Path(os.environ.get("CACHEDIR", DEFAULT_CACHEDIR))
|
|
if not CACHEDIR.is_dir():
|
|
try:
|
|
CACHEDIR.mkdir(parents=True, exist_ok=True)
|
|
except PermissionError as e:
|
|
print(f"Failed to create {CACHEDIR}: {e}")
|
|
sys.exit(1)
|
|
print(f"CACHEDIR set to {CACHEDIR}")
|
|
GRADLE_VERSION_DIR = CACHEDIR / "versions"
|
|
GRADLE_VERSION_DIR.mkdir(exist_ok=True)
|
|
|
|
CHECKSUMS_CACHE = CACHEDIR / "gradle_checksums.json"
|
|
CHECKSUMS_ETAG = CACHEDIR / "etag"
|
|
|
|
|
|
def download_checksum():
|
|
"""Download the checksum from https://gitlab.com/fdroid/gradle-transparency-log."""
|
|
for url in CHECKSUMS_URL:
|
|
headers = {}
|
|
if CHECKSUMS_ETAG.is_file():
|
|
etag = CHECKSUMS_ETAG.read_text()
|
|
headers = {"If-None-Match": etag}
|
|
|
|
try:
|
|
res = requests.get(url, headers=headers, timeout=300)
|
|
except requests.exceptions.RequestException:
|
|
continue
|
|
code = res.status_code
|
|
if code == 200:
|
|
etag = res.headers.get("ETag")
|
|
if etag:
|
|
CHECKSUMS_ETAG.write_text(etag)
|
|
try:
|
|
with CHECKSUMS_CACHE.open("wb") as fd:
|
|
for chunk in res.iter_content(chunk_size=128):
|
|
fd.write(chunk)
|
|
break
|
|
except ConnectionError as e:
|
|
print(e)
|
|
CHECKSUMS_CACHE.unlink(missing_ok=True)
|
|
elif code == 304:
|
|
print("Remote gradle-transparency-log not changed, reusing cache")
|
|
break
|
|
else:
|
|
print(f"Failed to download gradle checksum from {url}: {code}!")
|
|
else:
|
|
print("Failed to download gradle-transparency-log")
|
|
|
|
|
|
def download_gradle(version: str, checksums: dict[str, str]):
|
|
"""Download Gradle binary."""
|
|
filename = f"gradle-{version}-bin.zip"
|
|
url = f"https://downloads.gradle.org/distributions/{filename}"
|
|
shasum = checksums.get(version)
|
|
if not shasum:
|
|
print(f"No hash for gradle version {version}! Exiting...")
|
|
sys.exit(1)
|
|
|
|
if (cache_file := CACHEDIR / filename).is_file():
|
|
print(f"Using cached {cache_file} ...")
|
|
gradle_zip = cache_file
|
|
else:
|
|
print(f"Downloading missing gradle version {version}")
|
|
print(f"Using cache directory {CACHEDIR}")
|
|
if not os.access(CACHEDIR, os.W_OK):
|
|
print(f"{CACHEDIR} not writable")
|
|
sys.exit(1)
|
|
|
|
for _ in range(RETRY):
|
|
res = requests.get(url, timeout=300)
|
|
code = res.status_code
|
|
if code == 200:
|
|
try:
|
|
with (CACHEDIR / filename).open("wb") as fd:
|
|
for chunk in res.iter_content(chunk_size=128):
|
|
fd.write(chunk)
|
|
break
|
|
except ConnectionError as e:
|
|
print(e)
|
|
CHECKSUMS_CACHE.unlink(missing_ok=True)
|
|
continue
|
|
|
|
gradle_zip = CACHEDIR / filename
|
|
if hashlib.sha256(gradle_zip.read_bytes()).hexdigest() != shasum:
|
|
print("gradle download checksum mismatch! Exiting...")
|
|
sys.exit(1)
|
|
shutil.unpack_archive(gradle_zip, GRADLE_VERSION_DIR)
|
|
shutil.move(GRADLE_VERSION_DIR / f"gradle-{version}", GRADLE_VERSION_DIR / version)
|
|
|
|
|
|
def parse_gradle_wrapper(root_path: Path) -> Union[str, None]:
|
|
"""Parse gradle-wrapper.properties to get the Gradle version."""
|
|
for d in (root_path, root_path.parent, root_path.parent.parent):
|
|
if (f := d / "gradle/wrapper/gradle-wrapper.properties").is_file():
|
|
print(f.read_text(errors="ignore"))
|
|
m = GRADLE_WRAPPER_PAT.search(f.read_text(errors="ignore"))
|
|
if m:
|
|
version = m.group(1)
|
|
print(f"Found {version} via distributionUrl")
|
|
return version
|
|
|
|
|
|
def parse_build_gradle(root_path: Path) -> Union[str, None]:
|
|
"""Parse build.gradle to get the Gradle version."""
|
|
for d in (root_path, root_path.parent):
|
|
for n in ("build.gradle", "build.gradle.kts"):
|
|
if (f := d / n).is_file():
|
|
content = f.read_text()
|
|
|
|
if m := AGP_PAT.search(content):
|
|
plugin_version = m.group(1)
|
|
for k in MIN_GRADLE_VERSION:
|
|
if re.match(k, plugin_version):
|
|
version = MIN_GRADLE_VERSION[k]
|
|
print(f"Found {version} via AGP version {plugin_version}")
|
|
return version
|
|
|
|
if m := GRADLE_VERSION_PAT.search(content):
|
|
version = m.group(1)
|
|
print(f"Found {version} via gradleVersion")
|
|
return version
|
|
|
|
|
|
def main():
|
|
"""Run main function."""
|
|
parser = ArgumentParser()
|
|
parser.add_argument(
|
|
"-p",
|
|
"--project-dir",
|
|
help="Specifies the start directory for Gradle. Defaults to current directory.",
|
|
)
|
|
options, _ = parser.parse_known_args()
|
|
download_checksum()
|
|
checksums = CHECKSUM
|
|
if CHECKSUMS_CACHE.is_file():
|
|
print("Update checksum from gradle-transparency-log")
|
|
with CHECKSUMS_CACHE.open("r") as f:
|
|
checksums.update(
|
|
{
|
|
m.group(1): v[0]["sha256"]
|
|
for k, v in json.load(f).items()
|
|
if (m := GRADLE_LOG_PAT.fullmatch(k))
|
|
}
|
|
)
|
|
|
|
def version2int(version: str) -> int:
|
|
parts = version[0].split(".")
|
|
if len(parts) < 3:
|
|
parts.append("0")
|
|
return 10000 * int(parts[0]) + 100 * int(parts[1]) + int(parts[2])
|
|
|
|
checksums: dict[str, str] = OrderedDict(
|
|
sorted(checksums.items(), key=version2int)
|
|
)
|
|
|
|
root_path = Path.cwd()
|
|
if options.project_dir:
|
|
root_path = Path(options.project_dir)
|
|
version = parse_gradle_wrapper(root_path) or parse_build_gradle(root_path)
|
|
if not version:
|
|
version = list(checksums.keys())[-1]
|
|
print(f"No suitable gradle version found - defaulting to {version}")
|
|
|
|
gradle_dir = GRADLE_VERSION_DIR / version
|
|
if not gradle_dir.is_dir():
|
|
download_gradle(version, checksums)
|
|
|
|
gradle_bin = GRADLE_VERSION_DIR / version / "bin/gradle"
|
|
gradle_bin.chmod(gradle_bin.stat().st_mode | 0o100)
|
|
args = sys.argv
|
|
args[0] = str(gradle_bin)
|
|
print(f"Running {' '.join(args)}")
|
|
sys.exit(subprocess.run(args, check=False).returncode)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|