Files
librsvg/ci/check_crate_versions_in_example.py

107 lines
3.2 KiB
Python

# Checks that the example Cargo.toml snippet from rsvg/src/lib.rs has the same versions for
# dependencies that librsvg uses during compilation.
import sys
import toml
# Looks for a crate version in the 'dependencies' section of a TOML document, either of these:
#
# [dependencies]
# foo = "1.2.3"
# bar = { version = "4.5.6", features=["something", "else", "here"]
def get_crate_version(toml_doc, crate_name):
if 'dependencies' in toml_doc:
crate_decl = toml_doc['dependencies'][crate_name]
else:
crate_decl = toml_doc['workspace']['dependencies'][crate_name]
if isinstance(crate_decl, str):
version = crate_decl
else:
version = crate_decl['version']
return version
# Given a Rust file that has a toplevel comment somewhere like
#
# //! ```toml
# //! [dependencies]
# //! librsvg = "2.57.0-beta.2"
# //! cairo-rs = "0.18"
# //! gio = "0.18" # only if you need streams
# //! ```
#
# extracts just the TOML as a string, without the //! prefix.
def find_toml_in_rust_toplevel_docs(lines):
found_start = False
start_index = 0
end_index = 0
for (i, line) in enumerate(lines):
if not found_start and line.startswith('//! ```toml'):
found_start = True
start_index = i
end_index = i
elif found_start and line.startswith('//! ```'):
end_index = i
break
if not found_start:
raise Exception(
"did not find start of ```toml block in the toplevel documentation comments"
)
snippet = lines[(start_index + 1):end_index]
without_comment = [s.removeprefix('//! ') for s in snippet]
return "".join(without_comment)
def check_dependency_version(cargo_toml_filename, cargo_toml, other_filename, other_toml,
dependency_name):
dep_in_cargo_toml = get_crate_version(cargo_toml, dependency_name)
dep_in_other = get_crate_version(other_toml, dependency_name)
if dep_in_cargo_toml != dep_in_other:
raise Exception(
f"""{dependency_name} version in {cargo_toml_filename} is {dep_in_cargo_toml} but
is referenced in {other_filename} as {dep_in_other}"""
)
def check():
cargo_toml = toml.load('rsvg/Cargo.toml')
librsvg_version = cargo_toml['package']['version']
example_file = open('rsvg/src/lib.rs')
example_contents = example_file.readlines()
example_toml_str = find_toml_in_rust_toplevel_docs(example_contents)
example_toml = toml.loads(example_toml_str)
example_version = get_crate_version(example_toml, 'librsvg')
if librsvg_version != example_version:
raise Exception(
f"""librsvg version in rsvg/Cargo.toml is {librsvg_version} but is referenced as
{example_version} in rsvg/src/lib.rs"""
)
DEPENDENCIES = [
'cairo-rs',
'gio',
]
cargo_toml = toml.load('Cargo.toml')
for dependency_name in DEPENDENCIES:
check_dependency_version(
'Cargo.toml',
cargo_toml,
'rsvg/src/lib.rs',
example_toml,
dependency_name
)
print("Dependency versions match in rsvg/src/lib.rs. All good!", file=sys.stderr)
if __name__ == '__main__':
check()