def get_upstream_meta(upstream_dir, ros_distro): meta = None directory = os.getcwd() with change_directory(upstream_dir): if get_root() is not None: # If in a git repo current_branch = get_current_branch() else: current_branch = None name, version, packages = get_package_data(current_branch, quiet=False, release_directory=directory) meta = {'name': name, 'version': version, 'type': 'package.xml'} return meta
def detect_branches(self): self.packages = None with inbranch(self.src): if self.name is not None: self.packages = [self.name] return [self.name] name, version, packages = get_package_data(self.src) self.packages = packages # Check meta packages for valid CMakeLists.txt if isinstance(self.packages, dict): for path, pkg in self.packages.iteritems(): # Check for valid CMakeLists.txt if a metapackage self.metapackage_check(path, pkg) return name if type(name) is list else [name]
def get_upstream_meta(upstream_dir, ros_distro): meta = None with change_directory(upstream_dir): if get_root() is not None: # If in a git repo current_branch = get_current_branch() else: current_branch = None name, version, packages = get_package_data(current_branch, quiet=False) meta = { 'name': name, 'version': version, 'type': 'package.xml' } return meta
def post_patch(self, destination): # Figure out the version of the given package if self.name is not None: warning("""\ Cannot automatically tag the release because this is not a catkin project.""") warning("""\ Please checkout the release branch and then create a tag manually with:""") warning(" git checkout release/" + str(self.name)) warning(" git tag -f release/" + str(self.name) + "/<version>") return with inbranch(destination): name, version, packages = get_package_data(destination) # Execute git tag release_tag = destination + '/' + version + '-' + self.release_inc execute_command('git tag ' + release_tag)
def get_package_from_branch(branch): with inbranch(branch): try: package_data = get_package_data(branch) except SystemExit: return None if type(package_data) not in [list, tuple]: # It is a ret code RpmGenerator.exit(package_data) names, version, packages = package_data if type(names) is list and len(names) > 1: RpmGenerator.exit("RPM generator does not support generating " "from branches with multiple packages in them, use " "the release generator first to split packages into " "individual branches.") if type(packages) is dict: return list(packages.values())[0]
def get_package_from_branch(branch): with inbranch(branch): try: package_data = get_package_data(branch) except SystemExit: return None if type(package_data) not in [list, tuple]: # It is a ret code RpmGenerator.exit(package_data) names, version, packages = package_data if type(names) is list and len(names) > 1: RpmGenerator.exit( "RPM generator does not support generating " "from branches with multiple packages in them, use " "the release generator first to split packages into " "individual branches.") if type(packages) is dict: return list(packages.values())[0]
def match_branches_with_prefix(prefix, get_branches, prune=False): debug("match_branches_with_prefix(" + str(prefix) + ", " + str(get_branches()) + ")") branches = [] # Match branches existing_branches = get_branches() for branch in existing_branches: if branch.startswith('remotes/origin/'): branch = branch.split('/', 2)[-1] if branch.startswith(prefix): branches.append(branch) branches = list(set(branches)) if prune: # Prune listed branches by packages in latest upstream with inbranch('upstream'): pkg_names, version, pkgs_dict = get_package_data('upstream') for branch in branches: if branch.split(prefix)[-1].strip('/') not in pkg_names: branches.remove(branch) return branches
def get_packages(): with inbranch('upstream'): _, _, packages = get_package_data('upstream') return packages
def get_packages(): with inbranch("upstream"): _, _, packages = get_package_data("upstream") return packages
def import_upstream(tarball_path, patches_path, version, name, replace): # Check for a url and download it url = urlparse(tarball_path) if url.scheme: # Some scheme like http, https, or file... tmp_dir = tempfile.mkdtemp() try: info("Fetching file from url: '{0}'".format(tarball_path)) req = load_url_to_file_handle(tarball_path) tarball_path = os.path.join(tmp_dir, os.path.basename(url.path)) with open(tarball_path, 'wb') as f: chunk_size = 16 * 1024 while True: chunk = req.read(chunk_size) if not chunk: break f.write(chunk) return import_upstream(tarball_path, patches_path, version, name, replace) finally: shutil.rmtree(tmp_dir) # If there is not tarball at the given path, fail if not os.path.exists(tarball_path): error("Specified archive does not exists: '{0}'".format(tarball_path), exit=True) # If either version or name are not provided, guess from archive name if not version or not name: # Parse tarball name tarball_file = os.path.basename(tarball_path) ending = None if tarball_file.endswith('.tar.gz'): ending = '.tar.gz' elif tarball_file.endswith('.zip'): ending = '.zip' else: error("Cannot detect type of archive: '{0}'" .format(tarball_file), exit=True) tarball_file = tarball_file[:-len(ending)] split_tarball_file = tarball_file.split('-') if len(split_tarball_file) < 2 and not version or len(split_tarball_file) < 1: error("Cannot detect name and/or version from archive: '{0}'" .format(tarball_file), exit=True) if not name and len(split_tarball_file) == 1: name = split_tarball_file[0] elif not name and len(split_tarball_file) == 1: name = '-'.join(split_tarball_file[:-1]) if not version and len(split_tarball_file) < 2: error("Cannot detect version from archive: '{0}'" .format(tarball_file) + " and the version was not spcified.", exit=True) version = version if version else split_tarball_file[-1] # Check if the patches_path (if given) exists patches_path_dict = None if patches_path: patches_path_dict = ls_tree(BLOOM_CONFIG_BRANCH, patches_path) if not patches_path_dict: error("Given patches path '{0}' does not exist in bloom branch." .format(patches_path), exit=True) # Do version checking version_check(version) # Check for existing tags upstream_tag = 'upstream/{0}'.format(version) if tag_exists(upstream_tag): if not replace: error("Tag '{0}' already exists, use --replace to override it." .format(upstream_tag), exit=True) warning("Removing tag: '{0}'".format(upstream_tag)) delete_tag(upstream_tag) if not get_git_clone_state(): delete_remote_tag(upstream_tag) name_tag = '{0}/{1}'.format(name or 'upstream', version) if name_tag != upstream_tag and tag_exists(name_tag): if not replace: error("Tag '{0}' already exists, use --replace to override it." .format(name_tag), exit=True) warning("Removing tag: '{0}'".format(name_tag)) delete_tag(name_tag) if not get_git_clone_state(): delete_remote_tag(name_tag) # If there is not upstream branch, create one if not branch_exists('upstream'): info("Creating upstream branch.") create_branch('upstream', orphaned=True) else: track_branches(['upstream']) # Import the given tarball info("Importing archive into upstream branch...") import_tarball(tarball_path, 'upstream', version, name) # Handle patches_path if patches_path: import_patches(patches_path, patches_path_dict, 'upstream', version) # Create tags with inbranch('upstream'): # Assert packages in upstream are the correct version _, actual_version, _ = get_package_data('upstream') if actual_version != version: error("The package(s) in upstream are version '{0}', but the version to be released is '{1}', aborting." .format(actual_version, version), exit=True) # Create the tag info("Creating tag: '{0}'".format(upstream_tag)) create_tag(upstream_tag) if name_tag != upstream_tag: info("Creating tag: '{0}'".format(name_tag)) create_tag(name_tag)
def test_get_package_data_fails_on_uppercase(): with AssertRaisesContext(SystemExit, "Invalid package names, aborting."): with redirected_stdio(): get_package_data(directory=test_data_dir)