diff options
| author | Chih-Hung Hsieh <chh@google.com> | 2020-09-28 00:05:06 -0700 |
|---|---|---|
| committer | Chih-Hung Hsieh <chh@google.com> | 2020-09-28 11:58:20 -0700 |
| commit | 701abda0c478b28affe6cbb5168f1c74ae89367b (patch) | |
| tree | f16737d0a8cf00de68e4e4a0a8dd6081088d1b6b | |
| parent | 806c62b76fcb2ae8cb02325198e61fb3da9ace11 (diff) | |
| download | platform_tools_external_updater-701abda0c478b28affe6cbb5168f1c74ae89367b.tar.gz platform_tools_external_updater-701abda0c478b28affe6cbb5168f1c74ae89367b.tar.bz2 platform_tools_external_updater-701abda0c478b28affe6cbb5168f1c74ae89367b.zip | |
Do not use alpha/beta rust releases.
* Print a message if the latest rust package release number
contains the -alpha or -beta suffix. Ignore it and find
the release with newest release number, not yanked, and
without the -alpha or -beta suffix.
Bug: 169535028
Test: tools/external_updater/updater.sh update rust/crates/nom
Test: ... check rust/crates/clap
Test: ... check rust/crates/pin-project
Test: ... check rust/crates/bitflags
Change-Id: Id1553cfe451a5b575ef14109e88a94bf76f048b5
| -rw-r--r-- | crates_updater.py | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/crates_updater.py b/crates_updater.py index c09a84c..684f15f 100644 --- a/crates_updater.py +++ b/crates_updater.py @@ -26,6 +26,14 @@ CRATES_IO_URL_PATTERN: str = (r"^https:\/\/crates.io\/crates\/([-\w]+)") CRATES_IO_URL_RE: re.Pattern = re.compile(CRATES_IO_URL_PATTERN) +ALPHA_BETA_PATTERN: str = (r"^.*[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta).*") + +ALPHA_BETA_RE: re.Pattern = re.compile(ALPHA_BETA_PATTERN) + +VERSION_PATTERN: str = (r"([0-9]+)\.([0-9]+)\.([0-9]+)") + +VERSION_MATCHER: re.Pattern = re.compile(VERSION_PATTERN) + class CratesUpdater(Updater): """Updater for crates.io packages.""" @@ -42,16 +50,49 @@ class CratesUpdater(Updater): self.package = match.group(1) return True + def _get_version_numbers(self, version: str) -> (int, int, int): + match = VERSION_MATCHER.match(version) + if match is not None: + return tuple(int(match.group(i)) for i in range(1, 4)) + return (0, 0, 0) + + def _is_newer_version(self, prev_version: str, prev_id: int, + check_version: str, check_id: int): + """Return true if check_version+id is newer than prev_version+id.""" + return ((self._get_version_numbers(check_version), check_id) > + (self._get_version_numbers(prev_version), prev_id)) + + def _find_latest_non_test_version(self) -> None: + url = "https://crates.io/api/v1/crates/{}/versions".format(self.package) + with urllib.request.urlopen(url) as request: + data = json.loads(request.read().decode()) + last_id = 0 + self._new_ver = "" + for v in data["versions"]: + version = v["num"] + if (not v["yanked"] and not ALPHA_BETA_RE.match(version) and + self._is_newer_version( + self._new_ver, last_id, version, int(v["id"]))): + last_id = int(v["id"]) + self._new_ver = version + self.dl_path = v["dl_path"] + def check(self) -> None: """Checks crates.io and returns whether a new version is available.""" url = "https://crates.io/api/v1/crates/" + self.package with urllib.request.urlopen(url) as request: data = json.loads(request.read().decode()) self._new_ver = data["crate"]["max_version"] - url = url + "/" + self._new_ver - with urllib.request.urlopen(url) as request: - data = json.loads(request.read().decode()) - self.dl_path = data["version"]["dl_path"] + # Skip d.d.d-{alpha,beta}* versions + if ALPHA_BETA_RE.match(self._new_ver): + print("Ignore alpha or beta release: {}-{}." + .format(self.package, self._new_ver)) + self._find_latest_non_test_version() + else: + url = url + "/" + self._new_ver + with urllib.request.urlopen(url) as request: + data = json.loads(request.read().decode()) + self.dl_path = data["version"]["dl_path"] def update(self) -> None: """Updates the package. |
