Skip yanked packages and use newest version number.
* crates.io keeps yanked packages with the "yanked" attribute. For example, log-0.4.9 and log-0.4.10 were yanked so "get_rust_pkg log" should skip them. * Compare version numbers before the publish id number. For example, lazy_static-1.1.1 was published after lazy_static-1.4.0, but "get_rust_pkg lazy_static" should fetch 1.4.0. Test: get_rust_pkg.py -v log # get log.0.4.8 Test: get_rust_pkg.py -v log-0.4.10 # get log.0.4.10 Test: get_rust_pkg.py -v lazy_static # get lazy_static-1.4.0 Change-Id: Id005a91b75c0885285a76136bd6de19d0dafa5c1
This commit is contained in:
@@ -39,6 +39,10 @@ PKG_VERSION_PATTERN = r"(.*)-([0-9]+\.[0-9]+\.[0-9]+.*)"
|
||||
|
||||
PKG_VERSION_MATCHER = re.compile(PKG_VERSION_PATTERN)
|
||||
|
||||
VERSION_PATTERN = r"([0-9]+)\.([0-9]+)\.([0-9]+)"
|
||||
|
||||
VERSION_MATCHER = re.compile(VERSION_PATTERN)
|
||||
|
||||
|
||||
def parse_args():
|
||||
"""Parse main arguments."""
|
||||
@@ -72,6 +76,20 @@ def pkg_base_name(args, name):
|
||||
return base, version
|
||||
|
||||
|
||||
def get_version_numbers(version):
|
||||
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(args, prev_version, prev_id, check_version, check_id):
|
||||
"""Return true if check_version+id is newer than prev_version+id."""
|
||||
echo(args, "checking version={} id={}".format(check_version, check_id))
|
||||
return ((get_version_numbers(check_version), check_id) >
|
||||
(get_version_numbers(prev_version), prev_id))
|
||||
|
||||
|
||||
def find_dl_path(args, name):
|
||||
"""Ask crates.io for the latest version download path."""
|
||||
base_name, version = pkg_base_name(args, name)
|
||||
@@ -79,23 +97,32 @@ def find_dl_path(args, name):
|
||||
echo(args, "get versions at {}".format(url))
|
||||
with urllib.request.urlopen(url) as request:
|
||||
data = json.loads(request.read().decode())
|
||||
versions = data["versions"]
|
||||
# version with the largest id number is assumed to be the latest
|
||||
last_id = 0
|
||||
dl_path = ""
|
||||
for v in versions:
|
||||
found_version = ""
|
||||
for v in data["versions"]:
|
||||
# Return the given version if it is found.
|
||||
if version == v["num"]:
|
||||
dl_path = v["dl_path"]
|
||||
found_version = version
|
||||
break
|
||||
if not version and int(v["id"]) > last_id:
|
||||
if version: # must find user specified version
|
||||
continue
|
||||
# Skip yanked version.
|
||||
if v["yanked"]:
|
||||
echo(args, "skip yanked version {}".format(v["num"]))
|
||||
continue
|
||||
# Remember the newest version.
|
||||
if is_newer_version(args, found_version, last_id, v["num"], int(v["id"])):
|
||||
last_id = int(v["id"])
|
||||
version = v["num"]
|
||||
found_version = v["num"]
|
||||
dl_path = v["dl_path"]
|
||||
if not dl_path:
|
||||
print("ERROR: cannot find version {} of package {}"
|
||||
.format(version, base_name))
|
||||
sys.exit(1)
|
||||
echo(args, "found download path for version {}".format(version))
|
||||
echo(args, "found download path for version {}".format(found_version))
|
||||
return dl_path
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user