From cb80bda808a76219bb59c17454fc1357ad831b5e Mon Sep 17 00:00:00 2001 From: UK992 Date: Tue, 7 Mar 2017 23:18:33 +0100 Subject: [PATCH] Add `--dry-run` argument to `mach cargo-update` --- python/servo/devenv_commands.py | 71 +++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/python/servo/devenv_commands.py b/python/servo/devenv_commands.py index 56f02b1cb55d..a3e14bee6525 100644 --- a/python/servo/devenv_commands.py +++ b/python/servo/devenv_commands.py @@ -71,8 +71,11 @@ def cargo_geckolib(self, params): @CommandArgument( '--all-packages', '-a', action='store_true', help='Updates all packages') - def cargo_update(self, params=None, package=None, all_packages=None): - self.update_cargo(params, package, all_packages) + @CommandArgument( + '--dry-run', '-d', action='store_true', + help='Show outdated packages.') + def cargo_update(self, params=None, package=None, all_packages=None, dry_run=None): + self.update_cargo(params, package, all_packages, dry_run) @Command('update-cargo', description='Update Cargo dependencies', @@ -88,11 +91,62 @@ def cargo_update(self, params=None, package=None, all_packages=None): help='Updates all packages. NOTE! This is very likely to break your ' + 'working copy, making it impossible to build servo. Only do ' + 'this if you really know what you are doing.') - def update_cargo(self, params=None, package=None, all_packages=None): + @CommandArgument( + '--dry-run', '-d', action='store_true', + help='Show outdated packages.') + def update_cargo(self, params=None, package=None, all_packages=None, dry_run=None): if not params: params = [] - if package: + if dry_run: + import toml + import json + import httplib + import colorama + + cargo_file = open(path.join(self.context.topdir, "Cargo.lock")) + content = toml.load(cargo_file) + + packages = {} + outdated_packages = 0 + conn = httplib.HTTPSConnection("crates.io") + for package in content.get("package", []): + if "replace" in package: + continue + source = package.get("source", "") + if source == r"registry+https://github.com/rust-lang/crates.io-index": + version = package["version"] + name = package["name"] + if not packages.get(name, "") or packages[name] > version: + packages[name] = package["version"] + conn.request('GET', '/api/v1/crates/{}/versions'.format(package["name"])) + r = conn.getresponse() + json_content = json.load(r) + for v in json_content.get("versions"): + if not v.get("yanked"): + max_version = v.get("num") + break + + if version != max_version: + outdated_packages += 1 + version_major, version_minor = (version.split("."))[:2] + max_major, max_minor = (max_version.split("."))[:2] + + if version_major == max_major and version_minor == max_minor and "alpha" not in version: + msg = "minor update" + msg_color = "\033[93m" + else: + msg = "update, which may contain breaking changes" + msg_color = "\033[91m" + + colorama.init() + print("{}Outdated package `{}`, available {}\033[0m".format(msg_color, name, msg), + "\n\tCurrent version: {}".format(version), + "\n\t Latest version: {}".format(max_version)) + conn.close() + + print("\nFound {} outdated packages from crates.io".format(outdated_packages)) + elif package: params += ["-p", package] elif all_packages: params = [] @@ -101,11 +155,12 @@ def update_cargo(self, params=None, package=None, all_packages=None): print("flag or update all packages with --all-packages (-a) flag") sys.exit(1) - self.ensure_bootstrapped() + if params or all_packages: + self.ensure_bootstrapped() - with cd(self.context.topdir): - call(["cargo", "update"] + params, - env=self.build_env()) + with cd(self.context.topdir): + call(["cargo", "update"] + params, + env=self.build_env()) @Command('rustc', description='Run the Rust compiler',