示例#1
0
def test_create_default_installer_context():
    import rosdep2

    # test both constructors
    for context in [rosdep2.create_default_installer_context(), rosdep2.create_default_installer_context(verbose=True)]:
        assert context is not None
        assert isinstance(context, rosdep2.InstallerContext)

        # this is just tripwire as we actual value will change over time
        from rospkg.os_detect import OS_UBUNTU, OsDetect
        assert OS_UBUNTU in context.get_os_keys()
        assert context.get_installer('apt') is not None
        assert 'apt' in context.get_os_installer_keys(OS_UBUNTU)
        assert OsDetect.get_codename == context.get_os_version_type(OS_UBUNTU)
示例#2
0
def test_RosdepLookup_resolve_all():
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()

    sources_loader = create_test_SourcesListLoader()
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack,
                                             rosstack=rosstack,
                                             sources_loader=sources_loader)
    installer_context = create_default_installer_context()
    installer_context.set_os_override('ubuntu', 'lucid')

    # repeat for caching
    lookup.verbose = True
    for count in range(0, 2):
        resolutions, errors = lookup.resolve_all(
            ['rospack_fake', 'roscpp_fake'], installer_context)
        assert not errors, errors
        installer_keys, resolveds = zip(*resolutions)
        assert 'apt' in installer_keys
        apt_resolutions = []
        for k, v in resolutions:
            if k == 'apt':
                apt_resolutions.extend(v)
        assert set(apt_resolutions) == set([
            'libtinyxml-dev', 'libboost1.40-all-dev', 'libtool', 'libltdl-dev'
        ]), set(apt_resolutions)
def resolve_rosdeps(rosdep_keys, platform, rospack, rosstack):
    """
    Resolve rosdep keys on an 'ubuntu' OS, for the specified ubuntu
    platform release version.
    
    NOTE: one flaw in this implementation is that it uses the rosdep
    view from the *active environment* to generate the rosdeps. It
    does not generate them from specific versions of stacks. The hope
    is that rosdeps improve monotonically over time, so that this will
    not be a major issue.

    :param platform: platform name (e.g. lucid)

    :returns: list of system package deps, ``str``

    :raises :exc:`KeyError` if no key for rosdep exists
    :raises :exc:`rosdep2.ResolutionError` if rosdeps for stack cannot be resolved on the specified platform
    :raises :exc:`rospkg.ResourceNotFound` if stack cannot be found
    :raises :exc:`rosdep2.UnsupportedOs`
    """
    lookup = create_rosdep_lookup(rospack, rosstack)

    # get the apt installer
    context = rosdep2.create_default_installer_context()
    installer = context.get_installer(INSTALLER_KEY)

    # resolve the keys
    resolved = []
    for rosdep_name in rosdep_keys:
        view = lookup.get_rosdep_view(DEFAULT_VIEW_KEY)
        d = view.lookup(rosdep_name)
        _, rule = d.get_rule_for_platform(OS_NAME, platform, [INSTALLER_KEY], INSTALLER_KEY)
        resolved.extend(installer.resolve(rule))
    return list(set(resolved))
示例#4
0
def resolve_rosdep_key(
    key,
    os_name,
    os_version,
    ros_distro=None,
    ignored=None
):
    ignored = ignored or []
    ctx = create_default_installer_context()
    try:
        installer_key = ctx.get_default_os_installer_key(os_name)
    except KeyError:
        raise UnresolvedDependency(
            "could not resolve package {} for os {}."
            .format(key, os_name)
        )
    installer = ctx.get_installer(installer_key)
    ros_distro = ros_distro or DEFAULT_ROS_DISTRO
    view = get_view(os_name, os_version, ros_distro)
    try:
        return resolve_more_for_os(key, view, installer, os_name, os_version)
    except (KeyError, ResolutionError):
        raise UnresolvedDependency(
            "could not resolve package {} for os {}."
            .format(key, os_name)
        )
示例#5
0
文件: common.py 项目: nayomal/bloom
def resolve_rosdep_key(key, os_name, os_version, ros_distro=None, ignored=None, retry=True):
    ignored = ignored or []
    ctx = create_default_installer_context()
    try:
        installer_key = ctx.get_default_os_installer_key(os_name)
    except KeyError:
        BloomGenerator.exit("Could not determine the installer for '{0}'".format(os_name))
    installer = ctx.get_installer(installer_key)
    ros_distro = ros_distro or DEFAULT_ROS_DISTRO
    view = get_view(os_name, os_version, ros_distro)
    try:
        return resolve_more_for_os(key, view, installer, os_name, os_version)
    except (KeyError, ResolutionError) as exc:
        debug(traceback.format_exc())
        if key in ignored:
            return None, None, None
        if isinstance(exc, KeyError):
            error("Could not resolve rosdep key '{0}'".format(key))
            returncode = code.GENERATOR_NO_SUCH_ROSDEP_KEY
        else:
            error("Could not resolve rosdep key '{0}' for distro '{1}':".format(key, os_version))
            info(str(exc), use_prefix=False)
            returncode = code.GENERATOR_NO_ROSDEP_KEY_FOR_DISTRO
        if retry:
            error("Try to resolve the problem with rosdep and then continue.")
            if maybe_continue():
                update_rosdep()
                invalidate_view_cache()
                return resolve_rosdep_key(key, os_name, os_version, ros_distro, ignored, retry=True)
        BloomGenerator.exit("Failed to resolve rosdep key '{0}', aborting.".format(key), returncode=returncode)
