def test_create_specified(self): """Test making a directory in a legal location""" tmp = mkdtemp() os.chmod(tmp, 17407) with TempfileManager('%s/test' % tmp) as ret: self.assertEqual(ret, '%s/test' % tmp) # clean up self.assertTrue(os.path.exists('%s/test' % tmp)) shutil.rmtree('%s' % tmp)
def test_mkdir(self): """Tests the make directory function""" with TempfileManager(None) as temp_dir: created = '%s/test' % temp_dir make_dir(created) self.assertTrue(os.path.isdir(created)) # try and create the directory again, should pass make_dir(created) self.assertTrue(os.path.isdir(created))
def test_cleanup(self): """Test PR dry run cleanup""" # should pass clean_up() # should remove files with TempfileManager(None) as tempdir: with open('%s/.pr-message.tmp' % tempdir, 'w') as msg_file: msg_file.write("message") with open('%s/.pr-title.tmp' % tempdir, 'w') as title_file: title_file.write("title") os.chdir(tempdir) clean_up() self.assertFalse(os.path.exists('%s/.pr-message.tmp' % tempdir)) self.assertFalse(os.path.exists('%s/.pr-title.tmp' % tempdir))
def test_CacheFile(self): """Test the CacheManager""" with TempfileManager(None) as tmp: os.chmod(tmp, 17407) cache_file = '%s/my_cache.pickle' % tmp with CacheManager(cache_file) as cache: cache['a'] = 'A' cache['b'] = 'B' cache['c'] = 'C' with CacheManager(cache_file) as cache: self.assertEqual(cache['a'], 'A') self.assertEqual(cache['b'], 'B') self.assertEqual(cache['c'], 'C') self.assertTrue(os.path.exists(cache_file))
def run(self, rm=True, show_cmd=False, privileged=False, log_file=None): if log_file: # get the location to store the log log_path = os.path.dirname(log_file) # get the file name log_name = log_file.replace(log_path, '').lstrip('/') else: log_path = None log_name = 'log.txt' with TempfileManager(log_path) as tmp: if log_file: # change access to the directory so docker can read it os.chmod(tmp, 17407) # map into the container self.map_directory(tmp) cmd_string = self.get_command(tmp, log_name) if show_cmd: msg = "Running container with command string '%s'..." info(msg % cmd_string) try: self.client.containers.run( image=self.image, remove=rm, command=cmd_string, privileged=privileged, volumes=self.directory_map, ) ok("Docker container exited.") if log_file: info("Log file: '%s/%s'" % (tmp, log_name)) except docker.errors.ContainerError: err("Docker container exited with errors.") if log_file: info("Log file: '%s/%s'" % (tmp, log_name)) # save log, then raise. with open('%s/%s' % (tmp, log_name), 'r') as logfile: self.log = logfile.read() raise with open('%s/%s' % (tmp, log_name), 'r') as logfile: self.log = logfile.read()
def main(): overlay = None preserve_existing = True parser = get_parser('Deploy ROS packages into Gentoo Linux') args = parser.parse_args(sys.argv[1:]) pr_comment = args.pr_comment skip_keys = args.skip_keys or [] selected_targets = None if not args.dry_run: if 'SUPERFLORE_GITHUB_TOKEN' not in os.environ: raise NoGitHubAuthToken() if args.pr_only: if args.dry_run: parser.error('Invalid args! cannot dry-run and file PR') if not args.output_repository_path: parser.error('Invalid args! no repository specified') try: prev_overlay = RepoInstance(args.output_repository_path, False) msg, title = load_pr() prev_overlay.pull_request(msg, title=title) clean_up() sys.exit(0) except Exception as e: err('Failed to file PR!') err('reason: {0}'.format(e)) sys.exit(1) elif args.all: warn('"All" mode detected... This may take a while!') preserve_existing = False elif args.ros_distro: warn('"{0}" distro detected...'.format(args.ros_distro)) selected_targets = [args.ros_distro] preserve_existing = False elif args.only: parser.error('Invalid args! --only requires specifying --ros-distro') if not selected_targets: selected_targets = get_distros_by_status('active') repo_org = 'ros' repo_name = 'ros-overlay' if args.upstream_repo: repo_org, repo_name = url_to_repo_org(args.upstream_repo) with TempfileManager(args.output_repository_path) as _repo: if not args.output_repository_path: # give our group write permissions to the temp dir os.chmod(_repo, 17407) # clone if args.output_repository_path is None overlay = RosOverlay( _repo, not args.output_repository_path, org=repo_org, repo=repo_name, from_branch=args.upstream_branch, new_branch=(not args.no_branch), ) if not preserve_existing and not args.only: pr_comment = pr_comment or ( 'Superflore ebuild generator began regeneration of all' ' packages from ROS distro %s from ROS-Overlay commit %s.' % (selected_targets, overlay.repo.get_last_hash())) elif not args.only: pr_comment = pr_comment or ( 'Superflore ebuild generator ran update from ROS-Overlay ' + 'commit %s.' % (overlay.repo.get_last_hash())) # generate installers total_installers = dict() total_broken = set() total_changes = dict() if args.only: pr_comment = pr_comment or ( 'Superflore ebuild generator began regeneration of ' + 'package(s) %s from commit %s.' % (args.only, overlay.repo.get_last_hash())) missing_depends = set() to_commit = set() will_file_pr = False for pkg in args.only: if pkg in skip_keys: warn("Package '%s' is in skip-keys list, skipping..." % pkg) continue info("Regenerating package '%s'..." % pkg) try: ebuild, deps, version = regenerate_pkg( overlay, pkg, get_distro(args.ros_distro), preserve_existing) if not ebuild: for dep in deps: missing_depends.add(dep) except KeyError: err("No package to satisfy key '%s'" % pkg) continue if ebuild: to_commit.add(pkg) will_file_pr = True # if no packages succeeded, exit with error if not will_file_pr: err("No packages generated successfully, exiting.") sys.exit(1) # Commit changes and file pull request regen_dict = dict() regen_dict[args.ros_distro] = to_commit overlay.regenerate_manifests(regen_dict) overlay.commit_changes(args.ros_distro) if args.dry_run: save_pr(overlay, args.only, missing_deps=gen_missing_deps_msg(missing_depends), comment=pr_comment) sys.exit(0) delta = "Regenerated: '%s'\n" % args.only file_pr(overlay, delta, gen_missing_deps_msg(missing_depends), pr_comment) ok('Successfully synchronized repositories!') sys.exit(0) for distro in selected_targets: distro_installers, distro_broken, distro_changes =\ generate_installers( get_distro(distro), overlay=overlay, gen_pkg_func=regenerate_pkg, preserve_existing=preserve_existing, skip_keys=skip_keys, ) for key in distro_broken.keys(): for pkg in distro_broken[key]: total_broken.add(pkg) total_changes[distro] = distro_changes total_installers[distro] = distro_installers num_changes = 0 for distro_name in total_changes: num_changes += len(total_changes[distro_name]) if num_changes == 0: info('ROS distro is up to date.') info('Exiting...') clean_up() sys.exit(0) # remove duplicates delta = gen_delta_msg(total_changes) missing_deps = gen_missing_deps_msg(total_broken) # Commit changes and file pull request overlay.regenerate_manifests(total_installers) overlay.commit_changes('all' if args.all else args.ros_distro) if args.dry_run: info('Running in dry mode, not filing PR') save_pr(overlay, delta, missing_deps=missing_deps, comment=pr_comment) sys.exit(0) file_pr(overlay, delta, missing_deps, comment=pr_comment) clean_up() ok('Successfully synchronized repositories!')
def main(): overlay = None preserve_existing = True parser = get_parser('Deploy ROS packages into Gentoo Linux') args = parser.parse_args(sys.argv[1:]) pr_comment = args.pr_comment selected_targets = None if args.all: warn('"All" mode detected... This may take a while!') preserve_existing = False elif args.ros_distro: selected_targets = [args.ros_distro] set_index_for_distro(args.ros_distro) preserve_existing = False elif args.dry_run and args.pr_only: parser.error('Invalid args! cannot dry-run and file PR') elif args.pr_only and not args.output_repository_path: parser.error('Invalid args! no repository specified') elif args.pr_only: try: prev_overlay = RepoInstance(args.output_repository_path, False) msg, title = load_pr() prev_overlay.pull_request(msg, title) clean_up() sys.exit(0) except Exception as e: err('Failed to file PR!') err('reason: {0}'.format(e)) sys.exit(1) if not selected_targets: selected_targets = active_distros + ros2_distros repo_org = 'ros' repo_name = 'ros-overlay' if args.upstream_repo: repo_org, repo_name = url_to_repo_org(args.upstream_repo) with TempfileManager(args.output_repository_path) as _repo: if not args.output_repository_path: # give our group write permissions to the temp dir os.chmod(_repo, 17407) # clone if args.output_repository_path is None overlay = RosOverlay( _repo, not args.output_repository_path, org=repo_org, repo=repo_name ) if not preserve_existing and not args.only: pr_comment = pr_comment or ( 'Superflore ebuild generator began regeneration of all' ' packages from ROS distro %s from ROS-Overlay commit %s.' % ( selected_targets, overlay.repo.get_last_hash() ) ) elif not args.only: pr_comment = pr_comment or ( 'Superflore ebuild generator ran update from ROS-Overlay ' + 'commit %s.' % (overlay.repo.get_last_hash()) ) # generate installers total_installers = dict() total_broken = set() total_changes = dict() if args.only: pr_comment = pr_comment or ( 'Superflore ebuild generator began regeneration of ' + 'package(s) %s from commit %s.' % ( args.only, overlay.repo.get_last_hash() ) ) for pkg in args.only: info("Regenerating package '%s'..." % pkg) try: regenerate_pkg( overlay, pkg, get_distro(args.ros_distro), preserve_existing ) except KeyError: err("No package to satisfy key '%s'" % pkg) sys.exit(1) # Commit changes and file pull request regen_dict = dict() regen_dict[args.ros_distro] = args.only overlay.regenerate_manifests(regen_dict) overlay.commit_changes(args.ros_distro) if args.dry_run: save_pr( overlay, args.only, missing_deps=None, comment=pr_comment ) sys.exit(0) delta = "Regenerated: '%s'\n" % args.only file_pr(overlay, delta, '', pr_comment) ok('Successfully synchronized repositories!') sys.exit(0) for distro in selected_targets: set_index_for_distro(distro) distro_installers, distro_broken, distro_changes =\ generate_installers( distro_name=distro, overlay=overlay, gen_pkg_func=regenerate_pkg, preserve_existing=preserve_existing ) for key in distro_broken.keys(): for pkg in distro_broken[key]: total_broken.add(pkg) total_changes[distro] = distro_changes total_installers[distro] = distro_installers num_changes = 0 for distro_name in total_changes: num_changes += len(total_changes[distro_name]) if num_changes == 0: info('ROS distro is up to date.') info('Exiting...') clean_up() sys.exit(0) # remove duplicates delta = gen_delta_msg(total_changes) missing_deps = gen_missing_deps_msg(total_broken) # Commit changes and file pull request overlay.regenerate_manifests(total_installers) overlay.commit_changes(args.ros_distro) if args.dry_run: info('Running in dry mode, not filing PR') save_pr( overlay, delta, missing_deps=missing_deps, comment=pr_comment ) sys.exit(0) file_pr(overlay, delta, missing_deps, comment=pr_comment) clean_up() ok('Successfully synchronized repositories!')
def main(): overlay = None parser = get_parser('Generate OpenEmbedded recipes for ROS packages', exclude_all=True, require_rosdistro=True, require_dryrun=True) parser.add_argument('--tar-archive-dir', help='location to store archived packages', type=str) args = parser.parse_args(sys.argv[1:]) pr_comment = args.pr_comment skip_keys = set(args.skip_keys) if args.skip_keys else set() if args.pr_only: if args.dry_run: parser.error('Invalid args! cannot dry-run and file PR') if not args.output_repository_path: parser.error('Invalid args! no repository specified') try: prev_overlay = RepoInstance(args.output_repository_path, False) msg, title = load_pr() prev_overlay.pull_request(msg, title=title) clean_up() sys.exit(0) except Exception as e: err('Failed to file PR!') err('reason: {0}'.format(e)) sys.exit(1) warn('"{0}" distro detected...'.format(args.ros_distro)) """ No longer supporting generation for multiple targets, but left the code in place to handle them in case it might be needed again in the future. """ selected_targets = [args.ros_distro] preserve_existing = args.only now = os.getenv('SUPERFLORE_GENERATION_DATETIME', get_utcnow_timestamp_str()) repo_org = 'ros' repo_name = 'meta-ros' if args.upstream_repo: repo_org, repo_name = url_to_repo_org(args.upstream_repo) # open cached tar file if it exists with TempfileManager(args.output_repository_path) as _repo: if not args.output_repository_path: # give our group write permissions to the temp dir os.chmod(_repo, 17407) # clone if args.output_repository_path is None overlay = RosMeta( _repo, not args.output_repository_path, branch=(('superflore/{}'.format(now)) if not args.no_branch else None), org=repo_org, repo=repo_name, from_branch=args.upstream_branch, ) if not args.only: pr_comment = pr_comment or ( 'Recipes generated by **superflore** for all packages in ROS ' 'distribution {}.\n'.format(selected_targets[0])) else: pr_comment = pr_comment or ( 'Recipes generated by **superflore** for package(s) {} in ROS ' 'distribution {}.\n'.format(args.only, args.ros_distro)) # generate installers total_installers = dict() total_changes = dict() if args.tar_archive_dir: srcrev_filename = '%s/srcrev_cache.pickle' % args.tar_archive_dir else: srcrev_filename = None with CacheManager(srcrev_filename) as srcrev_cache: if args.only: distro = get_distro(args.ros_distro) for pkg in args.only: if pkg in skip_keys: warn("Package '%s' is in skip-keys list, skipping..." % pkg) continue info("Regenerating package '%s'..." % pkg) try: regenerate_pkg( overlay, pkg, distro, False, # preserve_existing srcrev_cache, skip_keys=skip_keys, ) except KeyError: err("No package to satisfy key '%s' available " "packages in selected distro: %s" % (pkg, get_package_names(distro))) sys.exit(1) # Commit changes and file pull request title =\ '{{{0}}} Selected recipes generated from '\ 'files/{0}/generated/cache.yaml '\ 'as of {1}\n'.format( args.ros_distro, now) regen_dict = dict() regen_dict[args.ros_distro] = args.only delta = "Regenerated: '%s'\n" % args.only overlay.add_generated_files(args.ros_distro) commit_msg = '\n'.join([ get_pr_text( title + '\n' + pr_comment.replace('**superflore**', 'superflore'), markup=''), delta ]) overlay.commit_changes(args.ros_distro, commit_msg) if args.dry_run: save_pr(overlay, args.only, '', pr_comment, title=title) sys.exit(0) file_pr(overlay, delta, '', pr_comment, distro=args.ros_distro, title=title) ok('Successfully synchronized repositories!') sys.exit(0) overlay.clean_ros_recipe_dirs(args.ros_distro) for adistro in selected_targets: yoctoRecipe.reset() distro = get_distro(adistro) distro_installers, _, distro_changes =\ generate_installers( distro, overlay, regenerate_pkg, preserve_existing, srcrev_cache, skip_keys, skip_keys=skip_keys, is_oe=True, ) total_changes[adistro] = distro_changes total_installers[adistro] = distro_installers yoctoRecipe.generate_ros_distro_inc( _repo, args.ros_distro, overlay.get_file_revision_logs( 'meta-ros{0}-{1}/files/{1}/generated/cache.yaml'. format(yoctoRecipe._get_ros_version(args.ros_distro), args.ros_distro)), distro.release_platforms, skip_keys) yoctoRecipe.generate_superflore_datetime_inc( _repo, args.ros_distro, now) yoctoRecipe.generate_rosdep_resolve(_repo, args.ros_distro) yoctoRecipe.generate_newer_platform_components( _repo, args.ros_distro) overlay.add_generated_files(args.ros_distro) num_changes = 0 for distro_name in total_changes: num_changes += len(total_changes[distro_name]) if num_changes == 0: info('ROS distro is up to date.') summary = overlay.get_change_summary(args.ros_distro) if len(summary) == 0: info('Exiting...') clean_up() sys.exit(0) else: info('But there are some changes in other regenerated files:' '%s' % summary) # remove duplicates delta = gen_delta_msg(total_changes, markup='') # Commit changes and file pull request title = '{{{0}}} Sync to files/{0}/generated/'\ 'cache.yaml as of {1}\n'.format( args.ros_distro, now) commit_msg = '\n'.join([ get_pr_text(title + '\n' + pr_comment.replace('**superflore**', 'superflore'), markup=''), delta ]) overlay.commit_changes(args.ros_distro, commit_msg) delta = gen_delta_msg(total_changes) if args.dry_run: info('Running in dry mode, not filing PR') save_pr( overlay, delta, '', pr_comment, title=title, ) sys.exit(0) file_pr(overlay, delta, '', comment=pr_comment, title=title) clean_up() ok('Successfully synchronized repositories!')
def main(): overlay = None preserve_existing = True parser = get_parser('Deploy ROS packages into Yocto Linux') parser.add_argument( '--tar-archive-dir', help='location to store archived packages', type=str ) args = parser.parse_args(sys.argv[1:]) pr_comment = args.pr_comment selected_targets = None if args.all: warn('"All" mode detected... this may take a while!') preserve_existing = False elif args.ros_distro: warn('"{0}" distro detected...'.format(args.ros_distro)) selected_targets = [args.ros_distro] preserve_existing = False elif args.dry_run and args.pr_only: parser.error('Invalid args! cannot dry-run and file PR') elif args.pr_only and not args.output_repository_path: parser.error('Invalid args! no repository specified') elif args.pr_only: try: prev_overlay = RepoInstance(args.output_repository_path, False) msg, title = load_pr() prev_overlay.pull_request(msg, title) clean_up() sys.exit(0) except Exception as e: err('Failed to file PR!') err('reason: {0}'.format(e)) sys.exit(1) if not selected_targets: selected_targets = ros1_distros + ros2_distros repo_org = 'lgsvl' repo_name = 'meta-ros2' if args.upstream_repo: repo_org, repo_name = url_to_repo_org(args.upstream_repo) # open cached tar file if it exists with TempfileManager(args.output_repository_path) as _repo: if not args.output_repository_path: # give our group write permissions to the temp dir os.chmod(_repo, 17407) # clone if args.output-repository_path is None overlay = RosMeta( _repo, not args.output_repository_path, org=repo_org, repo=repo_name ) if not args.only: pr_comment = pr_comment or ( 'Superflore yocto generator began regeneration of all ' 'packages form ROS distribution(s) %s on Meta-ROS from ' 'commit %s.' % ( selected_targets, overlay.repo.get_last_hash() ) ) else: pr_comment = pr_comment or ( 'Superflore yocto generator began regeneration of package(s)' ' %s from ROS distro %s from Meta-ROS from commit %s.' % ( args.only, args.ros_distro, overlay.repo.get_last_hash() ) ) # generate installers total_installers = dict() total_broken = set() total_changes = dict() if args.tar_archive_dir: sha256_filename = '%s/sha256_cache.pickle' % args.tar_archive_dir md5_filename = '%s/md5_cache.pickle' % args.tar_archive_dir else: sha256_filename = None md5_filename = None with TempfileManager(args.tar_archive_dir) as tar_dir,\ CacheManager(sha256_filename) as sha256_cache,\ CacheManager(md5_filename) as md5_cache: # noqa if args.only: for pkg in args.only: info("Regenerating package '%s'..." % pkg) try: regenerate_installer( overlay, pkg, get_distro(args.ros_distro), preserve_existing, tar_dir, md5_cache, sha256_cache ) except KeyError: err("No package to satisfy key '%s'" % pkg) sys.exit(1) # Commit changes and file pull request regen_dict = dict() regen_dict[args.ros_distro] = args.only overlay.commit_changes(args.ros_distro) if args.dry_run: save_pr(overlay, args.only, None, pr_comment) sys.exit(0) delta = "Regenerated: '%s'\n" % args.only file_pr(overlay, delta, '', pr_comment, distro=args.ros_distro) ok('Successfully synchronized repositories!') sys.exit(0) for distro in selected_targets: distro_installers, distro_broken, distro_changes =\ generate_installers( distro, overlay, regenerate_installer, preserve_existing, tar_dir, md5_cache, sha256_cache ) for key in distro_broken.keys(): for pkg in distro_broken[key]: total_broken.add(pkg) total_changes[distro] = distro_changes total_installers[distro] = distro_installers num_changes = 0 for distro_name in total_changes: num_changes += len(total_changes[distro_name]) if num_changes == 0: info('ROS distro is up to date.') info('Exiting...') clean_up() sys.exit(0) # remove duplicates delta = gen_delta_msg(total_changes) missing_deps = gen_missing_deps_msg(total_broken) # Commit changes and file pull request overlay.commit_changes(args.ros_distro) if args.dry_run: info('Running in dry mode, not filing PR') save_pr(overlay, delta, missing_deps, pr_comment) clean_up() sys.exit(0) file_pr(overlay, delta, missing_deps, pr_comment) clean_up() ok('Successfully synchronized repositories!')
def main(): os.environ["ROS_OS_OVERRIDE"] = "openembedded" overlay = None preserve_existing = True parser = get_parser('Deploy ROS packages into OpenEmbedded Linux', exclude_all=True) parser.add_argument('--tar-archive-dir', help='location to store archived packages', type=str) args = parser.parse_args(sys.argv[1:]) pr_comment = args.pr_comment skip_keys = set(args.skip_keys) if args.skip_keys else set() selected_targets = None if args.pr_only: if args.dry_run: parser.error('Invalid args! cannot dry-run and file PR') if not args.output_repository_path: parser.error('Invalid args! no repository specified') try: prev_overlay = RepoInstance(args.output_repository_path, False) msg, title = load_pr() prev_overlay.pull_request(msg, title=title) clean_up() sys.exit(0) except Exception as e: err('Failed to file PR!') err('reason: {0}'.format(e)) sys.exit(1) elif args.ros_distro: warn('"{0}" distro detected...'.format(args.ros_distro)) selected_targets = [args.ros_distro] preserve_existing = False elif args.only: parser.error('Invalid args! --only requires specifying --ros-distro') if not selected_targets: selected_targets = get_distros_by_status('active') now = get_utcnow_timestamp_str() repo_org = 'ros' repo_name = 'meta-ros' if args.upstream_repo: repo_org, repo_name = url_to_repo_org(args.upstream_repo) # open cached tar file if it exists with TempfileManager(args.output_repository_path) as _repo: if not args.output_repository_path: # give our group write permissions to the temp dir os.chmod(_repo, 17407) # clone if args.output_repository_path is None overlay = RosMeta( _repo, not args.output_repository_path, branch='superflore/{}'.format(now), org=repo_org, repo=repo_name, from_branch=args.upstream_branch, ) if not args.only: pr_comment = pr_comment or ( 'Recipes generated by **superflore** for all packages in ROS ' 'distribution {}.\n'.format(selected_targets[0])) else: pr_comment = pr_comment or ( 'Recipes generated by **superflore** for package(s) {} in ROS ' 'distribution {}.\n'.format(args.only, args.ros_distro)) # generate installers total_installers = dict() total_changes = dict() if args.tar_archive_dir: sha256_filename = '%s/sha256_cache.pickle' % args.tar_archive_dir md5_filename = '%s/md5_cache.pickle' % args.tar_archive_dir else: sha256_filename = None md5_filename = None with TempfileManager(args.tar_archive_dir) as tar_dir,\ CacheManager(sha256_filename) as sha256_cache,\ CacheManager(md5_filename) as md5_cache: # noqa if args.only: distro = get_distro(args.ros_distro) for pkg in args.only: if pkg in skip_keys: warn("Package '%s' is in skip-keys list, skipping..." % pkg) continue info("Regenerating package '%s'..." % pkg) try: regenerate_pkg( overlay, pkg, distro, preserve_existing, tar_dir, md5_cache, sha256_cache, skip_keys=skip_keys, ) except KeyError: err("No package to satisfy key '%s'" % pkg) sys.exit(1) yoctoRecipe.generate_rosdistro_conf( _repo, args.ros_distro, overlay.get_file_revision_logs( 'files/{0}/cache.yaml'.format(args.ros_distro)), distro.release_platforms, skip_keys) yoctoRecipe.generate_superflore_datetime_inc( _repo, args.ros_distro, now) yoctoRecipe.generate_distro_cache(_repo, args.ros_distro) yoctoRecipe.generate_rosdep_resolve(_repo, args.ros_distro) yoctoRecipe.generate_newer_platform_components( _repo, args.ros_distro) yoctoRecipe.generate_superflore_change_summary( _repo, args.ros_distro, overlay.get_change_summary()) # Commit changes and file pull request title = '{{{0}}} Sync to {0}-cache.yaml as of {1}\n'.format( args.ros_distro, now) regen_dict = dict() regen_dict[args.ros_distro] = args.only delta = "Regenerated: '%s'\n" % args.only commit_msg = '\n'.join([ get_pr_text( title + '\n' + pr_comment.replace('**superflore**', 'superflore'), markup=''), delta ]) overlay.commit_changes(args.ros_distro, commit_msg) if args.dry_run: save_pr(overlay, args.only, '', pr_comment, title=title) sys.exit(0) file_pr(overlay, delta, '', pr_comment, distro=args.ros_distro, title=title) ok('Successfully synchronized repositories!') sys.exit(0) for adistro in selected_targets: yoctoRecipe.reset() distro = get_distro(adistro) distro_installers, _, distro_changes =\ generate_installers( distro, overlay, regenerate_pkg, preserve_existing, tar_dir, md5_cache, sha256_cache, skip_keys, skip_keys=skip_keys, is_oe=True, ) total_changes[adistro] = distro_changes total_installers[adistro] = distro_installers yoctoRecipe.generate_rosdistro_conf( _repo, args.ros_distro, overlay.get_file_revision_logs( 'files/{0}/cache.yaml'.format(args.ros_distro)), distro.release_platforms, skip_keys) yoctoRecipe.generate_superflore_datetime_inc( _repo, args.ros_distro, now) yoctoRecipe.generate_distro_cache(_repo, args.ros_distro) yoctoRecipe.generate_rosdep_resolve(_repo, args.ros_distro) yoctoRecipe.generate_newer_platform_components( _repo, args.ros_distro) yoctoRecipe.generate_superflore_change_summary( _repo, args.ros_distro, overlay.get_change_summary()) num_changes = 0 for distro_name in total_changes: num_changes += len(total_changes[distro_name]) if num_changes == 0: info('ROS distro is up to date.') info('Exiting...') clean_up() sys.exit(0) # remove duplicates delta = gen_delta_msg(total_changes, markup='') # Commit changes and file pull request title = '{{{0}}} Sync to {0}-cache.yaml as of {1}\n'.format( args.ros_distro, now) commit_msg = '\n'.join([ get_pr_text(title + '\n' + pr_comment.replace('**superflore**', 'superflore'), markup=''), delta ]) overlay.commit_changes(args.ros_distro, commit_msg) delta = gen_delta_msg(total_changes) if args.dry_run: info('Running in dry mode, not filing PR') save_pr( overlay, delta, '', pr_comment, title=title, ) sys.exit(0) file_pr(overlay, delta, '', comment=pr_comment, title=title) clean_up() ok('Successfully synchronized repositories!')
def main(): global overlay global preserve_existing parser = argparse.ArgumentParser('Deploy ROS packages into Gentoo Linux') parser.add_argument('--ros-distro', help='regenerate packages for the specified distro', type=str) parser.add_argument('--all', help='regenerate all packages in all distros', action="store_true") parser.add_argument('--dry-run', help='run without filing a PR to remote', action="store_true") parser.add_argument('--pr-only', help='ONLY file a PR to remote', action='store_true') parser.add_argument('--output-repository-path', help='location of the Git repo', type=str) parser.add_argument('--only', nargs='+', help='generate only the specified packages') args = parser.parse_args(sys.argv[1:]) selected_targets = None if args.all: warn('"All" mode detected... This may take a while!') preserve_existing = False elif args.ros_distro: selected_targets = [args.ros_distro] preserve_existing = False elif args.dry_run and args.pr_only: parser.error('Invalid args! cannot dry-run and file PR') elif args.pr_only and not args.output_repository_path: parser.error('Invalid args! no repository specified') elif args.pr_only: try: with open('.pr-message.tmp', 'r') as msg_file: msg = msg_file.read().rstrip('\n') with open('.pr-title.tmp', 'r') as title_file: title = title_file.read().rstrip('\n') except OSError: err('Failed to open PR title/message file!') err('Please supply the %s and %s files' % ('.pr_message.tmp', '.pr_title.tmp')) raise try: prev_overlay = RepoInstance(args.output_repository_path, False) info('PR message:\n"%s"\n' % msg) info('PR title:\n"%s"\n' % title) prev_overlay.pull_request(msg, title) clean_up() sys.exit(0) except Exception as e: err('Failed to file PR!') err('reason: {0}'.format(e)) sys.exit(1) if not selected_targets: selected_targets = active_distros with TempfileManager(args.output_repository_path) as _repo: if not args.output_repository_path: # give our group write permissions to the temp dir os.chmod(_repo, 17407) # clone if args.output_repository_path is None overlay = RosOverlay(_repo, not args.output_repository_path) # generate installers total_installers = dict() total_broken = set() total_changes = dict() if args.only: for pkg in args.only: info("Regenerating package '%s'..." % pkg) regenerate_pkg(overlay, pkg, get_distro(args.ros_distro), preserve_existing) # Commit changes and file pull request regen_dict = dict() regen_dict[args.ros_distro] = args.only overlay.regenerate_manifests(regen_dict) overlay.commit_changes(args.ros_distro) delta = "Regenerated: '%s'\n" % args.only if args.dry_run: info('Running in dry mode, not filing PR') title_file = open('.pr-title.tmp', 'w') title_file.write('rosdistro sync, {0}\n'.format(time.ctime())) pr_message_file = open('.pr-message.tmp', 'w') pr_message_file.write('%s\n%s\n' % (delta, '')) sys.exit(0) file_pr(overlay, delta, '') clean_up() ok('Successfully synchronized repositories!') sys.exit(0) for distro in selected_targets: distro_installers, distro_broken, distro_changes =\ generate_installers( distro_name=distro, overlay=overlay, gen_pkg_func=regenerate_pkg, preserve_existing=preserve_existing ) for key in distro_broken.keys(): for pkg in distro_broken[key]: total_broken.add(pkg) total_changes[distro] = distro_changes total_installers[distro] = distro_installers num_changes = 0 for distro_name in total_changes: num_changes += len(total_changes[distro_name]) if num_changes == 0: info('ROS distro is up to date.') info('Exiting...') clean_up() sys.exit(0) # remove duplicates inst_list = total_broken delta = "Changes:\n" delta += "========\n" if 'indigo' in total_changes and len(total_changes['indigo']) > 0: delta += "Indigo Changes:\n" delta += "---------------\n" for d in sorted(total_changes['indigo']): delta += '* {0}\n'.format(d) delta += "\n" if 'kinetic' in total_changes and len(total_changes['kinetic']) > 0: delta += "Kinetic Changes:\n" delta += "----------------\n" for d in sorted(total_changes['kinetic']): delta += '* {0}\n'.format(d) delta += "\n" if 'lunar' in total_changes and len(total_changes['lunar']) > 0: delta += "Lunar Changes:\n" delta += "--------------\n" for d in sorted(total_changes['lunar']): delta += '* {0}\n'.format(d) delta += "\n" missing_deps = '' if len(inst_list) > 0: missing_deps = "Missing Dependencies:\n" missing_deps += "=====================\n" for pkg in sorted(inst_list): missing_deps += " * [ ] {0}\n".format(pkg) # Commit changes and file pull request overlay.regenerate_manifests(total_installers) overlay.commit_changes(args.ros_distro) if args.dry_run: info('Running in dry mode, not filing PR') title_file = open('.pr-title.tmp', 'w') title_file.write('rosdistro sync, {0}\n'.format(time.ctime())) pr_message_file = open('.pr-message.tmp', 'w') pr_message_file.write('%s\n%s\n' % (delta, missing_deps)) sys.exit(0) file_pr(overlay, delta, missing_deps) clean_up() ok('Successfully synchronized repositories!')
def test_failed_to_create(self): """Test making a directory in a bad location""" with self.assertRaises(OSError): with TempfileManager('/root/bad_permissions') as tmp: # code should not enter here pass
def main(): global overlay global preserve_existing parser = argparse.ArgumentParser('Deploy ROS packages into Yocto Linux') parser.add_argument( '--ros-distro', help='regenerate packages for the specified distro', type=str ) parser.add_argument( '--all', help='regenerate all packages in all distros', action="store_true" ) parser.add_argument( '--output-repository-path', help='location of the Git repo', type=str ) parser.add_argument( '--tar-archive-dir', help='location to store archived packages', type=str ) selected_targets = active_distros args = parser.parse_args(sys.argv[1:]) if args.all: warn('"All" mode detected... this may take a while!') preserve_existing = False elif args.ros_distro: warn('"{0}" distro detected...'.format(args.ros_distro)) selected_targets = [args.ros_distro] preserve_existing = False with TempfileManager(args.output_repository_path) as _repo: if not args.output_repository_path: # give our group write permissions to the temp dir os.chmod(_repo, 17407) # clone if args.output-repository_path is None overlay = RosMeta(_repo, not args.output_repository_path) # generate installers total_installers = dict() total_broken = set() total_changes = dict() with TempfileManager(args.tar_archive_dir) as tar_dir: for distro in selected_targets: distro_installers, distro_broken, distro_changes =\ generate_installers( distro, overlay, regenerate_installer, preserve_existing, tar_dir ) for key in distro_broken.keys(): for pkg in distro_broken[key]: total_broken.add(pkg) total_changes[distro] = distro_changes total_installers[distro] = distro_installers num_changes = 0 for distro_name in total_changes: num_changes += len(total_changes[distro_name]) if num_changes == 0: info('ROS distro is up to date.') info('Exiting...') sys.exit(0) # remove duplicates inst_list = total_broken delta = "Changes:\n" delta += "========\n" if 'indigo' in total_changes and len(total_changes['indigo']) > 0: delta += "Indigo Changes:\n" delta += "---------------\n" for d in sorted(total_changes['indigo']): delta += '* {0}\n'.format(d) delta += "\n" if 'kinetic' in total_changes and len(total_changes['kinetic']) > 0: delta += "Kinetic Changes:\n" delta += "----------------\n" for d in sorted(total_changes['kinetic']): delta += '* {0}\n'.format(d) delta += "\n" if 'lunar' in total_changes and len(total_changes['lunar']) > 0: delta += "Lunar Changes:\n" delta += "--------------\n" for d in sorted(total_changes['lunar']): delta += '* {0}\n'.format(d) delta += "\n" missing_deps = '' if len(inst_list) > 0: missing_deps = "Missing Dependencies:\n" missing_deps += "=====================\n" for pkg in sorted(inst_list): missing_deps += " * [ ] {0}\n".format(pkg) # Commit changes and file pull request overlay.commit_changes(args.ros_distro) file_pr(overlay, delta, missing_deps) ok('Successfully synchronized repositories!')