Beispiel #1
0
def create_profile(folder,
                   name,
                   settings=None,
                   scopes=None,
                   package_settings=None,
                   env=None,
                   package_env=None):

    package_env = package_env or {}

    profile = Profile()
    profile._settings = settings or {}
    if scopes:
        profile.scopes = Scopes.from_list(
            ["%s=%s" % (key, value) for key, value in scopes.items()])

    if package_settings:
        profile._package_settings = package_settings

    for package_name, envs in package_env.items():
        for var_name, value in envs:
            profile.env_values.add(var_name, value, package_name)

    for var_name, value in env or {}:
        profile.env_values.add(var_name, value)

    save(os.path.join(folder, name), profile.dumps())
Beispiel #2
0
    def update_profile(self, profile_name, key, value):
        first_key, rest_key = self._get_profile_keys(key)

        profile, _ = read_profile(profile_name, os.getcwd(),
                                  self._client_cache.profiles_path)
        if first_key == "settings":
            profile.settings[rest_key] = value
        elif first_key == "options":
            tmp = OptionsValues([(rest_key, value)])
            profile.options.update(tmp)
        elif first_key == "env":
            profile.env_values.update(
                EnvValues.loads("%s=%s" % (rest_key, value)))
        elif first_key == "scopes":
            profile.update_scopes(
                Scopes.from_list(["%s=%s" % (rest_key, value)]))
        elif first_key == "build_requires":
            raise ConanException(
                "Edit the profile manually to change the build_requires")

        contents = profile.dumps()
        profile_path = get_profile_path(profile_name,
                                        self._client_cache.profiles_path,
                                        os.getcwd())
        save(profile_path, contents)
Beispiel #3
0
    def loads(text):
        obj = Profile()
        doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes"])

        for setting in doc.settings.splitlines():
            setting = setting.strip()
            if setting and not setting.startswith("#"):
                if "=" not in setting:
                    raise ConanException("Invalid setting line '%s'" % setting)
                name, value = setting.split("=")
                obj.settings[name.strip()] = value.strip()

        if doc.scopes:
            obj.scopes = Scopes.from_list(doc.scopes.splitlines())

        for env in doc.env.splitlines():
            env = env.strip()
            if env and not env.startswith("#"):
                if "=" not in env:
                    raise ConanException("Invalid env line '%s'" % env)
                varname, value = env.split("=")
                obj.env[varname.strip()] = value.strip()

        obj._order()
        return obj
Beispiel #4
0
    def loads(text):
        obj = Profile()
        doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes"])

        for setting in doc.settings.splitlines():
            setting = setting.strip()
            if setting and not setting.startswith("#"):
                if "=" not in setting:
                    raise ConanException("Invalid setting line '%s'" % setting)
                name, value = setting.split("=")
                obj.settings[name.strip()] = value.strip()

        if doc.scopes:
            obj.scopes = Scopes.from_list(doc.scopes.splitlines())

        for env in doc.env.splitlines():
            env = env.strip()
            if env and not env.startswith("#"):
                if "=" not in env:
                    raise ConanException("Invalid env line '%s'" % env)
                varname, value = env.split("=")
                obj.env[varname.strip()] = value.strip()

        obj._order()
        return obj
 def _create_profile(self, name, settings, scopes=None, env=None):
     profile = Profile()
     profile.settings = settings or {}
     if scopes:
         profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()])
     profile.env = env or {}
     save(self.client.client_cache.profile_path(name), profile.dumps())
Beispiel #6
0
    def loads(text):
        try:
            obj = Profile()
            doc = ConfigParser(text,
                               allowed_fields=["settings", "env", "scopes"])

            for setting in doc.settings.splitlines():
                setting = setting.strip()
                if setting and not setting.startswith("#"):
                    if "=" not in setting:
                        raise ConanException("Invalid setting line '%s'" %
                                             setting)
                    name, value = setting.split("=", 1)
                    obj.settings[name.strip()] = _clean_value(value)

            if doc.scopes:
                obj.scopes = Scopes.from_list(doc.scopes.splitlines())

            for env in doc.env.splitlines():
                env = env.strip()
                if env and not env.startswith("#"):
                    if "=" not in env:
                        raise ConanException("Invalid env line '%s'" % env)
                    varname, value = env.split("=", 1)
                    obj.env[varname.strip()] = _clean_value(value)

            obj._order()
            return obj
        except ConanException:
            raise
        except Exception as exc:
            raise ConanException("Error parsing the profile text file: %s" %
                                 str(exc))
Beispiel #7
0
 def _create_profile(self, name, settings, scopes=None, env=None):
     profile = Profile()
     profile._settings = settings or {}
     if scopes:
         profile.scopes = Scopes.from_list(
             ["%s=%s" % (key, value) for key, value in scopes.items()])
     profile._env = env or {}
     save(self.client.client_cache.profile_path(name), profile.dumps())
Beispiel #8
0
 def _create_profile(self, name, settings, scopes=None, env=None):
     env = env or {}
     profile = Profile()
     profile._settings = settings or {}
     if scopes:
         profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()])
     for varname, value in env.items():
         profile.env_values.add(varname, value)
     save(os.path.join(self.client.client_cache.profiles_path, name), profile.dumps())