示例#6
0
def resolve_rosdeps(rosdep_keys, platform, rospack, rosstack):
    """
    Resolve rosdep keys on an 'ubuntu' OS, for the specified ubuntu
    platform release version.
    
    NOTE: one flaw in this implementation is that it uses the rosdep
    view from the *active environment* to generate the rosdeps. It
    does not generate them from specific versions of stacks. The hope
    is that rosdeps improve monotonically over time, so that this will
    not be a major issue.

    :param platform: platform name (e.g. lucid)

    :returns: list of system package deps, ``str``

    :raises :exc:`KeyError` if no key for rosdep exists
    :raises :exc:`rosdep2.ResolutionError` if rosdeps for stack cannot be resolved on the specified platform
    :raises :exc:`rospkg.ResourceNotFound` if stack cannot be found
    :raises :exc:`rosdep2.UnsupportedOs`
    """
    lookup = create_rosdep_lookup(rospack, rosstack)

    # get the apt installer
    context = rosdep2.create_default_installer_context()
    installer = context.get_installer(INSTALLER_KEY)

    # resolve the keys
    resolved = []
    for rosdep_name in rosdep_keys:
        view = lookup.get_rosdep_view(DEFAULT_VIEW_KEY)
        d = view.lookup(rosdep_name)
        _, rule = d.get_rule_for_platform(OS_NAME, platform, [INSTALLER_KEY],
                                          INSTALLER_KEY)
        resolved.extend(installer.resolve(rule))
    return list(set(resolved))
示例#7
0
    def __init__(self,
                 indexer,
                 ros_distro=None,
                 os_name=None,
                 os_codename=None):
        self.indexer = indexer

        if not os_name:
            os_detector = rospkg.os_detect.OsDetect()
            self.os_name = os_detector.get_name()
            self.os_codename = os_detector.get_codename()

        # FIXME: there should be a way to set this without using an environment variable
        if ros_distro:
            os.environ['ROS_DISTRO'] = ros_distro

        self.sources_loader = SourcesListLoader.create_default(verbose=False)
        self.lookup = RosdepLookup.create_from_rospkg(
            sources_loader=self.sources_loader)
        self.installer_context = create_default_installer_context(
            verbose=False)
        self.installer_keys = self.installer_context.get_os_installer_keys(
            self.os_name)

        self.default_key = self.installer_context.get_default_os_installer_key(
            self.os_name)
        self.installer = self.installer_context.get_installer(self.default_key)

        self.view = self.lookup.get_rosdep_view(DEFAULT_VIEW_KEY,
                                                verbose=False)
示例#8
0
def resolve_rosdep_key(key, quiet=False):
    sources_loader = SourcesListLoader.create_default(
        sources_cache_dir=get_sources_cache_dir(),
        os_override=None,
        verbose=False)
    lookup = RosdepLookup.create_from_rospkg(sources_loader=sources_loader)
    lookup.verbose = False

    installer_context = create_default_installer_context(verbose=False)

    installer, installer_keys, default_key, \
        os_name, os_version = get_default_installer(
            installer_context=installer_context,
            verbose=False)

    view = lookup.get_rosdep_view(DEFAULT_VIEW_KEY, verbose=False)
    try:
        d = view.lookup(key)
    except KeyError as e:
        sys.stderr.write('Invalid key "{}": {}\n'.format(key, e))
        return

    rule_installer, rule = d.get_rule_for_platform(os_name, os_version,
                                                   installer_keys, default_key)

    installer = installer_context.get_installer(rule_installer)
    resolved = installer.resolve(rule)

    for error in lookup.get_errors():
        if not quiet:
            print('WARNING: %s' % (error), file=sys.stderr)

    return {installer: resolved}
示例#9
0
def test_RosdepLookup_resolve():
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()
    
    sources_loader = create_test_SourcesListLoader()
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack, rosstack=rosstack,
                                             sources_loader=sources_loader)
    installer_context = create_default_installer_context()
    installer_context.set_os_override('ubuntu', 'lucid')

    # repeat for caching
    for count in xrange(0, 2):
        installer_key, resolution, dependencies = lookup.resolve('testtinyxml', 'rospack_fake', installer_context)
        assert 'apt' == installer_key
        assert ['libtinyxml-dev'] == resolution
        assert [] == dependencies

        installer_key, resolution, dependencies = lookup.resolve('testboost', 'roscpp_fake', installer_context)
        assert 'apt' == installer_key
        assert ['libboost1.40-all-dev'] == resolution
        assert [] == dependencies

        installer_key, resolution, dependencies = lookup.resolve('testlibtool', 'roscpp_fake', installer_context)
        assert 'apt' == installer_key
        assert set(['libtool', 'libltdl-dev']) == set(resolution)
        assert [] == dependencies
示例#10
0
def test_RosdepInstaller_install_resolved():
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    from rosdep2.installers import RosdepInstaller
    from rosdep2.platforms.debian import APT_INSTALLER
    
    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()
    
    # create our test fixture.  use most of the default toolchain, but
    # replace the apt installer with one that we can have more fun
    # with.  we will do all tests with ubuntu lucid keys -- other
    # tests should cover different resolution cases.
    sources_loader = create_test_SourcesListLoader()
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack, rosstack=rosstack, sources_loader=sources_loader)
    context = create_default_installer_context()
    context.set_os_override('ubuntu', 'lucid')
    installer = RosdepInstaller(context, lookup)
    
    with fakeout() as (stdout, stderr):
        installer.install_resolved(APT_INSTALLER, [], simulate=True, verbose=False)
    with fakeout() as (stdout, stderr):
        installer.install_resolved(APT_INSTALLER, [], simulate=True, verbose=True)
    assert stdout.getvalue().strip() == '#No packages to install'
    with fakeout() as (stdout, stderr):            
        installer.install_resolved(APT_INSTALLER, ['rosdep-fake1', 'rosdep-fake2'], simulate=True, verbose=True)
    stdout_lines = [x.strip() for x in stdout.getvalue().split('\n') if x.strip()]
    assert stdout_lines == ['#[apt] Installation commands:',
                            'sudo apt-get install rosdep-fake1',
                            'sudo apt-get install rosdep-fake2',
                            ], ("%s: %s"%(stdout.getvalue(), stdout_lines))
