1 import os
2
3 MANIFEST_FILE = 'manifest.xml'
4 PACKAGE_FILE = 'package.xml'
5
6 try:
7 from catkin_pkg.package import parse_package
8 CATKIN_SUPPORTED = True
9 except ImportError:
10 CATKIN_SUPPORTED = False
11
12 PACKAGE_CACHE = {}
13
15 '''
16 Returns the ROS HOME depending on ROS distribution API.
17 @return: ROS HOME path
18 @rtype: C{str}
19 '''
20 try:
21 import rospkg.distro
22 distro = rospkg.distro.current_distro_codename()
23 if distro in ['electric', 'diamondback', 'cturtle']:
24 import roslib.rosenv
25 return roslib.rosenv.get_ros_home()
26 else:
27 import rospkg
28 return rospkg.get_ros_home()
29 except:
30
31
32 import roslib.rosenv
33 return roslib.rosenv.get_ros_home()
34
35
37 '''
38 Returns the master URI depending on ROS distribution API.
39 @return: ROS master URI
40 @rtype: C{str}
41 '''
42 try:
43 import rospkg.distro
44 distro = rospkg.distro.current_distro_codename()
45 if distro in ['electric', 'diamondback', 'cturtle']:
46 import roslib.rosenv
47 return roslib.rosenv.get_master_uri()
48 else:
49 import rosgraph
50 return rosgraph.rosenv.get_master_uri()
51 except:
52 return os.environ['ROS_MASTER_URI']
53
55 result = {}
56 if os.path.isdir(path):
57 fileList = os.listdir(path)
58 if MANIFEST_FILE in fileList:
59 return {os.path.basename(path) : path}
60 if CATKIN_SUPPORTED and PACKAGE_FILE in fileList:
61 try:
62 pkg = parse_package(path)
63 return {pkg.name : path}
64 except:
65 pass
66 return {}
67 for f in fileList:
68 ret = get_packages(os.path.join(path, f))
69 result = dict(ret.items() + result.items())
70 return result
71
73 '''
74 Returns for given directory a tuple of package name and package path or None values.
75 The results are cached!
76 @rtype: C{(name, path)}
77 '''
78 if not (dir is None) and dir and dir != os.path.sep and os.path.isdir(dir):
79 if PACKAGE_CACHE.has_key(dir):
80 return PACKAGE_CACHE[dir]
81 package = os.path.basename(dir)
82 fileList = os.listdir(dir)
83 for file in fileList:
84 if file == MANIFEST_FILE:
85 PACKAGE_CACHE[dir] = (package, dir)
86 return (package, dir)
87 if CATKIN_SUPPORTED and file == PACKAGE_FILE:
88 try:
89 pkg = parse_package(os.path.join(dir, file))
90 PACKAGE_CACHE[dir] = (pkg.name, dir)
91 return (pkg.name, dir)
92 except:
93 return (None,None)
94 PACKAGE_CACHE[dir] = package_name(os.path.dirname(dir))
95 return PACKAGE_CACHE[dir]
96 return (None, None)
97
100