1
2
3
4
5
6 from __future__ import print_function
7
8 import sys
9 import yaml, urllib2
10
11 URL_PROTOTYPE="https://raw.github.com/ros/rosdistro/master/releases/%s.yaml"
12
24
25
27 return name.replace('_', '-')
28
29
34
35
36
39 self._rosdistro = rosdistro_name
40 self._targets = None
41
42 try:
43 self.repo_map = yaml.load(urllib2.urlopen(URL_PROTOTYPE % rosdistro_name))
44 except urllib2.HTTPError as ex:
45 print ("Loading distro from '%s'failed with HTTPError %s" % (URL_PROTOTYPE % rosdistro_name, ex), file=sys.stderr)
46 raise
47 if 'release-name' not in self.repo_map:
48 print("No 'release-name' key in yaml file")
49 sys.exit(1)
50 if self.repo_map['release-name'] != rosdistro_name:
51 print('release-name mismatch (%s != %s)'%(self.repo_map['release-name'],rosdistro_name))
52 sys.exit(1)
53 if 'repositories' not in self.repo_map:
54 print("No 'repositories' key in yaml file")
55 sys.exit(1)
56 self._repoinfo = {}
57 self._package_in_repo = {}
58 for name, n in self.repo_map['repositories'].items():
59 if 'url' in n.keys() and 'version' in n.keys():
60 self._repoinfo[name] = RepoMetadata(name, n['url'], n['version'])
61 if 'packages' in n.keys():
62 self._repoinfo[name].packages = n['packages']
63 for p in n['packages']:
64 self._package_in_repo[p] = name
65 else:
66 self._repoinfo[name].packages = {name: None}
67 self._package_in_repo[name] = name
68 else:
69 print("Missing required 'url' or 'version' for %s" % name)
70
73
75 return self._repoinfo.iterkeys()
76
78 return self._repoinfo.itervalues()
79
81 return self._repoinfo[name]
82
84 packages = set()
85 for repo, repo_obj in self._repoinfo.iteritems():
86 packages |= set(repo_obj.packages.keys())
87 return packages
88
90 packages = {}
91 for repo, info in self._repoinfo.iteritems():
92 for p, path in info.packages.iteritems():
93 if info.version == None:
94 print ("Skipping repo %s due to null version" % p)
95 continue
96 packages[p] = {'url': info.url,
97 'version': 'release/%s/%s' % (p, info.version),
98 'relative_path': path}
99 return packages
100
102 if package_name in self._package_in_repo:
103 return self._repoinfo[self._package_in_repo[package_name]].version
104 else:
105 return None
106
108 if stack_name in self._repoinfo.keys():
109 return self._repoinfo[stack_name].status
110 else:
111 return None
112
114 if self._targets is None:
115 self._targets = get_target_distros(self._rosdistro)
116 return self._targets
117
119 if self._targets is None:
120 self.get_target_distros()
121 if len(self._targets) == 0:
122 print("Warning no targets defined for distro %s"%self._rosdistro)
123 return None
124 return self._targets[0]
125
130
131
133
134 if version is None:
135 print ("Error version unset for %s"%local_name)
136 return None
137 config = {}
138 config['local-name'] = local_name
139
140 config['version'] = 'upstream/%s'%version
141 config['version'] = 'debian/ros-%s-%s_%s_%s'%(self._rosdistro, local_name, version, distro_name)
142
143 config['uri'] = gbp_url
144 return {'git': config}
145
146
148 rosinstall_data = [self.compute_rosinstall_snippet(name, r['url'], r['version'], rosdistro) for name, r in self.repo_map['repositories'].items() if 'url' in r and 'version' in r]
149 return rosinstall_data
150
151
152
154 print("Fetching " + URL_PROTOTYPE%'targets')
155 targets_map = yaml.load(urllib2.urlopen(URL_PROTOTYPE%'targets'))
156 my_targets = [x for x in targets_map if rosdistro in x]
157 if len(my_targets) != 1:
158 print("Must have exactly one entry for rosdistro %s in targets.yaml"%(rosdistro))
159 sys.exit(1)
160 return my_targets[0][rosdistro]
161