def generate_setup(config, no_ros_allowed=False): ros_root = get_ros_stack_path(config) if ros_root is None: if not no_ros_allowed: candidates = [] for t in config.get_config_elements(): if os.path.basename(t.get_local_name()) == 'ros': candidates.append(t.get_path()) raise ROSInstallException(""" No 'ros' stack detected in candidates %s. Please add the location of a ros distribution to this command. See http://ros.org/wiki/rosinstall.""" % (candidates)) text = generate_setup_sh_text(workspacepath=config.get_base_path()) setup_path = os.path.join(config.get_base_path(), 'setup.sh') with open(setup_path, 'w') as fhand: fhand.write(text) for shell in ['bash', 'zsh']: text = generate_setup_bash_text(shell) setup_path = os.path.join(config.get_base_path(), 'setup.%s' % shell) with open(setup_path, 'w') as fhand: fhand.write(text)
def cmd_info(self, target_path, argv, reverse=True, config=None): only_option_valid_attrs = ['path', 'localname', 'version', 'revision', 'cur_revision', 'uri', 'cur_uri', 'scmtype'] parser = OptionParser(usage="usage: %s info [localname]* [OPTIONS]" % self.progname, formatter=IndentedHelpFormatterWithNL(), description=__MULTIPRO_CMD_DICT__["info"] + """ The Status (S) column shows x for missing L for uncommited (local) changes V for difference in version and/or remote URI The 'Version-Spec' column shows what tag, branch or revision was given in the .rosinstall file. The 'UID' column shows the unique ID of the current (and specified) version. The 'URI' column shows the configured URL of the repo. If status is V, the difference between what was specified and what is real is shown in the respective column. For SVN entries, the url is split up according to standard layout (trunk/tags/branches). The ROS_PACKAGE_PATH follows the order of the table, earlier entries overlay later entries. When given one localname, just show the data of one element in list form. This also has the generic properties element which is usually empty. The --only option accepts keywords: %(opts)s Examples: $ %(prog)s info -t ~/ros/fuerte $ %(prog)s info robot_model $ %(prog)s info --yaml $ %(prog)s info --only=path,cur_uri,cur_revision robot_model geometry """ % {'prog': _PROGNAME, 'opts': only_option_valid_attrs}, epilog="See: http://www.ros.org/wiki/rosinstall for details\n") parser.add_option("--data-only", dest="data_only", default=False, help="Does not provide explanations", action="store_true") parser.add_option("--no-pkg-path", dest="no_pkg_path", default=False, help="Suppress ROS_PACKAGE_PATH.", action="store_true") parser.add_option("--pkg-path-only", dest="pkg_path_only", default=False, help="Shows only ROS_PACKAGE_PATH separated by ':'. Supercedes all other options.", action="store_true") parser.add_option("--only", dest="only", default=False, help="Shows comma-separated lists of only given comma-separated attribute(s).", action="store") parser.add_option("--yaml", dest="yaml", default=False, help="Shows only version of single entry. Intended for scripting.", action="store_true") # -t option required here for help but used one layer above, see cli_common parser.add_option("-t", "--target-workspace", dest="workspace", default=None, help="which workspace to use", action="store") (options, args) = parser.parse_args(argv) if config is None: config = get_config( target_path, additional_uris=[], config_filename=self.config_filename) elif config.get_base_path() != target_path: raise MultiProjectException("Config path does not match %s %s " % (config.get_base_path(), target_path)) if args == []: args = None # relevant for code completion, so these should yield quick response: if options.pkg_path_only: print(":".join(get_ros_package_path(config))) return 0 elif options.only: only_options = options.only.split(",") if only_options == '': parser.error('No valid options given') lookup_required = False for attr in only_options: if not attr in only_option_valid_attrs: parser.error("Invalid --only option '%s', valids are %s" % (attr, only_option_valid_attrs)) if attr in ['cur_revision', 'cur_uri', 'revision']: lookup_required = True elements = select_elements(config, args) for element in elements: if lookup_required and element.is_vcs_element(): spec = element.get_versioned_path_spec() else: spec = element.get_path_spec() output = [] for attr in only_options: if 'localname' == attr: output.append(spec.get_local_name() or '') if 'path' == attr: output.append(spec.get_path() or '') if 'scmtype' == attr: output.append(spec.get_scmtype() or '') if 'uri' == attr: output.append(spec.get_uri() or '') if 'version' == attr: output.append(spec.get_version() or '') if 'revision' == attr: output.append(spec.get_revision() or '') if 'cur_uri' == attr: output.append(spec.get_curr_uri() or '') if 'cur_revision' == attr: output.append(spec.get_current_revision() or '') print(','.join(output)) return 0 if options.yaml: source_aggregate = cmd_snapshot(config, localnames=args) print(yaml.safe_dump(source_aggregate)) return 0 # this call takes long, as it invokes scms. outputs = cmd_info(config, localnames=args) if args is not None and len(outputs) == 1: print(get_info_list(config.get_base_path(), outputs[0], options.data_only)) return 0 header = 'workspace: %s\nROS_ROOT: %s' % (target_path, get_ros_stack_path(config)) print(header) if not options.no_pkg_path: table = get_info_table(config.get_base_path(), outputs, options.data_only, reverse=reverse) if table is not None and table != '': print("\n%s" % table) return 0
def cmd_info(self, target_path, argv, reverse=True, config=None): only_option_valid_attrs = [ 'path', 'localname', 'version', 'revision', 'cur_revision', 'uri', 'cur_uri', 'scmtype' ] parser = OptionParser( usage="usage: %s info [localname]* [OPTIONS]" % _PROGNAME, formatter=IndentedHelpFormatterWithNL(), description=__MULTIPRO_CMD_DICT__["info"] + """ The Status (S) column shows x for missing L for uncommited (local) changes V for difference in version and/or remote URI The 'Version-Spec' column shows what tag, branch or revision was given in the .rosinstall file. The 'UID' column shows the unique ID of the current (and specified) version. The 'URI' column shows the configured URL of the repo. If status is V, the difference between what was specified and what is real is shown in the respective column. For SVN entries, the url is split up according to standard layout (trunk/tags/branches). The ROS_PACKAGE_PATH follows the order of the table, earlier entries overlay later entries. When given one localname, just show the data of one element in list form. This also has the generic properties element which is usually empty. The --only option accepts keywords: %(opts)s Examples: $ %(prog)s info -t ~/ros/fuerte $ %(prog)s info robot_model $ %(prog)s info --yaml $ %(prog)s info --only=path,cur_uri,cur_revision robot_model geometry """ % { 'prog': _PROGNAME, 'opts': only_option_valid_attrs }, epilog="See: http://www.ros.org/wiki/rosinstall for details\n") parser.add_option("--data-only", dest="data_only", default=False, help="Does not provide explanations", action="store_true") parser.add_option("--no-pkg-path", dest="no_pkg_path", default=False, help="Suppress ROS_PACKAGE_PATH.", action="store_true") parser.add_option( "--pkg-path-only", dest="pkg_path_only", default=False, help= "Shows only ROS_PACKAGE_PATH separated by ':'. Supercedes all other options.", action="store_true") parser.add_option( "--only", dest="only", default=False, help= "Shows comma-separated lists of only given comma-separated attribute(s).", action="store") parser.add_option( "--yaml", dest="yaml", default=False, help="Shows only version of single entry. Intended for scripting.", action="store_true") # -t option required here for help but used one layer above, see cli_common parser.add_option("-t", "--target-workspace", dest="workspace", default=None, help="which workspace to use", action="store") (options, args) = parser.parse_args(argv) if config is None: config = get_config(target_path, additional_uris=[], config_filename=self.config_filename) elif config.get_base_path() != target_path: raise MultiProjectException("Config path does not match %s %s " % (config.get_base_path(), target_path)) if args == []: args = None # relevant for code completion, so these should yield quick response: if options.pkg_path_only: print(":".join(get_ros_package_path(config))) return 0 elif options.only: only_options = options.only.split(",") if only_options == '': parser.error('No valid options given') lookup_required = False for attr in only_options: if not attr in only_option_valid_attrs: parser.error("Invalid --only option '%s', valids are %s" % (attr, only_option_valid_attrs)) if attr in ['cur_revision', 'cur_uri', 'revision']: lookup_required = True elements = select_elements(config, args) for element in elements: if lookup_required and element.is_vcs_element(): spec = element.get_versioned_path_spec() else: spec = element.get_path_spec() output = [] for attr in only_options: if 'localname' == attr: output.append(spec.get_local_name() or '') if 'path' == attr: output.append(spec.get_path() or '') if 'scmtype' == attr: output.append(spec.get_scmtype() or '') if 'uri' == attr: output.append(spec.get_uri() or '') if 'version' == attr: output.append(spec.get_version() or '') if 'revision' == attr: output.append(spec.get_revision() or '') if 'cur_uri' == attr: output.append(spec.get_curr_uri() or '') if 'cur_revision' == attr: output.append(spec.get_current_revision() or '') print(','.join(output)) return 0 if options.yaml: source_aggregate = cmd_snapshot(config, localnames=args) print(yaml.safe_dump(source_aggregate)) return 0 # this call takes long, as it invokes scms. outputs = cmd_info(config, localnames=args) if args is not None and len(outputs) == 1: print( get_info_list(config.get_base_path(), outputs[0], options.data_only)) return 0 header = 'workspace: %s\nROS_ROOT: %s' % (target_path, get_ros_stack_path(config)) print(header) if not options.no_pkg_path: table = get_info_table(config.get_base_path(), outputs, options.data_only, reverse=reverse) if table is not None and table != '': print("\n%s" % table) return 0
def cmd_info(self, target_path, argv, reverse=True, config=None): # similar to multiproject_cli except shows ros-pkg-path # options parser = OptionParser( usage="usage: %s info [localname]* [OPTIONS]" % self.progname, formatter=IndentedHelpFormatterWithNL(), description=__MULTIPRO_CMD_DICT__["info"] + """ The Status (S) column shows x for missing L for uncommited (local) changes V for difference in version and/or remote URI The 'Version-Spec' column shows what tag, branch or revision was given in the .rosinstall file. The 'UID' column shows the unique ID of the current (and specified) version. The 'URI' column shows the configured URL of the repo. If status is V, the difference between what was specified and what is real is shown in the respective column. For SVN entries, the url is split up according to standard layout (trunk/tags/branches). The ROS_PACKAGE_PATH follows the order of the table, earlier entries overlay later entries. When given one localname, just show the data of one element in list form. This also has the generic properties element which is usually empty. The --only option accepts keywords: %(opts)s Examples: $ %(prog)s info -t ~/ros/fuerte $ %(prog)s info robot_model $ %(prog)s info --yaml $ %(prog)s info --only=path,cur_uri,cur_revision robot_model geometry """ % { 'prog': self.progname, 'opts': ONLY_OPTION_VALID_ATTRS }, epilog="See: http://www.ros.org/wiki/rosinstall for details\n") parser.add_option("--data-only", dest="data_only", default=False, help="Does not provide explanations", action="store_true") parser.add_option("--no-pkg-path", dest="no_pkg_path", default=False, help="Suppress ROS_PACKAGE_PATH.", action="store_true") parser.add_option( "--pkg-path-only", dest="pkg_path_only", default=False, help= "Shows only ROS_PACKAGE_PATH separated by ':'. Supercedes all other options.", action="store_true") parser.add_option( "--only", dest="only", default=False, help= "Shows comma-separated lists of only given comma-separated attribute(s).", action="store") parser.add_option( "--yaml", dest="yaml", default=False, help="Shows only version of single entry. Intended for scripting.", action="store_true") parser.add_option("-u", "--untracked", dest="untracked", default=False, help="Also show untracked files as modifications", action="store_true") # -t option required here for help but used one layer above, see cli_common parser.add_option("-t", "--target-workspace", dest="workspace", default=None, help="which workspace to use", action="store") (options, args) = parser.parse_args(argv) if config is None: config = get_config(target_path, additional_uris=[], config_filename=self.config_filename) elif config.get_base_path() != target_path: raise MultiProjectException("Config path does not match %s %s " % (config.get_base_path(), target_path)) if args == []: args = None if options.pkg_path_only: print(":".join(get_ros_package_path(config))) return 0 if options.no_pkg_path: header = 'workspace: %s\nROS_ROOT: %s' % ( target_path, get_ros_stack_path(config)) print(header) return 0 elif options.only: only_options = options.only.split(",") if only_options == '': parser.error('No valid options given') lines = get_info_table_raw_csv(config, properties=only_options, localnames=args) print('\n'.join(lines)) return 0 elif options.yaml: source_aggregate = cmd_snapshot(config, localnames=args) print(yaml.safe_dump(source_aggregate), end='') return 0 # this call takes long, as it invokes scms. outputs = cmd_info(config, localnames=args, untracked=options.untracked) if args and len(args) == 1: # if only one element selected, print just one line print( get_info_list(config.get_base_path(), outputs[0], options.data_only)) return 0 header = 'workspace: %s\nROS_ROOT: %s' % (target_path, get_ros_stack_path(config)) print(header) table = get_info_table(config.get_base_path(), outputs, options.data_only, reverse=reverse) if table is not None and table != '': print("\n%s" % table) return 0
def cmd_info(self, target_path, argv, reverse=True, config=None): # similar to multiproject_cli except shows ros-pkg-path # options parser = OptionParser( usage="usage: %s info [localname]* [OPTIONS]" % self.progname, formatter=IndentedHelpFormatterWithNL(), description=__MULTIPRO_CMD_DICT__["info"] + """ The Status (S) column shows x for missing L for uncommited (local) changes V for difference in version and/or remote URI C for difference in local and remote versions The 'Version-Spec' column shows what tag, branch or revision was given in the .rosinstall file. The 'UID' column shows the unique ID of the current (and specified) version. The 'URI' column shows the configured URL of the repo. If status is V, the difference between what was specified and what is real is shown in the respective column. For SVN entries, the url is split up according to standard layout (trunk/tags/branches). The ROS_PACKAGE_PATH follows the order of the table, earlier entries overlay later entries. When given one localname, just show the data of one element in list form. This also has the generic properties element which is usually empty. The --only option accepts keywords: %(opts)s Examples: $ %(prog)s info -t ~/ros/fuerte $ %(prog)s info robot_model $ %(prog)s info --yaml $ %(prog)s info --only=path,cur_uri,cur_revision robot_model geometry """ % {'prog': self.progname, 'opts': ONLY_OPTION_VALID_ATTRS}, epilog="See: http://wiki.ros.org/rosinstall for details\n") parser.add_option( "--root", dest="show_ws_root", default=False, help="Show workspace root path", action="store_true") parser.add_option( "--data-only", dest="data_only", default=False, help="Does not provide explanations", action="store_true") parser.add_option( "--no-pkg-path", dest="no_pkg_path", default=False, help="Suppress ROS_PACKAGE_PATH.", action="store_true") parser.add_option( "--pkg-path-only", dest="pkg_path_only", default=False, help="Shows only ROS_PACKAGE_PATH separated by ':'. Supercedes all other options.", action="store_true") parser.add_option( "--only", dest="only", default=False, help="Shows comma-separated lists of only given comma-separated attribute(s).", action="store") parser.add_option( "--yaml", dest="yaml", default=False, help="Shows only version of single entry. Intended for scripting.", action="store_true") parser.add_option( "--fetch", dest="fetch", default=False, help="When used, retrieves version information from remote (takes longer).", action="store_true") parser.add_option( "-u", "--untracked", dest="untracked", default=False, help="Also show untracked files as modifications", action="store_true") # -t option required here for help but used one layer above, see cli_common parser.add_option( "-t", "--target-workspace", dest="workspace", default=None, help="which workspace to use", action="store") parser.add_option( "-m", "--managed-only", dest="unmanaged", default=True, help="only show managed elements", action="store_false") (options, args) = parser.parse_args(argv) if config is None: config = get_config( target_path, additional_uris=[], config_filename=self.config_filename) elif config.get_base_path() != target_path: raise MultiProjectException("Config path does not match %s %s " % (config.get_base_path(), target_path)) if options.show_ws_root: print(config.get_base_path()) return 0 if args == []: args = None if options.pkg_path_only: print(":".join(get_ros_package_path(config))) return 0 if options.no_pkg_path: header = 'workspace: %s\nROS_ROOT: %s' % (target_path, get_ros_stack_path(config)) print(header) return 0 elif options.only: only_options = options.only.split(",") if only_options == '': parser.error('No valid options given') lines = get_info_table_raw_csv(config, properties=only_options, localnames=args) print('\n'.join(lines)) return 0 elif options.yaml: source_aggregate = cmd_snapshot(config, localnames=args) print(yaml.safe_dump(source_aggregate), end='') return 0 # this call takes long, as it invokes scms. outputs = cmd_info(config, localnames=args, untracked=options.untracked, fetch=options.fetch) if args and len(args) == 1: # if only one element selected, print just one line print(get_info_list(config.get_base_path(), outputs[0], options.data_only)) return 0 header = 'workspace: %s\nROS_ROOT: %s' % (target_path, get_ros_stack_path(config)) print(header) table = get_info_table(config.get_base_path(), outputs, options.data_only, reverse=reverse) if table is not None and table != '': print("\n%s" % table) if options.unmanaged: outputs2 = cmd_find_unmanaged_repos(config) table2 = get_info_table(config.get_base_path(), outputs2, options.data_only, reverse=reverse, unmanaged=True) if table2 is not None and table2 != '': print("\nAlso detected these repositories in the workspace, add using '%s set':\n\n%s" % (self.progname, table2)) return 0