Beispiel #9
0
    def install(self, *args):
        """ install in the local store the given requirements.
        Requirements can be defined in the command line or in a conanfile.
        EX: conan install opencv/2.4.10@lasote/testing
        """
        parser = argparse.ArgumentParser(description=self.install.__doc__, prog="conan install",
                                         formatter_class=RawTextHelpFormatter)
        parser.add_argument("reference", nargs='?', default="",
                            help='package recipe reference'
                            'e.g., MyPackage/1.2@user/channel or ./my_project/')
        parser.add_argument("--package", "-p", nargs=1, action=Extender,
                            help='Force install specified package ID (ignore settings/options)')
        parser.add_argument("--all", action='store_true', default=False,
                            help='Install all packages from the specified package recipe')
        parser.add_argument("--integrity", "-i", action='store_true', default=False,
                            help='Check that the stored recipe or package manifests are correct')
        parser.add_argument("--file", "-f", help="specify conanfile filename")
        parser.add_argument("--update", "-u", action='store_true', default=False,
                            help="update with new upstream packages")
        parser.add_argument("--scope", "-sc", nargs=1, action=Extender,
                            help='Define scopes for packages')
        parser.add_argument("--generator", "-g", nargs=1, action=Extender,
                            help='Generators to use')
        self._parse_args(parser)

        args = parser.parse_args(*args)

        current_path = os.getcwd()
        try:
            reference = ConanFileReference.loads(args.reference)
        except:
            reference = os.path.normpath(os.path.join(current_path, args.reference))

        if args.all or args.package:  # Install packages without settings (fixed ids or all)
            if args.all:
                args.package = []
            if not args.reference or not isinstance(reference, ConanFileReference):
                raise ConanException("Invalid package recipe reference. "
                                     "e.g., MyPackage/1.2@user/channel")
            self._manager.download(reference, args.package, remote=args.remote)
        else:  # Classic install, package chosen with settings and options
            # Get False or a list of patterns to check
            args.build = self._get_build_sources_parameter(args.build)
            options = self._get_tuples_list_from_extender_arg(args.options)
            settings = self._get_tuples_list_from_extender_arg(args.settings)
            scopes = Scopes.from_list(args.scope) if args.scope else None
            self._manager.install(reference=reference,
                                  current_path=current_path,
                                  remote=args.remote,
                                  options=options,
                                  settings=settings,
                                  build_mode=args.build,
                                  filename=args.file,
                                  update=args.update,
                                  integrity=args.integrity,
                                  scopes=scopes,
                                  generators=args.generator)
Beispiel #10
0
 def _create_profile(self, name, settings, scopes=None, env=None):
     env = env or {}
     profile = Profile()
     profile._settings = settings or {}
     if scopes:
         profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()])
     for varname, value in env.items():
         profile.env_values.add(varname, value)
     save(os.path.join(self.client.client_cache.profiles_path, name), profile.dumps())
Beispiel #11
0
def _profile_parse_args(settings, options, envs, scopes):
    """ return a Profile object result of parsing raw data
    """
    def _get_tuples_list_from_extender_arg(items):
        if not items:
            return []
        # Validate the pairs
        for item in items:
            chunks = item.split("=", 1)
            if len(chunks) != 2:
                raise ConanException("Invalid input '%s', use 'name=value'" %
                                     item)
        return [(item[0], item[1])
                for item in [item.split("=", 1) for item in items]]

    def _get_simple_and_package_tuples(items):
        """Parse items like "thing:item=value or item2=value2 and returns a tuple list for
        the simple items (name, value) and a dict for the package items
        {package: [(item, value)...)], ...}
        """
        simple_items = []
        package_items = defaultdict(list)
        tuples = _get_tuples_list_from_extender_arg(items)
        for name, value in tuples:
            if ":" in name:  # Scoped items
                tmp = name.split(":", 1)
                ref_name = tmp[0]
                name = tmp[1]
                package_items[ref_name].append((name, value))
            else:
                simple_items.append((name, value))
        return simple_items, package_items

    def _get_env_values(env, package_env):
        env_values = EnvValues()
        for name, value in env:
            env_values.add(name, EnvValues.load_value(value))
        for package, data in package_env.items():
            for name, value in data:
                env_values.add(name, EnvValues.load_value(value), package)
        return env_values

    result = Profile()
    options = _get_tuples_list_from_extender_arg(options)
    result.options = OptionsValues(options)
    env, package_env = _get_simple_and_package_tuples(envs)
    env_values = _get_env_values(env, package_env)
    result.env_values = env_values
    settings, package_settings = _get_simple_and_package_tuples(settings)
    result.settings = OrderedDict(settings)
    for pkg, values in package_settings.items():
        result.package_settings[pkg] = OrderedDict(values)
    result.scopes = Scopes.from_list(scopes) if scopes else Scopes()
    return result
Beispiel #12
0
def _profile_parse_args(settings, options, envs, scopes):
    """ return a Profile object result of parsing raw data
    """
    def _get_tuples_list_from_extender_arg(items):
        if not items:
            return []
        # Validate the pairs
        for item in items:
            chunks = item.split("=", 1)
            if len(chunks) != 2:
                raise ConanException("Invalid input '%s', use 'name=value'" % item)
        return [(item[0], item[1]) for item in [item.split("=", 1) for item in items]]

    def _get_simple_and_package_tuples(items):
        """Parse items like "thing:item=value or item2=value2 and returns a tuple list for
        the simple items (name, value) and a dict for the package items
        {package: [(item, value)...)], ...}
        """
        simple_items = []
        package_items = defaultdict(list)
        tuples = _get_tuples_list_from_extender_arg(items)
        for name, value in tuples:
            if ":" in name:  # Scoped items
                tmp = name.split(":", 1)
                ref_name = tmp[0]
                name = tmp[1]
                package_items[ref_name].append((name, value))
            else:
                simple_items.append((name, value))
        return simple_items, package_items

    def _get_env_values(env, package_env):
        env_values = EnvValues()
        for name, value in env:
            env_values.add(name, EnvValues.load_value(value))
        for package, data in package_env.items():
            for name, value in data:
                env_values.add(name, EnvValues.load_value(value), package)
        return env_values

    result = Profile()
    options = _get_tuples_list_from_extender_arg(options)
    result.options = OptionsValues(options)
    env, package_env = _get_simple_and_package_tuples(envs)
    env_values = _get_env_values(env, package_env)
    result.env_values = env_values
    settings, package_settings = _get_simple_and_package_tuples(settings)
    result.settings = OrderedDict(settings)
    for pkg, values in package_settings.items():
        result.package_settings[pkg] = OrderedDict(values)
    result.scopes = Scopes.from_list(scopes) if scopes else Scopes()
    return result
