Merge "Skip yanked packages and use newest version number."
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)
|
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():
|
def parse_args():
|
||||||
"""Parse main arguments."""
|
"""Parse main arguments."""
|
||||||
@@ -72,6 +76,20 @@ def pkg_base_name(args, name):
|
|||||||
return base, version
|
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):
|
def find_dl_path(args, name):
|
||||||
"""Ask crates.io for the latest version download path."""
|
"""Ask crates.io for the latest version download path."""
|
||||||
base_name, version = pkg_base_name(args, name)
|
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))
|
echo(args, "get versions at {}".format(url))
|
||||||
with urllib.request.urlopen(url) as request:
|
with urllib.request.urlopen(url) as request:
|
||||||
data = json.loads(request.read().decode())
|
data = json.loads(request.read().decode())
|
||||||
versions = data["versions"]
|
|
||||||
# version with the largest id number is assumed to be the latest
|
# version with the largest id number is assumed to be the latest
|
||||||
last_id = 0
|
last_id = 0
|
||||||
dl_path = ""
|
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"]:
|
if version == v["num"]:
|
||||||
dl_path = v["dl_path"]
|
dl_path = v["dl_path"]
|
||||||
|
found_version = version
|
||||||
break
|
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"])
|
last_id = int(v["id"])
|
||||||
version = v["num"]
|
found_version = v["num"]
|
||||||
dl_path = v["dl_path"]
|
dl_path = v["dl_path"]
|
||||||
if not dl_path:
|
if not dl_path:
|
||||||
print("ERROR: cannot find version {} of package {}"
|
print("ERROR: cannot find version {} of package {}"
|
||||||
.format(version, base_name))
|
.format(version, base_name))
|
||||||
sys.exit(1)
|
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
|
return dl_path
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user