示例#11
0
def test_RosdepLookup_resolve():
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()

    sources_loader = create_test_SourcesListLoader()
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack,
                                             rosstack=rosstack,
                                             sources_loader=sources_loader)
    installer_context = create_default_installer_context()
    installer_context.set_os_override('ubuntu', 'lucid')

    # repeat for caching
    for count in range(0, 2):
        installer_key, resolution, dependencies = lookup.resolve(
            'testtinyxml', 'rospack_fake', installer_context)
        assert 'apt' == installer_key
        assert ['libtinyxml-dev'] == resolution
        assert [] == dependencies

        installer_key, resolution, dependencies = lookup.resolve(
            'testboost', 'roscpp_fake', installer_context)
        assert 'apt' == installer_key
        assert ['libboost1.40-all-dev'] == resolution
        assert [] == dependencies

        installer_key, resolution, dependencies = lookup.resolve(
            'testlibtool', 'roscpp_fake', installer_context)
        assert 'apt' == installer_key
        assert set(['libtool', 'libltdl-dev']) == set(resolution)
        assert [] == dependencies
def test_RosdepInstaller_get_uninstalled_unconfigured():
    from rosdep2 import create_default_installer_context, RosdepInternalError
    from rosdep2.lookup import RosdepLookup, ResolutionError
    from rosdep2.installers import RosdepInstaller, PackageManagerInstaller
    from rosdep2.platforms.debian import APT_INSTALLER
    
    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()
    
    sources_loader = create_test_SourcesListLoader()
    # create our test fixture.  we want to setup a fixture that cannot resolve the rosdep data in order to test error conditions
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack, rosstack=rosstack, sources_loader=sources_loader)
    context = create_default_installer_context()
    context.set_os_override('ubuntu', 'lucid')
    installer = RosdepInstaller(context, lookup)
    # - delete the apt installer
    context.set_installer(APT_INSTALLER, None)

    for verbose in [True, False]:
        uninstalled, errors = installer.get_uninstalled(['empty'], verbose)
        assert not uninstalled, uninstalled
        assert not errors

        # make sure there is an error when we lookup something that resolves to an apt depend
        uninstalled, errors = installer.get_uninstalled(['roscpp_fake'], verbose)
        assert not uninstalled, uninstalled
        assert errors.keys() == ['roscpp_fake']

        uninstalled, errors = installer.get_uninstalled(['roscpp_fake', 'stack1_p1'], verbose)
        assert not uninstalled, uninstalled
        assert set(errors.keys()) == set(['roscpp_fake', 'stack1_p1'])
        print(errors)
        assert isinstance(errors['roscpp_fake'], ResolutionError), errors['roscpp_fake'][0]

    # fake/bad installer to test that we re-cast general installer issues
    class BadInstaller(PackageManagerInstaller):
        def __init__(self):
            super(BadInstaller, self).__init__(lambda x: x)
        def get_packages_to_install(*args):
            raise Exception("deadbeef")
    context.set_installer(APT_INSTALLER, BadInstaller())
    try:
        installer.get_uninstalled(['roscpp_fake'])
        assert False, "should have raised"
    except RosdepInternalError as e:
        assert 'apt' in str(e)
    
    # annoying mock to test generally impossible error condition
    from mock import Mock
    lookup = Mock(spec=RosdepLookup)
    lookup.resolve_all.return_value = ([('bad-key', ['stuff'])], [])
    
    installer = RosdepInstaller(context, lookup)
    try:
        installer.get_uninstalled(['roscpp_fake'])
        assert False, "should have raised"
    except RosdepInternalError:
        pass
示例#13
0
def main(args=None, get_subs_fn=None):
    get_subs_fn = get_subs_fn or get_subs
    _place_template_files = True
    _process_template_files = True
    package_path = os.getcwd()
    if args is not None:
        package_path = args.package_path or os.getcwd()
        _place_template_files = args.place_template_files
        _process_template_files = args.process_template_files

    pkgs_dict = find_packages(package_path)
    if len(pkgs_dict) == 0:
        sys.exit("No packages found in path: '{0}'".format(package_path))
    if len(pkgs_dict) > 1:
        sys.exit("Multiple packages found, " "this tool only supports one package at a time.")

    os_data = create_default_installer_context().get_os_name_and_version()
    os_name, os_version = os_data
    ros_distro = os.environ.get("ROS_DISTRO", "indigo")

    # Allow args overrides
    os_name = args.os_name or os_name
    os_version = args.os_version or os_version
    ros_distro = args.ros_distro or ros_distro

    # Summarize
    info(
        fmt("@!@{gf}==> @|")
        + fmt(
            "Generating debs for @{cf}%s:%s@| for package(s) %s"
            % (os_name, os_version, [p.name for p in pkgs_dict.values()])
        )
    )

    for path, pkg in pkgs_dict.items():
        template_files = None
        try:
            subs = get_subs_fn(pkg, os_name, os_version, ros_distro)
            if _place_template_files:
                # Place template files
                place_template_files(path)
            if _process_template_files:
                # Just process existing template files
                template_files = process_template_files(path, subs)
            if not _place_template_files and not _process_template_files:
                # If neither, do both
                place_template_files(path)
                template_files = process_template_files(path, subs)
            if template_files is not None:
                for template_file in template_files:
                    os.remove(os.path.normpath(template_file))
        except Exception as exc:
            debug(traceback.format_exc())
            error(type(exc).__name__ + ": " + str(exc), exit=True)
        except (KeyboardInterrupt, EOFError):
            sys.exit(1)
