-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
utils/dependency_cross_matcher.py: Add dependency cross matching
* Add a script to check for mismatches in dependencies in the repository. Mismatches are two different versions of the same dependency. Signed-off-by: Tomás González <[email protected]>
- Loading branch information
1 parent
86ff1f9
commit 3126913
Showing
1 changed file
with
75 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
import argparse | ||
import re | ||
import os | ||
import subprocess | ||
import sys | ||
|
||
|
||
def run_cargo_tree(path): | ||
cmd = 'cargo tree --all-features -d' | ||
prev_dir = os.getcwd() | ||
os.chdir(os.path.join(path)) | ||
return subprocess.check_output(cmd, shell=True).decode() | ||
|
||
|
||
def run_deps_mismatcher(lines): | ||
pat = re.compile('([a-zA-Z]\S+)\s(v\S+)') | ||
deps = dict() | ||
for line in lines.split('\n'): | ||
m = pat.search(line) | ||
if m is not None: | ||
if m.group(1) in deps.keys(): | ||
if m.group(2) not in deps[m.group(1)]: | ||
deps[m.group(1)].append(m.group(2)) | ||
else: | ||
deps[m.group(1)] = [m.group(2)] | ||
return deps | ||
|
||
|
||
def get_deps_with_more_than_1v(deps_and_versions): | ||
new_dict = dict() | ||
for dep_name, versions in deps_and_versions.items(): | ||
if len(versions) > 1: | ||
new_dict[dep_name] = versions | ||
return new_dict | ||
|
||
|
||
def print_deps(deps_and_versions): | ||
for dep_name, versions in deps_and_versions.items(): | ||
print(f"{dep_name:<25} {versions}") | ||
|
||
|
||
def main(argv=[], prog_name=''): | ||
parser = argparse.ArgumentParser(prog='DependencyCrossmatcher', | ||
description='Checks the version mismatches for dependencies ' | ||
'in Cargo based repositories') | ||
parser.add_argument('--deps_dir', | ||
required=True, | ||
help='Existing directory that contains the Cargo.toml for analyzing' | ||
'dependencies') | ||
args = parser.parse_args() | ||
|
||
mismatches = run_deps_mismatcher(run_cargo_tree(args.deps_dir)) | ||
print_deps(mismatches) | ||
|
||
mismatches = get_deps_with_more_than_1v(mismatches) | ||
|
||
print('---------------------mistmatches----------------------\n\n') | ||
print_deps(mismatches) | ||
|
||
exceptions = { | ||
'base64': ['v0.13.1', 'v0.21.4'], | ||
'bitflags': ['v1.3.2', 'v2.4.1'], | ||
'nom': ['v5.1.3', 'v7.1.3'], | ||
'syn': ['v1.0.109', 'v2.0.38'], | ||
'yasna': ['v0.4.0', 'v0.5.2'], | ||
} | ||
|
||
if exceptions != mismatches: | ||
return 1 | ||
|
||
return 0 | ||
|
||
|
||
if __name__ == '__main__': | ||
sys.exit(main(sys.argv[1:], sys.argv[0])) |