in src/buildstream_plugins/sources/cargo.py [0:0]
def track(self, *, previous_sources_dir):
new_ref = []
lockfile = os.path.join(previous_sources_dir, self.cargo_lock)
try:
with open(lockfile, "rb") as f:
try:
lock = tomllib.load(f)
except tomllib.TOMLDecodeError as e:
raise SourceError(
"Malformed Cargo.lock file at: {}".format(self.cargo_lock),
detail="{}".format(e),
) from e
except FileNotFoundError as e:
raise SourceError(
"Failed to find Cargo.lock file at: {}".format(self.cargo_lock),
detail="The cargo plugin expects to find a Cargo.lock file in\n"
+ "the sources staged before it in the source list, but none was found.",
) from e
# FIXME: Better validation would be good here, so we can raise more
# useful error messages in the case of a malformed Cargo.lock file.
#
for package in lock["package"]:
if "source" not in package:
continue
new_ref += [{"name": package["name"], "version": str(package["version"]), "sha": package.get("checksum")}]
# Make sure the order we set it at track time is deterministic
new_ref = sorted(new_ref, key=lambda c: (c["name"], c["version"]))
# Download the crates and get their shas
for crate_obj in new_ref:
if crate_obj["sha"] is not None:
continue
crate = Crate(self, crate_obj["name"], crate_obj["version"])
crate_url = crate._get_url()
with self.timed_activity("Downloading: {}".format(crate_url), silent_nested=True):
crate_obj["sha"] = crate._download(crate_url)
return new_ref