示例#14
0
def init_environment():
    global os_name, os_version, rdistro, ctx, os_installers, default_os_installer, dist_data, rindex, rcache, rview

    ctx = create_default_installer_context()
    os_installers = ctx.get_os_installer_keys(os_name)
    default_os_installer = ctx.get_default_os_installer_key(os_name)
    rindex = get_index(get_index_url())
    dist_data = _get_dist_file_data(rindex, rdistro, 'distribution')
    rcache = get_distribution(rindex, rdistro)
    rview = get_catkin_view(rdistro, os_name, os_version, False)
示例#15
0
def test_RosdepInstaller_ctor():
    # tripwire/coverage
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    from rosdep2.installers import RosdepInstaller
    lookup = RosdepLookup.create_from_rospkg()
    context = create_default_installer_context()
    installer = RosdepInstaller(context, lookup)
    assert lookup == installer.lookup
    assert context == installer.installer_context
def test_RosdepInstaller_ctor():
    # tripwire/coverage
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    from rosdep2.installers import RosdepInstaller
    lookup = RosdepLookup.create_from_rospkg()
    context = create_default_installer_context()
    installer = RosdepInstaller(context, lookup)
    assert lookup == installer.lookup
    assert context == installer.installer_context    
示例#17
0
def build_debian_pkg(args=None, get_subs_fn=None):
    get_subs_fn = get_subs_fn or get_subs
    _place_template_files = True
    _process_template_files = True
    package_path = os.getcwd()
    if args is not None:
        package_path = args.package_path or os.getcwd()
        _place_template_files = args.place_template_files
        _process_template_files = args.process_template_files

    pkgs_dict = find_packages(package_path)
    if len(pkgs_dict) == 0:
        sys.exit("No packages found in path: '{0}'".format(package_path))
    # if len(pkgs_dict) > 1:
    #     sys.exit("Multiple packages found, "
    #              "this tool only supports one package at a time.")

    os_data = create_default_installer_context().get_os_name_and_version()
    os_name, os_version = os_data
    ros_distro = os.environ.get('ROS_DISTRO', 'indigo')

    # Allow args overrides
    os_name = args.os_name or os_name
    os_version = args.os_version or os_version
    ros_distro = args.ros_distro or ros_distro
    install_prefix = args.install_prefix or "/opt"

    # Summarize
    info(fmt("@!@{gf}==> @|") +
         fmt("Generating debs for @{cf}%s:%s@| for package(s) %s" %
             (os_name, os_version, [p.name for p in pkgs_dict.values()])))

    # Test Creating single
    all_subs = merge_packages(pkgs_dict, get_subs_fn, os_name, os_version, ros_distro, install_prefix, args.native)
    path = ''
    build_type = 'cmake'
    try:
        if _place_template_files:
            # Place template files
            place_template_files(path, build_type)
        if _process_template_files:
            # Just process existing template files
            template_files = process_template_files(path, all_subs)
        if not _place_template_files and not _process_template_files:
            # If neither, do both
            place_template_files(path, build_type)
            template_files = process_template_files(path, all_subs)
        if template_files is not None:
            for template_file in template_files:
                os.remove(os.path.normpath(template_file))
    except Exception as exc:
        debug(traceback.format_exc())
        error(type(exc).__name__ + ": " + str(exc), exit=True)
    except (KeyboardInterrupt, EOFError):
        sys.exit(1)
示例#18
0
    def __init__(self):  # noqa: D107
        installer_context = create_default_installer_context(verbose=False)
        self.installer, self.installer_keys, self.default_key, \
            self.os_name, self.os_version = get_default_installer(
                installer_context=installer_context, verbose=False)

        sources_loader = SourcesListLoader.create_default()
        lookup = RosdepLookup.create_from_rospkg(sources_loader=sources_loader)
        lookup.verbose = True

        self.view = lookup.get_rosdep_view(DEFAULT_VIEW_KEY, verbose=False)
示例#19
0
def test_RosdepInstaller_get_uninstalled():
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    from rosdep2.installers import RosdepInstaller
    from rosdep2.platforms.debian import APT_INSTALLER
    
    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()
    
    # create our test fixture.  use most of the default toolchain, but
    # replace the apt installer with one that we can have more fun
    # with.  we will do all tests with ubuntu lucid keys -- other
    # tests should cover different resolution cases.
    sources_loader = create_test_SourcesListLoader()
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack, rosstack=rosstack, sources_loader=sources_loader)
    context = create_default_installer_context()
    context.set_os_override('ubuntu', 'lucid')
    installer = RosdepInstaller(context, lookup)
    
    # in this first test, detect_fn detects everything as installed
    fake_apt = get_fake_apt(lambda x: x)
    context.set_installer(APT_INSTALLER, fake_apt)

    for verbose in [True, False]:
        tests = [['roscpp_fake'], ['roscpp_fake', 'rospack_fake'], ['empty_package'],
                 ['roscpp_fake', 'rospack_fake', 'empty_package'],
                 ['roscpp_fake', 'rospack_fake'],
                 ]
        for test in tests:
            uninstalled, errors = installer.get_uninstalled(test, verbose)
            assert not uninstalled, uninstalled
            assert not errors, errors

    # in this second test, detect_fn detects nothing as installed
    fake_apt = get_fake_apt(lambda x: [])
    context.set_installer(APT_INSTALLER, fake_apt)

    for verbose in [True, False]:
        uninstalled, errors = installer.get_uninstalled(['empty'], verbose)
        assert not uninstalled, uninstalled
        assert not errors

        expected = set(['libltdl-dev', 'libboost1.40-all-dev', 'libtool'])
        uninstalled, errors = installer.get_uninstalled(['roscpp_fake'], verbose)
        assert uninstalled.keys() == [APT_INSTALLER]
        assert set(uninstalled[APT_INSTALLER]) == expected
        assert not errors

        expected = ['libtinyxml-dev']
        uninstalled, errors = installer.get_uninstalled(['rospack_fake'], verbose)
        assert uninstalled.keys() == [APT_INSTALLER]
        assert uninstalled[APT_INSTALLER] == expected, uninstalled
        assert not errors