Beispiel #13
0
def _apply_inner_profile(doc, base_profile):
    """

    :param doc: ConfigParser object from the current profile (excluding includes and vars, and with values already replaced)
    :param base_profile: Profile inherited, it's used as a base profile to modify it.
    :return: None
    """
    def get_package_name_value(item):
        """Parse items like package:name=value or name=value"""
        package_name = None
        if ":" in item:
            tmp = item.split(":", 1)
            package_name, item = tmp

        name, value = item.split("=", 1)
        name = name.strip()
        value = unquote(value)
        return package_name, name, value

    for setting in doc.settings.splitlines():
        setting = setting.strip()
        if setting and not setting.startswith("#"):
            if "=" not in setting:
                raise ConanException("Invalid setting line '%s'" % setting)
            package_name, name, value = get_package_name_value(setting)
            if package_name:
                base_profile.package_settings[package_name][name] = value
            else:
                base_profile.settings[name] = value

    if doc.build_requires:
        # FIXME CHECKS OF DUPLICATED?
        for req in doc.build_requires.splitlines():
            tokens = req.split(":", 1)
            if len(tokens) == 1:
                pattern, req_list = "*", req
            else:
                pattern, req_list = tokens
            req_list = [
                ConanFileReference.loads(r.strip())
                for r in req_list.split(",")
            ]
            base_profile.build_requires.setdefault(pattern,
                                                   []).extend(req_list)

    if doc.scopes:
        base_profile.update_scopes(Scopes.from_list(doc.scopes.splitlines()))

    if doc.options:
        base_profile.options.update(OptionsValues.loads(doc.options))

    base_profile.env_values.update(EnvValues.loads(doc.env))
Beispiel #14
0
    def loads(text):
        def get_package_name_value(item):
            '''Parse items like package:name=value or name=value'''
            package_name = None
            if ":" in item:
                tmp = item.split(":", 1)
                package_name, item = tmp

            name, value = item.split("=", 1)
            name = name.strip()
            value = _clean_value(value)
            return package_name, name, value

        try:
            obj = Profile()
            doc = ConfigParser(text,
                               allowed_fields=["settings", "env", "scopes"])

            for setting in doc.settings.splitlines():
                setting = setting.strip()
                if setting and not setting.startswith("#"):
                    if "=" not in setting:
                        raise ConanException("Invalid setting line '%s'" %
                                             setting)
                    package_name, name, value = get_package_name_value(setting)
                    if package_name:
                        obj._package_settings[package_name][name] = value
                    else:
                        obj._settings[name] = value

            if doc.scopes:
                obj.scopes = Scopes.from_list(doc.scopes.splitlines())

            for env in doc.env.splitlines():
                env = env.strip()
                if env and not env.startswith("#"):
                    if "=" not in env:
                        raise ConanException("Invalid env line '%s'" % env)
                    package_name, name, value = get_package_name_value(env)
                    if package_name:
                        obj._package_env[package_name][name] = value
                    else:
                        obj._env[name] = value

            obj._order()
            return obj
        except ConanException:
            raise
        except Exception as exc:
            raise ConanException("Error parsing the profile text file: %s" %
                                 str(exc))
Beispiel #15
0
    def info(self, *args):
        """ Prints information about the requirements.
        Requirements can be defined in the command line or in a conanfile.
        EX: conan info opencv/2.4.10@lasote/testing
        """
        parser = argparse.ArgumentParser(description=self.info.__doc__, prog="conan info",
                                         formatter_class=RawTextHelpFormatter)
        parser.add_argument("reference", nargs='?', default="",
                            help='reference name or path to conanfile file, '
                            'e.g., MyPackage/1.2@user/channel or ./my_project/')
        parser.add_argument("--file", "-f", help="specify conanfile filename")
        parser.add_argument("-r", "--remote", help='look for in the remote storage')
        parser.add_argument("--options", "-o",
                            help='load options to build the package, e.g., -o with_qt=true',
                            nargs=1, action=Extender)
        parser.add_argument("--settings", "-s",
                            help='load settings to build the package, -s compiler:gcc',
                            nargs=1, action=Extender)
        parser.add_argument("--only", "-n",
                            help='show fields only')
        parser.add_argument("--integrity", "-i", action='store_true', default=False,
                            help='Check that the stored recipe or package manifests are correct')
        parser.add_argument("--update", "-u", action='store_true', default=False,
                            help="check updates exist from upstream remotes")
        parser.add_argument("--build_order", "-bo",
                            help='given a modified reference, return ordered list to build (CI)',
                            nargs=1, action=Extender)
        parser.add_argument("--scope", "-sc", nargs=1, action=Extender,
                            help='Define scopes for packages')
        args = parser.parse_args(*args)

        options = self._get_tuples_list_from_extender_arg(args.options)
        settings = self._get_tuples_list_from_extender_arg(args.settings)
        current_path = os.getcwd()
        try:
            reference = ConanFileReference.loads(args.reference)
        except:
            reference = os.path.normpath(os.path.join(current_path, args.reference))
        scopes = Scopes.from_list(args.scope) if args.scope else None
        self._manager.info(reference=reference,
                           current_path=current_path,
                           remote=args.remote,
                           options=options,
                           settings=settings,
                           info=args.only or True,
                           check_updates=args.update,
                           integrity=args.integrity,
                           filename=args.file,
                           build_order=args.build_order,
                           scopes=scopes)
