99
1010import rospkg
1111rospack = rospkg .RosPack ()
12+ from collections import namedtuple
1213
13- import copy
14+ Dependency = namedtuple ( 'Dependency' , [ 'name' , 'req_version' , 'actual_version' , 'comparator' ])
1415
1516
1617def 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
130157if __name__ == "__main__" :
0 commit comments