示例#20
0
def test_RosdepInstaller_install_resolved():
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    from rosdep2.installers import RosdepInstaller
    from rosdep2.platforms.debian import APT_INSTALLER

    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()

    # create our test fixture.  use most of the default toolchain, but
    # replace the apt installer with one that we can have more fun
    # with.  we will do all tests with ubuntu lucid keys -- other
    # tests should cover different resolution cases.
    sources_loader = create_test_SourcesListLoader()
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack,
                                             rosstack=rosstack,
                                             sources_loader=sources_loader)
    context = create_default_installer_context()
    context.set_os_override('ubuntu', 'lucid')
    installer = RosdepInstaller(context, lookup)

    with fakeout() as (stdout, stderr):
        installer.install_resolved(APT_INSTALLER, [],
                                   simulate=True,
                                   verbose=False)
    with fakeout() as (stdout, stderr):
        installer.install_resolved(APT_INSTALLER, [],
                                   simulate=True,
                                   verbose=True)
    assert stdout.getvalue().strip() == '#No packages to install'
    with fakeout() as (stdout, stderr):
        try:
            installer.install_resolved(APT_INSTALLER,
                                       ['rosdep-fake1', 'rosdep-fake2'],
                                       simulate=True,
                                       verbose=True)
        except OSError as e:
            if str(e).count('[Errno 2] No such file or directory') == 0:
                raise
            return True
    stdout_lines = [
        x.strip() for x in stdout.getvalue().split('\n') if x.strip()
    ]
    assert stdout_lines == [
        '#[apt] Installation commands:',
        'sudo apt-get install rosdep-fake1',
        'sudo apt-get install rosdep-fake2',
    ], ("%s: %s" % (stdout.getvalue(), stdout_lines))
def initialize_resolver(rosdistro_name, os_name, os_code_name):
    # resolve rosdep keys into binary package names
    ctx = create_default_installer_context()
    try:
        installer_key = ctx.get_default_os_installer_key(os_name)
    except KeyError:
        raise RuntimeError(
            "Could not determine the rosdep installer for '%s'" % os_name)
    installer = ctx.get_installer(installer_key)
    view = get_catkin_view(rosdistro_name, os_name, os_code_name, update=False)
    return {
        'os_name': os_name,
        'os_code_name': os_code_name,
        'installer': installer,
        'view': view,
    }
def initialize_resolver(rosdistro_name, os_name, os_code_name):
    # resolve rosdep keys into binary package names
    ctx = create_default_installer_context()
    try:
        installer_key = ctx.get_default_os_installer_key(os_name)
    except KeyError:
        raise RuntimeError(
            "Could not determine the rosdep installer for '%s'" % os_name)
    installer = ctx.get_installer(installer_key)
    view = get_catkin_view(rosdistro_name, os_name, os_code_name, update=False)
    return {
        'os_name': os_name,
        'os_code_name': os_code_name,
        'installer': installer,
        'view': view,
    }
示例#23
0
文件: common.py 项目: nayomal/bloom
def resolve_more_for_os(rosdep_key, view, installer, os_name, os_version):
    """
    Resolve rosdep key to dependencies and installer key.
    (This was copied from rosdep2.catkin_support)

    :param os_name: OS name, e.g. 'ubuntu'
    :returns: resolved key, resolved installer key, and default installer key

    :raises: :exc:`rosdep2.ResolutionError`
    """
    d = view.lookup(rosdep_key)
    ctx = create_default_installer_context()
    os_installers = ctx.get_os_installer_keys(os_name)
    default_os_installer = ctx.get_default_os_installer_key(os_name)
    inst_key, rule = d.get_rule_for_platform(os_name, os_version, os_installers, default_os_installer)
    assert inst_key in os_installers
    return installer.resolve(rule), inst_key, default_os_installer
示例#24
0
def resolve_more_for_os(rosdep_key, view, installer, os_name, os_version):
    """
    Resolve rosdep key to dependencies and installer key.
    (This was copied from rosdep2.catkin_support)

    :param os_name: OS name, e.g. 'ubuntu'
    :returns: resolved key, resolved installer key, and default installer key

    :raises: :exc:`rosdep2.ResolutionError`
    """
    d = view.lookup(rosdep_key)
    ctx = create_default_installer_context()
    os_installers = ctx.get_os_installer_keys(os_name)
    default_os_installer = ctx.get_default_os_installer_key(os_name)
    inst_key, rule = d.get_rule_for_platform(os_name, os_version, os_installers, default_os_installer)
    assert inst_key in os_installers
    return installer.resolve(rule), inst_key, default_os_installer