Beispiel #16
0
def _apply_inner_profile(doc, base_profile):
    """

    :param doc: ConfigParser object from the current profile (excluding includes and vars, and with values already replaced)
    :param base_profile: Profile inherited, it's used as a base profile to modify it.
    :return: None
    """

    def get_package_name_value(item):
        """Parse items like package:name=value or name=value"""
        package_name = None
        if ":" in item:
            tmp = item.split(":", 1)
            package_name, item = tmp

        name, value = item.split("=", 1)
        name = name.strip()
        value = unquote(value)
        return package_name, name, value

    for setting in doc.settings.splitlines():
        setting = setting.strip()
        if setting and not setting.startswith("#"):
            if "=" not in setting:
                raise ConanException("Invalid setting line '%s'" % setting)
            package_name, name, value = get_package_name_value(setting)
            if package_name:
                base_profile.package_settings[package_name][name] = value
            else:
                base_profile.settings[name] = value

    if doc.build_requires:
        # FIXME CHECKS OF DUPLICATED?
        for req in doc.build_requires.splitlines():
            tokens = req.split(":", 1)
            if len(tokens) == 1:
                pattern, req_list = "*", req
            else:
                pattern, req_list = tokens
            req_list = [ConanFileReference.loads(r.strip()) for r in req_list.split(",")]
            base_profile.build_requires.setdefault(pattern, []).extend(req_list)

    if doc.scopes:
        base_profile.update_scopes(Scopes.from_list(doc.scopes.splitlines()))

    if doc.options:
        base_profile.options.update(OptionsValues.loads(doc.options))

    base_profile.env_values.update(EnvValues.loads(doc.env))
Beispiel #17
0
    def loads(text):
        def get_package_name_value(item):
            """Parse items like package:name=value or name=value"""
            package_name = None
            if ":" in item:
                tmp = item.split(":", 1)
                package_name, item = tmp

            name, value = item.split("=", 1)
            name = name.strip()
            value = _clean_value(value)
            return package_name, name, value

        try:
            obj = Profile()
            doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes"])

            for setting in doc.settings.splitlines():
                setting = setting.strip()
                if setting and not setting.startswith("#"):
                    if "=" not in setting:
                        raise ConanException("Invalid setting line '%s'" % setting)
                    package_name, name, value = get_package_name_value(setting)
                    if package_name:
                        obj._package_settings[package_name][name] = value
                    else:
                        obj._settings[name] = value

            if doc.scopes:
                obj.scopes = Scopes.from_list(doc.scopes.splitlines())

            for env in doc.env.splitlines():
                env = env.strip()
                if env and not env.startswith("#"):
                    if "=" not in env:
                        raise ConanException("Invalid env line '%s'" % env)
                    package_name, name, value = get_package_name_value(env)
                    if package_name:
                        obj._package_env[package_name][name] = value
                    else:
                        obj._env[name] = value

            obj._order()
            return obj
        except ConanException:
            raise
        except Exception as exc:
            raise ConanException("Error parsing the profile text file: %s" % str(exc))
Beispiel #18
0
    def info(self, *args):
        """ Prints information about the requirements.
        Requirements can be defined in the command line or in a conanfile.
        EX: conan info opencv/2.4.10@lasote/testing
        """
        parser = argparse.ArgumentParser(description=self.info.__doc__, prog="conan info",
                                         formatter_class=RawTextHelpFormatter)
        parser.add_argument("reference", nargs='?', default="",
                            help='reference name or path to conanfile file, '
                            'e.g., MyPackage/1.2@user/channel or ./my_project/')
        parser.add_argument("--file", "-f", help="specify conanfile filename")
        parser.add_argument("-r", "--remote", help='look for in the remote storage')
        parser.add_argument("--options", "-o",
                            help='load options to build the package, e.g., -o with_qt=true',
                            nargs=1, action=Extender)
        parser.add_argument("--settings", "-s",
                            help='load settings to build the package, -s compiler:gcc',
                            nargs=1, action=Extender)
        parser.add_argument("--only", "-n",
                            help='show fields only')
        parser.add_argument("--update", "-u", action='store_true', default=False,
                            help="check updates exist from upstream remotes")
        parser.add_argument("--build_order", "-bo",
                            help='given a modified reference, return ordered list to build (CI)',
                            nargs=1, action=Extender)
        parser.add_argument("--scope", "-sc", nargs=1, action=Extender,
                            help='Define scopes for packages')
        args = parser.parse_args(*args)

        options = self._get_tuples_list_from_extender_arg(args.options)
        settings = self._get_tuples_list_from_extender_arg(args.settings)
        current_path = os.getcwd()
        try:
            reference = ConanFileReference.loads(args.reference)
        except:
            reference = os.path.normpath(os.path.join(current_path, args.reference))
        scopes = Scopes.from_list(args.scope) if args.scope else None
        self._manager.info(reference=reference,
                           current_path=current_path,
                           remote=args.remote,
                           options=options,
                           settings=settings,
                           info=args.only or True,
                           check_updates=args.update,
                           filename=args.file,
                           build_order=args.build_order,
                           scopes=scopes)
