Package rosdeb :: Module rosdistro
[frames] | no frames]

Source Code for Module rosdeb.rosdistro

  1  #!/usr/bin/env python 
  2    
  3  #COPIED FROM catkin-debs needs to be modularized and released 
  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   
13 -class RepoMetadata(object):
14 - def __init__(self, name, url, version, packages = {}, status = None):
15 self.name = name 16 self.url = url 17 self.full_version = version 18 if version: 19 self.version = version.split('-')[0] 20 else: 21 self.version = None 22 self.status = status 23 self.packages = packages
24 25
26 -def sanitize_package_name(name):
27 return name.replace('_', '-')
28 29
30 -def debianize_package_name(rosdistro, name):
31 if rosdistro == 'backports': 32 return sanitize_package_name(name) 33 return sanitize_package_name("ros-%s-%s"%(rosdistro, name))
34 35 36 # todo raise not exit
37 -class Rosdistro:
38 - def __init__(self, rosdistro_name):
39 self._rosdistro = rosdistro_name 40 self._targets = None 41 # avaliable for backwards compatability 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
71 - def debianize_package_name(self, package_name):
72 return debianize_package_name(self._rosdistro, package_name)
73
74 - def get_repo_list(self):
75 return self._repoinfo.iterkeys()
76
77 - def get_repos(self):
78 return self._repoinfo.itervalues()
79
80 - def get_repo(self, name):
81 return self._repoinfo[name]
82
83 - def get_package_list(self):
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
101 - def get_version(self, package_name):
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
107 - def get_status(self, stack_name):
108 if stack_name in self._repoinfo.keys(): 109 return self._repoinfo[stack_name].status 110 else: 111 return None
112
113 - def get_target_distros(self):
114 if self._targets is None: # Different than empty list 115 self._targets = get_target_distros(self._rosdistro) 116 return self._targets
117
118 - def get_default_target(self):
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
126 - def get_stack_rosinstall_snippet(self, distro = None):
127 if not distro: 128 distro = self.get_default_target() 129 raise NotImplemented
130 131
132 - def compute_rosinstall_snippet(self, local_name, gbp_url, version, distro_name):
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 #config['version'] = '%s-%s'%(local_name, version) 143 config['uri'] = gbp_url 144 return {'git': config}
145 146
147 - def compute_rosinstall_distro(self, rosdistro, distro_name):
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
153 -def get_target_distros(rosdistro):
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