示例#25
0
def resolve_rosdep_key(key,
                       os_name,
                       os_version,
                       ros_distro=None,
                       ignored=None,
                       retry=True):
    ignored = ignored or []
    ctx = create_default_installer_context()
    try:
        installer_key = ctx.get_default_os_installer_key(os_name)
    except KeyError:
        BloomGenerator.exit(
            "Could not determine the installer for '{0}'".format(os_name))
    installer = ctx.get_installer(installer_key)
    ros_distro = ros_distro or DEFAULT_ROS_DISTRO
    view = get_view(os_name, os_version, ros_distro)
    try:
        return resolve_more_for_os(key, view, installer, os_name, os_version)
    except (KeyError, ResolutionError) as exc:
        debug(traceback.format_exc())
        if key in ignored:
            return None, None, None
        if isinstance(exc, KeyError):
            error("Could not resolve rosdep key '{0}'".format(key))
            returncode = code.GENERATOR_NO_SUCH_ROSDEP_KEY
        else:
            error(
                "Could not resolve rosdep key '{0}' for distro '{1}':".format(
                    key, os_version))
            info(str(exc), use_prefix=False)
            returncode = code.GENERATOR_NO_ROSDEP_KEY_FOR_DISTRO
        if retry:
            error("Try to resolve the problem with rosdep and then continue.")
            if maybe_continue():
                update_rosdep()
                invalidate_view_cache()
                return resolve_rosdep_key(key,
                                          os_name,
                                          os_version,
                                          ros_distro,
                                          ignored,
                                          retry=True)
        BloomGenerator.exit(
            "Failed to resolve rosdep key '{0}', aborting.".format(key),
            returncode=returncode)
示例#26
0
def test_RosdepLookup_resolve_all():
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()
    
    sources_loader = create_test_SourcesListLoader()
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack, rosstack=rosstack,
                                             sources_loader=sources_loader)
    installer_context = create_default_installer_context()
    installer_context.set_os_override('ubuntu', 'lucid')

    # repeat for caching
    lookup.verbose = True
    for count in xrange(0, 2):
        resolutions, errors = lookup.resolve_all(['rospack_fake', 'roscpp_fake'], installer_context)
        assert not errors, errors
        assert 'apt' in resolutions
        assert set(resolutions['apt']) == set(['libtinyxml-dev', 'libboost1.40-all-dev', 'libtool', 'libltdl-dev']), set(resolutions['apt'])
示例#27
0
def resolve(ros_distro, deps):
    lookup = load_lookup()
    installer_context = rosdep2.create_default_installer_context()
    os_name, os_version = installer_context.get_os_name_and_version()
    installer_keys = installer_context.get_os_installer_keys(os_name)
    default_key = installer_context.get_default_os_installer_key(os_name)

    keys = []
    not_provided = []
    for dep in deps:
        if dep is None:
            continue

        view = lookup.get_rosdep_view(rosdep2.rospkg_loader.DEFAULT_VIEW_KEY)
        try:
            d = view.lookup(dep.name)
        except KeyError as e:
            keys.append(
                ros_pkgname_to_pkgname(ros_distro, dep.name) + dep.version)
            continue
        try:
            rule_installer, rule = d.get_rule_for_platform(
                os_name, os_version, installer_keys, default_key)
        except rosdep2.lookup.ResolutionError as e:
            # ignoring ROS packages since Alpine ROS packages are not solvable at now
            if '_is_ros' in e.rosdep_data:
                if e.rosdep_data['_is_ros']:
                    keys.append(
                        ros_pkgname_to_pkgname(ros_distro, dep.name) +
                        dep.version)
                    continue
            not_provided.append(dep.name)
            continue
        installer = installer_context.get_installer(rule_installer)
        resolved = installer.resolve(rule)
        for r in resolved:
            keys.append(r + dep.version)
    if len(not_provided) > 0:
        print('Some package is not provided by native installer: ' +
              ' '.join(not_provided),
              file=sys.stderr)
        return None
    return keys
示例#28
0
文件: resolver.py 项目: fkie/rosrepo
 def __init__(self):
     self.cached_installers = {}
     gc.disable()
     try:
         import sys
         from . import dummy_pkg_resources
         sys.modules["pkg_resources"] = dummy_pkg_resources
         from rosdep2.lookup import RosdepLookup
         from rosdep2.rospkg_loader import DEFAULT_VIEW_KEY
         from rosdep2 import get_default_installer, create_default_installer_context
         self.lookup = RosdepLookup.create_from_rospkg(rospack=DummyRospkg(), rosstack=DummyRospkg())
         self.view = self.lookup.get_rosdep_view(DEFAULT_VIEW_KEY)
         self.installer_ctx = create_default_installer_context()
         _, self.installer_keys, self.default_key, \
             self.os_name, self.os_version = get_default_installer(self.installer_ctx)
     except Exception as e:
         error("failed to initialize rosdep: %s" % str(e))
         self.view = None
     gc.enable()
示例#29
0
文件: resolver.py 项目: fkie/rosrepo
 def __init__(self):
     self.cached_installers = {}
     gc.disable()
     try:
         import sys
         from . import dummy_pkg_resources
         sys.modules["pkg_resources"] = dummy_pkg_resources
         from rosdep2.lookup import RosdepLookup
         from rosdep2.rospkg_loader import DEFAULT_VIEW_KEY
         from rosdep2 import get_default_installer, create_default_installer_context
         self.lookup = RosdepLookup.create_from_rospkg(
             rospack=DummyRospkg(), rosstack=DummyRospkg())
         self.view = self.lookup.get_rosdep_view(DEFAULT_VIEW_KEY)
         self.installer_ctx = create_default_installer_context()
         _, self.installer_keys, self.default_key, \
             self.os_name, self.os_version = get_default_installer(self.installer_ctx)
     except Exception as e:
         error("failed to initialize rosdep: %s" % str(e))
         self.view = None
     gc.enable()
