9
9
10
10
import rospkg
11
11
rospack = rospkg .RosPack ()
12
+ from collections import namedtuple
12
13
13
- import copy
14
+ Dependency = namedtuple ( 'Dependency' , [ 'name' , 'req_version' , 'actual_version' , 'comparator' ])
14
15
15
16
16
17
def main () -> int :
@@ -22,21 +23,32 @@ def main() -> int:
22
23
print ("Usage: parse_package_xml_2 PACKAGE.XML" )
23
24
return 1
24
25
26
+ mismatch_found = False
25
27
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
28
32
#print("\n".join(dep))
33
+
34
+ if mismatch_found :
35
+ print ("Mismatch found in dependencies" )
36
+ else :
37
+ print ("Dependencies are consistent" )
38
+
29
39
return 0
30
40
31
41
32
- def recursive_get_deps (path : str ) -> set :
42
+ def recursive_get_deps (path : str ) -> dict :
33
43
parsed_packages = list ()
34
44
to_parse_packages = list ()
35
- deps = set ()
45
+ deps = dict ()
36
46
37
- direct_deps = packagexml_parser (path )["deps" ]
47
+ parsed_mapping = packagexml_parser (path )
48
+ direct_deps = parsed_mapping ["deps" ]
38
49
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 )
40
52
41
53
while len (to_parse_packages ) > 0 :
42
54
package = to_parse_packages .pop ()
@@ -46,16 +58,31 @@ def recursive_get_deps(path: str) -> set:
46
58
try :
47
59
dep_path = rospack .get_path (package ) + "/package.xml"
48
60
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 ]
50
63
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" ]
52
78
for dep in dep_set :
53
79
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 } " )
54
82
continue
55
83
if dep [0 ] not in to_parse_packages :
56
- # TODO check if package dep version also matches the one in the set.
57
84
to_parse_packages .append (dep [0 ])
58
- deps |= { dep }
85
+ deps [ dep [ 0 ]] = Dependency ( dep [ 0 ], dep [ 1 ], 'Problems!' , 0 )
59
86
return deps
60
87
61
88
@@ -124,7 +151,7 @@ def packagexml_parser(path: str) -> Mapping:
124
151
emails [value .text ] = value .attrib .get ("email" )
125
152
parsed ["emails" ] = emails
126
153
127
- return {"parser" : parsed , "deps" : dep_set }
154
+ return {"parser" : parsed , "deps" : dep_set , "version" : parsed [ "version" ] }
128
155
129
156
130
157
if __name__ == "__main__" :
0 commit comments