Skip to content

Commit 66c2d16

Browse files
PetervDoorenar13pit
authored andcommitted
add named tuple as datatype
1 parent 72508f2 commit 66c2d16

File tree

1 file changed

+39
-12
lines changed

1 file changed

+39
-12
lines changed

installer/parse_package_xml_2.py

+39-12
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99

1010
import rospkg
1111
rospack = rospkg.RosPack()
12+
from collections import namedtuple
1213

13-
import copy
14+
Dependency = namedtuple('Dependency', ['name', 'req_version', 'actual_version', 'comparator'])
1415

1516

1617
def main() -> int:
@@ -22,21 +23,32 @@ def main() -> int:
2223
print("Usage: parse_package_xml_2 PACKAGE.XML")
2324
return 1
2425

26+
mismatch_found = False
2527
deps = recursive_get_deps(sys.argv[1])
26-
for dep in deps:
27-
print(f"Dependency on {dep[0]} with version {dep[1]}")
28+
for key, value in deps.items():
29+
if value.req_version != "None" and value.req_version != value.actual_version:
30+
print(f"Package {value.name}, current version {value.actual_version}, required version {value.req_version}")
31+
mismatch_found = True
2832
#print("\n".join(dep))
33+
34+
if mismatch_found:
35+
print("Mismatch found in dependencies")
36+
else:
37+
print("Dependencies are consistent")
38+
2939
return 0
3040

3141

32-
def recursive_get_deps(path: str) -> set:
42+
def recursive_get_deps(path: str) -> dict:
3343
parsed_packages = list()
3444
to_parse_packages = list()
35-
deps = set()
45+
deps = dict()
3646

37-
direct_deps = packagexml_parser(path)["deps"]
47+
parsed_mapping = packagexml_parser(path)
48+
direct_deps = parsed_mapping["deps"]
3849
to_parse_packages.extend([dep[0] for dep in direct_deps])
39-
deps |= direct_deps
50+
for dep in direct_deps:
51+
deps[dep[0]] = Dependency(dep[0], dep[1], '0.0.0', 0)
4052

4153
while len(to_parse_packages) > 0:
4254
package = to_parse_packages.pop()
@@ -46,16 +58,31 @@ def recursive_get_deps(path: str) -> set:
4658
try:
4759
dep_path = rospack.get_path(package) + "/package.xml"
4860
except rospkg.common.ResourceNotFound:
49-
print(f"could not find {package}")
61+
#print(f"could not find {package}, assuming not a ros package")
62+
del deps[package]
5063
continue
51-
dep_set = packagexml_parser(dep_path)["deps"]
64+
65+
parsed_mapping = packagexml_parser(dep_path)
66+
# register current version
67+
version_set = parsed_mapping["version"]
68+
if len(version_set) != 1:
69+
print(f"Package {package} should have 1 version, instead its version is {version_set}")
70+
raise Exception #TODO better exception
71+
# update actual version
72+
deps[package] = Dependency(deps[package].name,
73+
deps[package].req_version,
74+
list(version_set)[0],
75+
deps[package].comparator)
76+
77+
dep_set = parsed_mapping["deps"]
5278
for dep in dep_set:
5379
if dep[0] in parsed_packages:
80+
if dep[0] in deps and deps[dep[0]].req_version != dep[1]:
81+
print(f"inconsistent dependency. According to package {package}, package {dep[0]} should have version {dep[1]}, but another package requires {deps[dep[0]].req_version}")
5482
continue
5583
if dep[0] not in to_parse_packages:
56-
# TODO check if package dep version also matches the one in the set.
5784
to_parse_packages.append(dep[0])
58-
deps |= {dep}
85+
deps[dep[0]] = Dependency(dep[0], dep[1], 'Problems!', 0)
5986
return deps
6087

6188

@@ -124,7 +151,7 @@ def packagexml_parser(path: str) -> Mapping:
124151
emails[value.text] = value.attrib.get("email")
125152
parsed["emails"] = emails
126153

127-
return {"parser": parsed, "deps": dep_set}
154+
return {"parser": parsed, "deps": dep_set, "version": parsed["version"]}
128155

129156

130157
if __name__ == "__main__":

0 commit comments

Comments
 (0)