示例#30
0
    def __init__(self, indexer, ros_distro=None, os_name=None, os_codename=None):
        self.indexer = indexer

        if not os_name:
            os_detector = rospkg.os_detect.OsDetect()
            self.os_name = os_detector.get_name()
            self.os_codename = os_detector.get_codename()

        # FIXME: there should be a way to set this without using an environment variable
        if ros_distro:
            os.environ['ROS_DISTRO'] = ros_distro

        self.sources_loader = SourcesListLoader.create_default(verbose=False)
        self.lookup = RosdepLookup.create_from_rospkg(sources_loader=self.sources_loader)
        self.installer_context = create_default_installer_context(verbose=False)
        self.installer_keys = self.installer_context.get_os_installer_keys(self.os_name)

        self.default_key = self.installer_context.get_default_os_installer_key(self.os_name)
        self.installer = self.installer_context.get_installer(self.default_key)

        self.view = self.lookup.get_rosdep_view(DEFAULT_VIEW_KEY, verbose=False)
示例#31
0
文件: utils.py 项目: alberth/ros-get
def get_rosdep(key):
    installer_context = create_default_installer_context(verbose=False)

    installer, installer_keys, default_key, os_name, os_version = get_default_installer(
        installer_context=installer_context, verbose=False)

    global cached_view
    if not cached_view:
        lookup = RosdepLookup.create_from_rospkg()
        lookup.verbose = False

        view = lookup.get_rosdep_view(DEFAULT_VIEW_KEY, verbose=False)
        cached_view = view
    else:
        view = cached_view

    try:
        d = view.lookup(key)
        rule_installer, rule = d.get_rule_for_platform(os_name, os_version,
                                                       installer_keys,
                                                       default_key)
        return rule_installer, rule
    except KeyError:
        return False
示例#32
0
 def __init__(self):
     self.installer_context = create_default_installer_context()
     _, self.installer_keys, self.default_key, self.os_name, self.os_version = get_default_installer(
         installer_context=self.installer_context)
     self.lookup = RosdepLookup.create_from_rospkg()
     self.rosdep_view = self.lookup.get_rosdep_view(DEFAULT_VIEW_KEY)
示例#33
0
    'test_msgs',
    'rttest',
    'tlsf',
    'tlsf_cpp',
    'pendulum_control']

rospack = rospkg.RosPack()

source_cache_dir = rosdep2.sources_list.get_sources_cache_dir()

sources_loader = rosdep2.sources_list.SourcesListLoader.create_default(sources_cache_dir=source_cache_dir, os_override=convert_os_override_option())

lookup = rosdep2.lookup.RosdepLookup.create_from_rospkg(rospack=rospack, sources_loader=sources_loader)
view = lookup.get_rosdep_view(rosdep2.rospkg_loader.DEFAULT_VIEW_KEY)

installer_context = rosdep2.create_default_installer_context()
installer_context.set_os_override('conda', '10')

def _resolve(pkg):
    resolved = []
    try:
        d = view.lookup(pkg)
        os_name, os_version = installer_context.get_os_name_and_version()
        rule_installer, rule = d.get_rule_for_platform(
            os_name, os_version,
            installer_context.get_os_installer_keys(os_name),
            installer_context.get_default_os_installer_key(os_name))

        installer = installer_context.get_installer(rule_installer)
        resolved = installer.resolve(rule)
    except:
示例#34
0
def test_RosdepInstaller_get_uninstalled():
    from rosdep2 import create_default_installer_context
    from rosdep2.lookup import RosdepLookup
    from rosdep2.installers import RosdepInstaller
    from rosdep2.platforms.debian import APT_INSTALLER

    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()

    # create our test fixture.  use most of the default toolchain, but
    # replace the apt installer with one that we can have more fun
    # with.  we will do all tests with ubuntu lucid keys -- other
    # tests should cover different resolution cases.
    sources_loader = create_test_SourcesListLoader()
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack,
                                             rosstack=rosstack,
                                             sources_loader=sources_loader)
    context = create_default_installer_context()
    context.set_os_override('ubuntu', 'lucid')
    installer = RosdepInstaller(context, lookup)

    # in this first test, detect_fn detects everything as installed
    fake_apt = get_fake_apt(lambda x: x)
    context.set_installer(APT_INSTALLER, fake_apt)

    for verbose in [True, False]:
        tests = [
            ['roscpp_fake'],
            ['roscpp_fake', 'rospack_fake'],
            ['empty_package'],
            ['roscpp_fake', 'rospack_fake', 'empty_package'],
            ['roscpp_fake', 'rospack_fake'],
        ]
        for test in tests:
            uninstalled, errors = installer.get_uninstalled(test, verbose)
            assert not uninstalled, uninstalled
            assert not errors, errors

    # in this second test, detect_fn detects nothing as installed
    fake_apt = get_fake_apt(lambda x: [])
    context.set_installer(APT_INSTALLER, fake_apt)

    for verbose in [True, False]:
        uninstalled, errors = installer.get_uninstalled(['empty'], verbose)
        assert not uninstalled, uninstalled
        assert not errors

        expected = set(['libltdl-dev', 'libboost1.40-all-dev', 'libtool'])
        uninstalled, errors = installer.get_uninstalled(['roscpp_fake'],
                                                        verbose)
        keys, values = zip(*uninstalled)
        apt_uninstalled = []
        for k, v in uninstalled:
            if k == APT_INSTALLER:
                apt_uninstalled.extend(v)
        assert list(set(keys)) == [APT_INSTALLER]
        assert set(apt_uninstalled) == expected
        assert not errors

        expected = ['libtinyxml-dev']
        uninstalled, errors = installer.get_uninstalled(['rospack_fake'],
                                                        verbose)
        keys, values = zip(*uninstalled)
        apt_uninstalled = []
        for k, v in uninstalled:
            if k == APT_INSTALLER:
                apt_uninstalled.extend(v)
        assert list(set(keys)) == [APT_INSTALLER]
        assert apt_uninstalled == expected, uninstalled
        assert not errors
