From e2db935c746ae1cacffb52fc7dd279b051bbb346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Wed, 24 Nov 2021 17:24:42 +0100 Subject: [PATCH] Add script to update cargo dependencies --- Justfile | 7 +++ depcheck/.gitignore | 2 + depcheck/requirements.txt | 2 + depcheck/update-cargo-dependencies.py | 74 +++++++++++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 depcheck/.gitignore create mode 100644 depcheck/requirements.txt create mode 100755 depcheck/update-cargo-dependencies.py diff --git a/Justfile b/Justfile index 61570e1..d090239 100644 --- a/Justfile +++ b/Justfile @@ -14,3 +14,10 @@ install: test: cargo test --lib --bins + +update-dependencies: + @cd ./depcheck \ + && python3 -m venv ./venv \ + && . ./venv/bin/activate \ + && pip --disable-pip-version-check install -r ./requirements.txt > /dev/null \ + && ./update-cargo-dependencies.py diff --git a/depcheck/.gitignore b/depcheck/.gitignore new file mode 100644 index 0000000..a5a712b --- /dev/null +++ b/depcheck/.gitignore @@ -0,0 +1,2 @@ +/crates.io-index/ +/venv/ diff --git a/depcheck/requirements.txt b/depcheck/requirements.txt new file mode 100644 index 0000000..3116c35 --- /dev/null +++ b/depcheck/requirements.txt @@ -0,0 +1,2 @@ +semver==2.13.0 +tomlkit==0.7.2 diff --git a/depcheck/update-cargo-dependencies.py b/depcheck/update-cargo-dependencies.py new file mode 100755 index 0000000..31cc166 --- /dev/null +++ b/depcheck/update-cargo-dependencies.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 + +import subprocess +import os +import json +import sys + +import semver +import tomlkit + +INDEX_DIR = "crates.io-index" + +if os.path.exists(INDEX_DIR): + subprocess.run( + ["git", "pull", "--depth=1", "origin"], + cwd=INDEX_DIR, + check=True, + capture_output=True, + ) +else: + subprocess.run( + ["git", "clone", "--depth=1", "https://github.com/rust-lang/crates.io-index"], + check=True, + capture_output=False, # to get some git output + ) + +with open("../Cargo.toml", "r") as cargo_config: + cargo = tomlkit.parse(cargo_config.read()) + +update_necessary = False + +for tier in ["dependencies", "dev-dependencies"]: + for name, dependency in cargo[tier].items(): + version = dependency["version"] + if len(name) >= 4: + info_file = f"{INDEX_DIR}/{name[0:2]}/{name[2:4]}/{name}" + elif len(name) == 3: + info_file = f"{INDEX_DIR}/3/{name[0]}/{name}" + elif len(name) == 2: + info_file = f"{INDEX_DIR}/2/{name}" + elif len(name) == 1: + info_file = f"{INDEX_DIR}/1/{name}" + + current_version = semver.VersionInfo.parse(version) + + latest_version = None + for version_entry in open(info_file, "r").readlines(): + version = semver.VersionInfo.parse(json.loads(version_entry)["vers"]) + if current_version.prerelease == "" and version.prerelease != "": + # skip prereleases, except when we are on a prerelease already + continue + if latest_version is None or version > latest_version: + latest_version = version + + if latest_version != current_version: + update_necessary = True + if latest_version < current_version: + print( + f"{name}: Your current version is newer than the newest version on crates.io, the hell?" + ) + else: + print( + f"{name}: New version found: {latest_version} (current {current_version})" + ) + cargo[tier][name]["version"] = str(latest_version) + + +if update_necessary is True: + with open("../Cargo.toml", "w") as cargo_config: + cargo_config.write(tomlkit.dumps(cargo)) + sys.exit(1) +else: + print("Everything up to date") + sys.exit(0)