Beispiel #19
0
    def loads(text):
        """ Parse and return a Profile object from a text config like representation
        """
        def get_package_name_value(item):
            '''Parse items like package:name=value or name=value'''
            package_name = None
            if ":" in item:
                tmp = item.split(":", 1)
                package_name, item = tmp

            name, value = item.split("=", 1)
            name = name.strip()
            value = unquote(value)
            return package_name, name, value

        try:
            obj = Profile()
            doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes", "options"])

            for setting in doc.settings.splitlines():
                setting = setting.strip()
                if setting and not setting.startswith("#"):
                    if "=" not in setting:
                        raise ConanException("Invalid setting line '%s'" % setting)
                    package_name, name, value = get_package_name_value(setting)
                    if package_name:
                        obj.package_settings[package_name][name] = value
                    else:
                        obj.settings[name] = value

            if doc.scopes:
                obj.scopes = Scopes.from_list(doc.scopes.splitlines())

            if doc.options:
                obj.options = OptionsValues.loads(doc.options)

            obj.env_values = EnvValues.loads(doc.env)

            return obj
        except ConanException:
            raise
        except Exception as exc:
            raise ConanException("Error parsing the profile text file: %s" % str(exc))
Beispiel #20
0
    def _create_profile(self, name, settings, scopes=None, package_settings=None, 
                        env=None, package_env=None):

        package_env = package_env or {}

        profile = Profile()
        profile._settings = settings or {}
        if scopes:
            profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()])

        if package_settings:
            profile._package_settings = package_settings

        for package_name, envs in package_env.items():
            for var_name, value in envs:
                profile._package_env[package_name][var_name] = value

        for var_name, value in env or {}:
            profile._env[var_name] = value
        save(self.client.client_cache.profile_path(name), profile.dumps())
Beispiel #21
0
def create_profile(folder, name, settings=None, scopes=None, package_settings=None, env=None,
                   package_env=None):

    package_env = package_env or {}

    profile = Profile()
    profile._settings = settings or {}
    if scopes:
        profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()])

    if package_settings:
        profile._package_settings = package_settings

    for package_name, envs in package_env.items():
        for var_name, value in envs:
            profile._package_env[package_name][var_name] = value

    for var_name, value in env or {}:
        profile._env[var_name] = value

    save(os.path.join(folder, name), profile.dumps())
Beispiel #22
0
    def from_list_test(self):
        scope = Scopes.from_list(["theroot:thescope=http://conan.io"])
        self.assertEquals(scope["theroot"]["thescope"], "http://conan.io")
        self.assertEquals(scope.package_scope("theroot")["thescope"], "http://conan.io")

        scope = Scopes.from_list(["thescope=http://conan.io"])
        self.assertEquals(scope["0CONAN_ROOT*"]["thescope"], "http://conan.io")

        scope = Scopes.from_list(["theroot:thescope=TRUE"])
        self.assertTrue(scope["theroot"]["thescope"])

        scope = Scopes.from_list(["theroot:thescope=true"])
        self.assertTrue(scope["theroot"]["thescope"])

        scope = Scopes.from_list(["theroot:thescope=FALSE"])
        self.assertFalse(scope["theroot"]["thescope"])

        scope = Scopes.from_list(["theroot:thescope=false"])
        self.assertFalse(scope["theroot"]["thescope"])
Beispiel #23
0
    def from_list_test(self):
        scope = Scopes.from_list(["theroot:thescope=http://conan.io"])
        self.assertEquals(scope["theroot"]["thescope"], "http://conan.io")
        self.assertEquals(
            scope.package_scope("theroot")["thescope"], "http://conan.io")

        scope = Scopes.from_list(["thescope=http://conan.io"])
        self.assertEquals(scope["0CONAN_ROOT*"]["thescope"], "http://conan.io")

        scope = Scopes.from_list(["theroot:thescope=TRUE"])
        self.assertTrue(scope["theroot"]["thescope"])

        scope = Scopes.from_list(["theroot:thescope=true"])
        self.assertTrue(scope["theroot"]["thescope"])

        scope = Scopes.from_list(["theroot:thescope=FALSE"])
        self.assertFalse(scope["theroot"]["thescope"])

        scope = Scopes.from_list(["theroot:thescope=false"])
        self.assertFalse(scope["theroot"]["thescope"])