示例#35
0
def test_RosdepInstaller_get_uninstalled_unconfigured():
    from rosdep2 import create_default_installer_context, RosdepInternalError
    from rosdep2.lookup import RosdepLookup, ResolutionError
    from rosdep2.installers import RosdepInstaller, PackageManagerInstaller
    from rosdep2.platforms.debian import APT_INSTALLER

    from rosdep2.lookup import RosdepLookup
    rospack, rosstack = get_test_rospkgs()

    sources_loader = create_test_SourcesListLoader()
    # create our test fixture.  we want to setup a fixture that cannot resolve the rosdep data in order to test error conditions
    lookup = RosdepLookup.create_from_rospkg(rospack=rospack,
                                             rosstack=rosstack,
                                             sources_loader=sources_loader)
    context = create_default_installer_context()
    context.set_os_override('ubuntu', 'lucid')
    installer = RosdepInstaller(context, lookup)
    # - delete the apt installer
    context.set_installer(APT_INSTALLER, None)

    for verbose in [True, False]:
        uninstalled, errors = installer.get_uninstalled(['empty'], verbose)
        assert not uninstalled, uninstalled
        assert not errors

        # make sure there is an error when we lookup something that resolves to an apt depend
        uninstalled, errors = installer.get_uninstalled(['roscpp_fake'],
                                                        verbose)
        assert not uninstalled, uninstalled
        assert list(errors.keys()) == ['roscpp_fake']

        uninstalled, errors = installer.get_uninstalled(
            ['roscpp_fake', 'stack1_p1'], verbose)
        assert not uninstalled, uninstalled
        assert set(errors.keys()) == set(['roscpp_fake', 'stack1_p1'])
        print(errors)
        assert isinstance(errors['roscpp_fake'],
                          ResolutionError), errors['roscpp_fake'][0]

    # fake/bad installer to test that we re-cast general installer issues
    class BadInstaller(PackageManagerInstaller):
        def __init__(self):
            super(BadInstaller, self).__init__(lambda x: x)

        def get_packages_to_install(*args):
            raise Exception("deadbeef")

    context.set_installer(APT_INSTALLER, BadInstaller())
    try:
        installer.get_uninstalled(['roscpp_fake'])
        assert False, "should have raised"
    except RosdepInternalError as e:
        assert 'apt' in str(e)

    # annoying mock to test generally impossible error condition
    from mock import Mock
    lookup = Mock(spec=RosdepLookup)
    lookup.resolve_all.return_value = ([('bad-key', ['stuff'])], [])

    installer = RosdepInstaller(context, lookup)
    try:
        installer.get_uninstalled(['roscpp_fake'])
        assert False, "should have raised"
    except RosdepInternalError:
        pass
示例#36
0
def main(args=None, get_subs_fn=None):
    get_subs_fn = get_subs_fn or get_subs
    _place_template_files = True
    _process_template_files = True
    package_path = os.getcwd()
    skip_package_names = None

    if args is not None:
        package_path = args.package_path or os.getcwd()
        _place_template_files = args.place_template_files
        _process_template_files = args.process_template_files

        # create dependency-skip package name lists
        skip_name_path = args.skip_package_names or ''
        if os.path.isfile(os.path.abspath(skip_name_path)):
            with open(os.path.abspath(skip_name_path), 'r') as f:
                skip_package_names = []
                for line in f:
                    # comment string
                    if line[:1] == '#':
                        continue
                    # add lists
                    skip_package_names.append(line.strip())

    pkgs_dict = find_packages(package_path)
    if len(pkgs_dict) == 0:
        sys.exit("No packages found in path: '{0}'".format(package_path))
    if len(pkgs_dict) > 1:
        sys.exit("Multiple packages found, "
                 "this tool only supports one package at a time.")

    os_data = create_default_installer_context().get_os_name_and_version()
    os_name, os_version = os_data
    ros_distro = os.environ.get('ROS_DISTRO', 'indigo')

    # Allow args overrides
    os_name = args.os_name or os_name
    os_version = args.os_version or os_version
    ros_distro = args.ros_distro or ros_distro

    # Summarize
    info(
        fmt("@!@{gf}==> @|") +
        fmt("Generating debs for @{cf}%s:%s@| for package(s) %s" %
            (os_name, os_version, [p.name for p in pkgs_dict.values()])))

    for path, pkg in pkgs_dict.items():
        template_files = None
        try:
            subs = get_subs_fn(pkg, os_name, os_version, ros_distro,
                               args.native, skip_package_names)
            if _place_template_files:
                # Place template files
                place_template_files(path, pkg.get_build_type())
            if _process_template_files:
                # Just process existing template files
                template_files = process_template_files(path, subs)
            if not _place_template_files and not _process_template_files:
                # If neither, do both
                place_template_files(path, pkg.get_build_type())
                template_files = process_template_files(path, subs)
            if template_files is not None:
                for template_file in template_files:
                    os.remove(os.path.normpath(template_file))
        except Exception as exc:
            debug(traceback.format_exc())
            error(type(exc).__name__ + ": " + str(exc), exit=True)
        except (KeyboardInterrupt, EOFError):
            sys.exit(1)