Files
git-repo-manager/depcheck/update-cargo-dependencies.py

90 lines
2.9 KiB
Python
Executable File

#!/usr/bin/env python3
import subprocess
import os
import json
import sys
import semver
import tomlkit
INDEX_DIR = "crates.io-index"
AUTOUPDATE_DISABLED = [
"clap",
]
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"].lstrip("=")
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:
if name in AUTOUPDATE_DISABLED:
print(
f"{name} {current_version}: There is a new version available "
f"({latest_version}, current {current_version}), but autoupdating "
f"is explictly disabled for {name}"
)
continue
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"] = f"={str(latest_version)}"
with open("../Cargo.toml", "w") as cargo_config:
cargo_config.write(tomlkit.dumps(cargo))
message = f"dependencies: Update {name} to {latest_version}"
subprocess.run(
["git", "commit", "--message", message, "../Cargo.toml"],
check=True,
capture_output=True
)
if update_necessary is False:
print("Everything up to date")