Beispiel #24
0
    def test_package(self, *args):
        """ build and run your package test. Must have conanfile.py with "test"
        method and "test_package" subfolder with package consumer test project
        """
        parser = argparse.ArgumentParser(description=self.test_package.__doc__, prog="conan test",
                                         formatter_class=RawTextHelpFormatter)
        parser.add_argument("path", nargs='?', default="", help='path to conanfile file, '
                            'e.g. /my_project/')
        parser.add_argument("-f", "--folder", help='alternative test folder name')
        parser.add_argument("--scope", "-sc", nargs=1, action=Extender,
                            help='Define scopes for packages')
        self._parse_args(parser)

        args = parser.parse_args(*args)

        root_folder = os.path.normpath(os.path.join(os.getcwd(), args.path))
        if args.folder:
            test_folder_name = args.folder
            test_folder = os.path.join(root_folder, test_folder_name)
            test_conanfile = os.path.join(test_folder, "conanfile.py")
            if not os.path.exists(test_conanfile):
                raise ConanException("test folder '%s' not available, "
                                     "or it doesn't have a conanfile.py" % args.folder)
        else:
            for name in ["test_package", "test"]:
                test_folder_name = name
                test_folder = os.path.join(root_folder, test_folder_name)
                test_conanfile = os.path.join(test_folder, "conanfile.py")
                if os.path.exists(test_conanfile):
                    break
            else:
                raise ConanException("test folder 'test_package' not available, "
                                     "or it doesn't have a conanfile.py")

        lib_to_test = self._detect_tested_library_name()

        # Get False or a list of patterns to check
        if args.build is None and lib_to_test:  # Not specified, force build the tested library
            args.build = [lib_to_test]
        else:
            args.build = self._get_build_sources_parameter(args.build)

        options = args.options or []
        settings = args.settings or []

        sha = hashlib.sha1("".join(options + settings).encode()).hexdigest()
        build_folder = os.path.join(test_folder, "build", sha)
        rmdir(build_folder)
        # shutil.copytree(test_folder, build_folder)

        options = self._get_tuples_list_from_extender_arg(args.options)
        settings = self._get_tuples_list_from_extender_arg(args.settings)
        scopes = Scopes.from_list(args.scope) if args.scope else None

        self._manager.install(reference=test_folder,
                              current_path=build_folder,
                              remote=args.remote,
                              options=options,
                              settings=settings,
                              build_mode=args.build,
                              scopes=scopes)
        self._test_check(test_folder, test_folder_name)
        self._manager.build(test_folder, build_folder, test=True)
Beispiel #25
0
    def install(self, *args):
        """ install in the local store the given requirements.
        Requirements can be defined in the command line or in a conanfile.
        EX: conan install opencv/2.4.10@lasote/testing
        """
        parser = argparse.ArgumentParser(description=self.install.__doc__, prog="conan install",
                                         formatter_class=RawTextHelpFormatter)
        parser.add_argument("reference", nargs='?', default="",
                            help='package recipe reference'
                            'e.g., MyPackage/1.2@user/channel or ./my_project/')
        parser.add_argument("--package", "-p", nargs=1, action=Extender,
                            help='Force install specified package ID (ignore settings/options)')
        parser.add_argument("--all", action='store_true', default=False,
                            help='Install all packages from the specified package recipe')
        parser.add_argument("--file", "-f", help="specify conanfile filename")
        parser.add_argument("--update", "-u", action='store_true', default=False,
                            help="update with new upstream packages")
        parser.add_argument("--scope", "-sc", nargs=1, action=Extender,
                            help='Define scopes for packages')
        parser.add_argument("--profile", "-pr", default=None, help='Define a profile')
        parser.add_argument("--generator", "-g", nargs=1, action=Extender,
                            help='Generators to use')
        parser.add_argument("--werror", action='store_true', default=False,
                            help='Error instead of warnings for graph inconsistencies')

        # Manifests arguments
        default_manifest_folder = '.conan_manifests'
        parser.add_argument("--manifests", "-m", const=default_manifest_folder, nargs="?",
                            help='Install dependencies manifests in folder for later verify.'
                            ' Default folder is .conan_manifests, but can be changed')
        parser.add_argument("--manifests-interactive", "-mi", const=default_manifest_folder,
                            nargs="?",
                            help='Install dependencies manifests in folder for later verify, '
                            'asking user for confirmation. '
                            'Default folder is .conan_manifests, but can be changed')
        parser.add_argument("--verify", "-v", const=default_manifest_folder, nargs="?",
                            help='Verify dependencies manifests against stored ones')

        self._parse_args(parser)

        args = parser.parse_args(*args)
        self._user_io.out.werror_active = args.werror

        current_path = os.getcwd()
        try:
            reference = ConanFileReference.loads(args.reference)
        except:
            reference = os.path.normpath(os.path.join(current_path, args.reference))

        if args.all or args.package:  # Install packages without settings (fixed ids or all)
            if args.all:
                args.package = []
            if not args.reference or not isinstance(reference, ConanFileReference):
                raise ConanException("Invalid package recipe reference. "
                                     "e.g., MyPackage/1.2@user/channel")
            self._manager.download(reference, args.package, remote=args.remote)
        else:  # Classic install, package chosen with settings and options
            # Get False or a list of patterns to check
            args.build = self._get_build_sources_parameter(args.build)
            options = self._get_tuples_list_from_extender_arg(args.options)
            settings = self._get_tuples_list_from_extender_arg(args.settings)
            scopes = Scopes.from_list(args.scope) if args.scope else None
            if args.manifests and args.manifests_interactive:
                raise ConanException("Do not specify both manifests and "
                                     "manifests-interactive arguments")
            if args.verify and (args.manifests or args.manifests_interactive):
                raise ConanException("Do not specify both 'verify' and "
                                     "'manifests' or 'manifests-interactive' arguments")
            manifest_folder = args.verify or args.manifests or args.manifests_interactive
            if manifest_folder:
                if not os.path.isabs(manifest_folder):
                    if isinstance(reference, ConanFileReference):
                        manifest_folder = os.path.join(current_path, manifest_folder)
                    else:
                        manifest_folder = os.path.join(reference, manifest_folder)
                manifest_verify = args.verify is not None
                manifest_interactive = args.manifests_interactive is not None
            else:
                manifest_verify = manifest_interactive = False
            self._manager.install(reference=reference,
                                  current_path=current_path,
                                  remote=args.remote,
                                  options=options,
                                  settings=settings,
                                  build_mode=args.build,
                                  filename=args.file,
                                  update=args.update,
                                  manifest_folder=manifest_folder,
                                  manifest_verify=manifest_verify,
                                  manifest_interactive=manifest_interactive,
                                  scopes=scopes,
                                  generators=args.generator,
                                  profile_name=args.profile)
