107 lines
3.2 KiB
Python
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()
|