def test_original_syntax_setupfile(self): local_name = '/opt/ros/fuerte/setup.sh' version = None uri = None scmtype = 'setup-file' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(None, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) version = "1234" uri = 'https://kforge.ros.org/common/rosdepcore' try: struct = {"setup-file": {"uri": uri}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"setup-file": {"version": version}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass
def checkout_rosinstall(rosinstall_data, verbose=False): """ :param rosinstall_data: yaml dict in rosinstall format :raises: rosinstall.common.MultiProjectException for incvalid yaml """ for frag in rosinstall_data: path_spec = get_path_spec_from_yaml(frag) if verbose: print(path_spec.get_scmtype(), path_spec.get_path(), path_spec.get_uri(), path_spec.get_version()) vcs_client = vcstools.get_vcs_client(path_spec.get_scmtype(), path_spec.get_path()) vcs_client.checkout(path_spec.get_uri(), path_spec.get_version())
def test_original_syntax_invalids(self): local_name = 'common_rosdeps' version = '1234' uri = 'https://kforge.ros.org/common/rosdepcore' scmtype = 'hg' try: struct = {} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"hello world": None} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"git": None} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"git": {}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"git": {"uri": uri}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"git": {"local-name": local_name}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"foo": {"foo": None}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"other": {"foo": None}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"other": {"uri": uri}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass try: struct = {"other": {"version": version}} get_path_spec_from_yaml(struct) self.fail("expected exception") except MultiProjectException: pass
def test_original_syntax_scm(self): # - hg: {local-name: common_rosdeps, version: common_rosdeps-1.0.2, uri: https://kforge.ros.org/common/rosdepcore} local_name = 'common_rosdeps' version = 'common_rosdeps-1.0.2' uri = 'https://kforge.ros.org/common/rosdepcore' scmtype = 'hg' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(scmtype, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual(struct, wrap.get_legacy_yaml()) # empty version local_name = 'common_rosdeps' version = None uri = 'https://kforge.ros.org/common/rosdepcore' scmtype = 'hg' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(scmtype, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual({scmtype: {'local-name': local_name, 'uri': uri}}, wrap.get_legacy_yaml()) # no version local_name = 'common_rosdeps' version = None uri = 'https://kforge.ros.org/common/rosdepcore' scmtype = 'hg' struct = {scmtype: {'local-name': local_name, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(scmtype, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual({'hg': {'local-name': 'common_rosdeps', 'uri': 'https://kforge.ros.org/common/rosdepcore'}}, wrap.get_legacy_yaml()) # other local_name = 'common_rosdeps' version = None uri = None scmtype = 'other' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(None, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual({scmtype: {'local-name': local_name}}, wrap.get_legacy_yaml()) # properties (undocumented feature required for builds) local_name = 'common_rosdeps' version = None uri = None scmtype = 'other' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri, 'meta': {'repo-name': 'skynetish-ros-pkg'}}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(None, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual([{'meta': {'repo-name': 'skynetish-ros-pkg'}}], wrap.get_tags()) self.assertEqual({scmtype: {'local-name': local_name, 'meta': {'repo-name': 'skynetish-ros-pkg'}}}, wrap.get_legacy_yaml()) # properties (undocumented feature required for builds) local_name = 'common_rosdeps' version = None uri = 'some/uri' scmtype = 'git' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri, 'meta': {'repo-name': 'skynetish-ros-pkg'}}} wrap = get_path_spec_from_yaml(struct) self.assertEqual('git', wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual([{'meta': {'repo-name': 'skynetish-ros-pkg'}}], wrap.get_tags()) self.assertEqual({scmtype: {'local-name': local_name, 'uri': 'some/uri', 'meta': {'repo-name': 'skynetish-ros-pkg'}}}, wrap.get_legacy_yaml())
def test_original_syntax_scm(self): # - hg: {local-name: common_rosdeps, version: common_rosdeps-1.0.2, uri: https://kforge.ros.org/common/rosdepcore} local_name = 'common_rosdeps' version = 'common_rosdeps-1.0.2' uri = 'https://kforge.ros.org/common/rosdepcore' scmtype = 'hg' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(scmtype, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual(struct, wrap.get_legacy_yaml()) # empty version local_name = 'common_rosdeps' version = None uri = 'https://kforge.ros.org/common/rosdepcore' scmtype = 'hg' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(scmtype, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual({scmtype: {'local-name': local_name, 'uri': uri}}, wrap.get_legacy_yaml()) # version is a number local_name = 'common_rosdeps' version = 1234 uri = 'https://kforge.ros.org/common/rosdepcore' scmtype = 'hg' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri}} expected_struct = {scmtype: {'local-name': local_name, 'version': str(version), 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(scmtype, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertIsInstance(wrap.get_version(), str) self.assertEqual(uri, wrap.get_uri()) self.assertEqual(expected_struct, wrap.get_legacy_yaml()) # no version local_name = 'common_rosdeps' version = None uri = 'https://kforge.ros.org/common/rosdepcore' scmtype = 'hg' struct = {scmtype: {'local-name': local_name, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(scmtype, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual({'hg': {'local-name': 'common_rosdeps', 'uri': 'https://kforge.ros.org/common/rosdepcore'}}, wrap.get_legacy_yaml()) # other local_name = 'common_rosdeps' version = None uri = None scmtype = 'other' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(None, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual({scmtype: {'local-name': local_name}}, wrap.get_legacy_yaml()) # properties (undocumented feature required for builds) local_name = 'common_rosdeps' version = None uri = None scmtype = 'other' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri, 'meta': {'repo-name': 'skynetish-ros-pkg'}}} wrap = get_path_spec_from_yaml(struct) self.assertEqual(None, wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual([{'meta': {'repo-name': 'skynetish-ros-pkg'}}], wrap.get_tags()) self.assertEqual({scmtype: {'local-name': local_name, 'meta': {'repo-name': 'skynetish-ros-pkg'}}}, wrap.get_legacy_yaml()) # properties (undocumented feature required for builds) local_name = 'common_rosdeps' version = None uri = 'some/uri' scmtype = 'git' struct = {scmtype: {'local-name': local_name, 'version': version, 'uri': uri, 'meta': {'repo-name': 'skynetish-ros-pkg'}}} wrap = get_path_spec_from_yaml(struct) self.assertEqual('git', wrap.get_scmtype()) self.assertEqual(scmtype, wrap.get_legacy_type()) self.assertEqual(version, wrap.get_version()) self.assertEqual(uri, wrap.get_uri()) self.assertEqual([{'meta': {'repo-name': 'skynetish-ros-pkg'}}], wrap.get_tags()) self.assertEqual({scmtype: {'local-name': local_name, 'uri': 'some/uri', 'meta': {'repo-name': 'skynetish-ros-pkg'}}}, wrap.get_legacy_yaml())
def cmd_merge(self, target_path, argv, config=None): parser = OptionParser( usage="usage: %s merge [URI] [OPTIONS]" % self.progname, formatter=IndentedHelpFormatterWithNL(), description=__MULTIPRO_CMD_DICT__["merge"] + """. The command merges config with given other rosinstall element sets, from files or web uris. The default workspace will be inferred from context, you can specify one using -t. By default, when an element in an additional URI has the same local-name as an existing element, the existing element will be replaced. In order to ensure the ordering of elements is as provided in the URI, use the option --merge-kill-append. Examples: $ %(prog)s merge someother.rosinstall You can use '-' to pipe in input, as an example: $ roslocate info robot_model | %(prog)s merge - """ % {'prog': self.progname}, epilog="See: http://www.ros.org/wiki/rosinstall for details\n") # same options as for multiproject parser.add_option( "-a", "--merge-kill-append", dest="merge_kill_append", default=False, help="merge by deleting given entry and appending new one", action="store_true") parser.add_option("-k", "--merge-keep", dest="merge_keep", default=False, help="merge by keeping existing entry and discarding new one", action="store_true") parser.add_option("-r", "--merge-replace", dest="merge_replace", default=False, help="(default) merge by replacing given entry with new one maintaining ordering", action="store_true") parser.add_option("-y", "--confirm-all", dest="confirm_all", default='', help="do not ask for confirmation unless strictly necessary", action="store_true") # required here but used one layer above parser.add_option( "-t", "--target-workspace", dest="workspace", default=None, help="which workspace to use", action="store") (options, args) = parser.parse_args(argv) if len(args) > 1: print("Error: Too many arguments.") print(parser.usage) return -1 if len(args) == 0: print("Error: Too few arguments.") print(parser.usage) return -1 config_uris = args specs = [] if config_uris[0] == '-': pipedata = "".join(sys.stdin.readlines()) try: yamldicts = yaml.load(pipedata) except yaml.YAMLError as e: raise MultiProjectException( "Invalid yaml format: \n%s \n%s" % (pipedata, e)) if yamldicts is None: parser.error("No Input read from stdin") # cant have user interaction and piped input options.confirm_all = True specs.extend([get_path_spec_from_yaml(x) for x in yamldicts]) config_uris = [] merge_strategy = None count_mergeoptions = 0 if options.merge_kill_append: merge_strategy = 'KillAppend' count_mergeoptions += 1 if options.merge_keep: merge_strategy = 'MergeKeep' count_mergeoptions += 1 if options.merge_replace: merge_strategy = 'MergeReplace' count_mergeoptions += 1 if count_mergeoptions > 1: parser.error("You can only provide one merge-strategy") # default option if count_mergeoptions == 0: merge_strategy = 'MergeReplace' (newconfig, _) = prompt_merge( target_path, additional_uris=config_uris, additional_specs=specs, path_change_message="element order changed", merge_strategy=merge_strategy, confirmed=options.confirm_all, config_filename=self.config_filename, config=config, allow_other_element=self.allow_other_element) if newconfig is not None: print("Config changed, maybe you need run %s update to update SCM entries." % self.progname) print("Overwriting %s" % os.path.join(newconfig.get_base_path(), self.config_filename)) shutil.move(os.path.join(newconfig.get_base_path(), self.config_filename), "%s.bak" % os.path.join(newconfig.get_base_path(), self.config_filename)) self.config_generator(newconfig, self.config_filename, get_header(self.progname)) print("\nupdate complete.") else: print("Merge caused no change, no new elements found") return 0