Beispiel #26
0
    def test_package(self, *args):
        """ build and run your package test. Must have conanfile.py with "test"
        method and "test_package" subfolder with package consumer test project
        """
        parser = argparse.ArgumentParser(description=self.test_package.__doc__,
                                         prog="conan test_package",
                                         formatter_class=RawTextHelpFormatter)
        parser.add_argument("path", nargs='?', default="", help='path to conanfile file, '
                            'e.g. /my_project/')
        parser.add_argument("-ne", "--not-export", default=False, action='store_true',
                            help='Do not export the conanfile before test execution')
        parser.add_argument("-f", "--folder", help='alternative test folder name')
        parser.add_argument("--scope", "-sc", nargs=1, action=Extender,
                            help='Define scopes for packages')
        parser.add_argument('--keep-source', '-k', default=False, action='store_true',
                            help='Optional. Do not remove the source folder in local store. '
                                 'Use for testing purposes only')
        parser.add_argument("--update", "-u", action='store_true', default=False,
                            help="update with new upstream packages")
        parser.add_argument("--profile", "-pr", default=None, help='Define a profile')
        self._parse_args(parser)

        args = parser.parse_args(*args)

        root_folder = os.path.normpath(os.path.join(os.getcwd(), args.path))
        if args.folder:
            test_folder_name = args.folder
            test_folder = os.path.join(root_folder, test_folder_name)
            test_conanfile = os.path.join(test_folder, "conanfile.py")
            if not os.path.exists(test_conanfile):
                raise ConanException("test folder '%s' not available, "
                                     "or it doesn't have a conanfile.py" % args.folder)
        else:
            for name in ["test_package", "test"]:
                test_folder_name = name
                test_folder = os.path.join(root_folder, test_folder_name)
                test_conanfile = os.path.join(test_folder, "conanfile.py")
                if os.path.exists(test_conanfile):
                    break
            else:
                raise ConanException("test folder 'test_package' not available, "
                                     "or it doesn't have a conanfile.py")

        options = args.options or []
        settings = args.settings or []

        sha = hashlib.sha1("".join(options + settings).encode()).hexdigest()
        build_folder = os.path.join(test_folder, "build", sha)
        rmdir(build_folder)
        # shutil.copytree(test_folder, build_folder)

        options = self._get_tuples_list_from_extender_arg(args.options)
        settings = self._get_tuples_list_from_extender_arg(args.settings)
        scopes = Scopes.from_list(args.scope) if args.scope else None

        manager = self._manager
        loader = manager._loader(None, settings, options, scopes)
        conanfile = loader.load_conan(test_conanfile, self._user_io.out, consumer=True)
        try:
            # convert to list from ItemViews required for python3
            reqs = list(conanfile.requires.items())
            first_dep = reqs[0][1].conan_reference
        except Exception:
            raise ConanException("Unable to retrieve first requirement of test conanfile.py")

        # Forcing an export!
        if not args.not_export:
            self._user_io.out.info("Exporting package recipe")
            user_channel = "%s/%s" % (first_dep.user, first_dep.channel)
            self._manager.export(user_channel, root_folder, keep_source=args.keep_source)

        lib_to_test = first_dep.name + "*"
        # Get False or a list of patterns to check
        if args.build is None and lib_to_test:  # Not specified, force build the tested library
            args.build = [lib_to_test]
        else:
            args.build = self._get_build_sources_parameter(args.build)

        self._manager.install(reference=test_folder,
                              current_path=build_folder,
                              remote=args.remote,
                              options=options,
                              settings=settings,
                              build_mode=args.build,
                              scopes=scopes,
                              update=args.update,
                              profile_name=args.profile)
        self._test_check(test_folder, test_folder_name)
        self._manager.build(test_folder, build_folder, test=True, profile_name=args.profile)
Beispiel #27
0
    def install(self, *args):
        """ install in the local store the given requirements.
        Requirements can be defined in the command line or in a conanfile.
        EX: conan install opencv/2.4.10@lasote/testing
        """
        parser = argparse.ArgumentParser(description=self.install.__doc__,
                                         prog="conan install",
                                         formatter_class=RawTextHelpFormatter)
        parser.add_argument(
            "reference",
            nargs='?',
            default="",
            help='package recipe reference'
            'e.g., MyPackage/1.2@user/channel or ./my_project/')
        parser.add_argument(
            "--package",
            "-p",
            nargs=1,
            action=Extender,
            help='Force install specified package ID (ignore settings/options)'
        )
        parser.add_argument(
            "--all",
            action='store_true',
            default=False,
            help='Install all packages from the specified package recipe')
        parser.add_argument(
            "--integrity",
            "-i",
            action='store_true',
            default=False,
            help='Check that the stored recipe or package manifests are correct'
        )
        parser.add_argument("--file", "-f", help="specify conanfile filename")
        parser.add_argument("--update",
                            "-u",
                            action='store_true',
                            default=False,
                            help="update with new upstream packages")
        parser.add_argument("--scope",
                            "-sc",
                            nargs=1,
                            action=Extender,
                            help='Define scopes for packages')
        parser.add_argument("--generator",
                            "-g",
                            nargs=1,
                            action=Extender,
                            help='Generators to use')
        self._parse_args(parser)

        args = parser.parse_args(*args)

        current_path = os.getcwd()
        try:
            reference = ConanFileReference.loads(args.reference)
        except:
            reference = os.path.normpath(
                os.path.join(current_path, args.reference))

        if args.all or args.package:  # Install packages without settings (fixed ids or all)
            if args.all:
                args.package = []
            if not args.reference or not isinstance(reference,
                                                    ConanFileReference):
                raise ConanException("Invalid package recipe reference. "
                                     "e.g., MyPackage/1.2@user/channel")
            self._manager.download(reference, args.package, remote=args.remote)
        else:  # Classic install, package chosen with settings and options
            # Get False or a list of patterns to check
            args.build = self._get_build_sources_parameter(args.build)
            options = self._get_tuples_list_from_extender_arg(args.options)
            settings = self._get_tuples_list_from_extender_arg(args.settings)
            scopes = Scopes.from_list(args.scope) if args.scope else None
            self._manager.install(reference=reference,
                                  current_path=current_path,
                                  remote=args.remote,
                                  options=options,
                                  settings=settings,
                                  build_mode=args.build,
                                  filename=args.file,
                                  update=args.update,
                                  integrity=args.integrity,
                                  scopes=scopes,
                                  generators=args.generator)
Beispiel #28
0
    def loads(text):
        """ Parse and return a Profile object from a text config like representation
        """
        def get_package_name_value(item):
            """Parse items like package:name=value or name=value"""
            package_name = None
            if ":" in item:
                tmp = item.split(":", 1)
                package_name, item = tmp

            name, value = item.split("=", 1)
            name = name.strip()
            value = unquote(value)
            return package_name, name, value

        try:
            obj = Profile()
            doc = ConfigParser(text,
                               allowed_fields=[
                                   "build_requires", "settings", "env",
                                   "scopes", "options"
                               ])

            for setting in doc.settings.splitlines():
                setting = setting.strip()
                if setting and not setting.startswith("#"):
                    if "=" not in setting:
                        raise ConanException("Invalid setting line '%s'" %
                                             setting)
                    package_name, name, value = get_package_name_value(setting)
                    if package_name:
                        obj.package_settings[package_name][name] = value
                    else:
                        obj.settings[name] = value

            if doc.build_requires:
                # FIXME CHECKS OF DUPLICATED?
                for req in doc.build_requires.splitlines():
                    tokens = req.split(":", 1)
                    if len(tokens) == 1:
                        pattern, req_list = "*", req
                    else:
                        pattern, req_list = tokens
                    req_list = [
                        ConanFileReference.loads(r.strip())
                        for r in req_list.split(",")
                    ]
                    obj.build_requires.setdefault(pattern, []).extend(req_list)

            if doc.scopes:
                obj.scopes = Scopes.from_list(doc.scopes.splitlines())

            if doc.options:
                obj.options = OptionsValues.loads(doc.options)

            obj.env_values = EnvValues.loads(doc.env)

            return obj
        except ConanException:
            raise
        except Exception as exc:
            raise ConanException("Error parsing the profile text file: %s" %
                                 str(exc))
Beispiel #29
0
    def test_package(self, *args):
        """ build and run your package test. Must have conanfile.py with "test"
        method and "test_package" subfolder with package consumer test project
        """
        parser = argparse.ArgumentParser(description=self.test_package.__doc__,
                                         prog="conan test",
                                         formatter_class=RawTextHelpFormatter)
        parser.add_argument("path",
                            nargs='?',
                            default="",
                            help='path to conanfile file, '
                            'e.g. /my_project/')
        parser.add_argument("-f",
                            "--folder",
                            help='alternative test folder name')
        parser.add_argument("--scope",
                            "-sc",
                            nargs=1,
                            action=Extender,
                            help='Define scopes for packages')
        self._parse_args(parser)

        args = parser.parse_args(*args)

        root_folder = os.path.normpath(os.path.join(os.getcwd(), args.path))
        if args.folder:
            test_folder_name = args.folder
            test_folder = os.path.join(root_folder, test_folder_name)
            test_conanfile = os.path.join(test_folder, "conanfile.py")
            if not os.path.exists(test_conanfile):
                raise ConanException("test folder '%s' not available, "
                                     "or it doesn't have a conanfile.py" %
                                     args.folder)
        else:
            for name in ["test_package", "test"]:
                test_folder_name = name
                test_folder = os.path.join(root_folder, test_folder_name)
                test_conanfile = os.path.join(test_folder, "conanfile.py")
                if os.path.exists(test_conanfile):
                    break
            else:
                raise ConanException(
                    "test folder 'test_package' not available, "
                    "or it doesn't have a conanfile.py")

        lib_to_test = self._detect_tested_library_name()

        # Get False or a list of patterns to check
        if args.build is None and lib_to_test:  # Not specified, force build the tested library
            args.build = [lib_to_test]
        else:
            args.build = self._get_build_sources_parameter(args.build)

        options = args.options or []
        settings = args.settings or []

        sha = hashlib.sha1("".join(options + settings).encode()).hexdigest()
        build_folder = os.path.join(test_folder, "build", sha)
        rmdir(build_folder)
        # shutil.copytree(test_folder, build_folder)

        options = self._get_tuples_list_from_extender_arg(args.options)
        settings = self._get_tuples_list_from_extender_arg(args.settings)
        scopes = Scopes.from_list(args.scope) if args.scope else None

        self._manager.install(reference=test_folder,
                              current_path=build_folder,
                              remote=args.remote,
                              options=options,
                              settings=settings,
                              build_mode=args.build,
                              scopes=scopes)
        self._test_check(test_folder, test_folder_name)
        self._manager.build(test_folder, build_folder, test=True)