Esempio n. 1
0
def cli(ctx, environment, target, upload_port):

    config = get_project_config()

    if not config.sections():
        raise exception.ProjectEnvsNotAvailable()

    unknown = set(environment) - set([s[4:] for s in config.sections()])
    if unknown:
        raise exception.UnknownEnvNames(", ".join(unknown))

    for section in config.sections():
        # skip main configuration section
        if section == "platformio":
            continue
        elif section[:4] != "env:":
            raise exception.InvalidEnvName(section)

        envname = section[4:]
        if environment and envname not in environment:
            # echo("Skipped %s environment" % style(envname, fg="yellow"))
            continue

        click.echo("Processing %s environment:" %
                   click.style(envname, fg="cyan"))

        options = {}
        for k, v in config.items(section):
            options[k] = v
        process_environment(ctx, envname, options, target, upload_port)
Esempio n. 2
0
def cli(
        ctx,
        environment,
        target,
        upload_port,  # pylint: disable=R0913,R0914
        project_dir,
        verbose,
        disable_auto_clean):
    with util.cd(project_dir):
        config = util.get_project_config()

        if not config.sections():
            raise exception.ProjectEnvsNotAvailable()

        known = set([s[4:] for s in config.sections() if s.startswith("env:")])
        unknown = set(environment) - known
        if unknown:
            raise exception.UnknownEnvNames(", ".join(unknown),
                                            ", ".join(known))

        # clean obsolete .pioenvs dir
        if not disable_auto_clean:
            try:
                _clean_pioenvs_dir(util.get_pioenvs_dir())
            except:  # pylint: disable=bare-except
                click.secho(
                    "Can not remove temporary directory `%s`. Please remove "
                    "`.pioenvs` directory from the project manually to avoid "
                    "build issues" % util.get_pioenvs_dir(),
                    fg="yellow")

        results = []
        for section in config.sections():
            # skip main configuration section
            if section == "platformio":
                continue

            if not section.startswith("env:"):
                raise exception.InvalidEnvName(section)

            envname = section[4:]
            if environment and envname not in environment:
                # echo("Skipped %s environment" % style(envname, fg="yellow"))
                continue

            if results:
                click.echo()

            options = {}
            for k, v in config.items(section):
                options[k] = v

            ep = EnvironmentProcessor(ctx, envname, options, target,
                                      upload_port, verbose)
            results.append(ep.process())

        if not all(results):
            raise exception.ReturnErrorCode()
Esempio n. 3
0
def get_first_board(project_dir):
    with util.cd(project_dir):
        config = util.get_project_config()
        for section in config.sections():
            if not section.startswith("env:"):
                continue
            elif config.has_option(section, "board"):
                return config.get(section, "board")
    return None
Esempio n. 4
0
def get_first_board(project_dir):
    with util.cd(project_dir):
        config = util.get_project_config()
        for section in config.sections():
            if not section.startswith("env:"):
                continue
            elif config.has_option(section, "board"):
                return config.get(section, "board")
    return None
 def get_project_env(self):
     data = {"env_name": "PlatformIO"}
     with util.cd(self.project_dir):
         config = util.get_project_config()
         for section in config.sections():
             if not section.startswith("env:"):
                 continue
             data['env_name'] = section[4:]
             for k, v in config.items(section):
                 data[k] = v
     return data
Esempio n. 6
0
 def get_project_env(self):
     data = {"env_name": "PlatformIO"}
     with util.cd(self.project_dir):
         config = util.get_project_config()
         for section in config.sections():
             if not section.startswith("env:"):
                 continue
             data['env_name'] = section[4:]
             for k, v in config.items(section):
                 data[k] = v
     return data
Esempio n. 7
0
def run(
        ctx=None,
        environment=(),
        target=(),
        upload_port=None,  # pylint: disable=R0913,R0914
        project_dir=os.getcwd(),
        verbose=3,
        disable_auto_clean=False):
    with util.cd(project_dir):
        config = util.get_project_config()

        if not config.sections():
            raise exception.ProjectEnvsNotAvailable()

        known = set([s[4:] for s in config.sections() if s.startswith("env:")])
        unknown = set(environment) - known
        if unknown:
            raise exception.UnknownEnvNames(", ".join(unknown),
                                            ", ".join(known))

        # clean obsolete .pioenvs dir
        if not disable_auto_clean:
            try:
                _clean_pioenvs_dir(util.get_pioenvs_dir())
            except Exception:
                raise exception.CleanPioenvsDirError(util.get_pioenvs_dir())

        results = []
        for section in config.sections():
            # skip main configuration section
            if section == "platformio":
                continue

            if not section.startswith("env:"):
                raise exception.InvalidEnvName(section)

            envname = section[4:]
            if environment and envname not in environment:
                # echo("Skipped %s environment" % style(envname, fg="yellow"))
                continue

            if results:
                click.echo()

            options = {}
            for k, v in config.items(section):
                options[k] = v

            ep = EnvironmentProcessor(ctx, envname, options, target,
                                      upload_port, verbose)
            results.append(ep.process(
            ))  # [JORGE_GARCIA] modified to get process description

        return results
Esempio n. 8
0
def cli(ctx, environment, target, upload_port,  # pylint: disable=R0913,R0914
        project_dir, verbose, disable_auto_clean):
    with util.cd(project_dir):
        config = util.get_project_config()

        if not config.sections():
            raise exception.ProjectEnvsNotAvailable()

        known = set([s[4:] for s in config.sections()
                     if s.startswith("env:")])
        unknown = set(environment) - known
        if unknown:
            raise exception.UnknownEnvNames(
                ", ".join(unknown), ", ".join(known))

        # clean obsolete .pioenvs dir
        if not disable_auto_clean:
            try:
                _clean_pioenvs_dir(util.get_pioenvs_dir())
            except:  # pylint: disable=bare-except
                click.secho(
                    "Can not remove temporary directory `%s`. Please remove "
                    "`.pioenvs` directory from the project manually to avoid "
                    "build issues" % util.get_pioenvs_dir(),
                    fg="yellow"
                )

        results = []
        for section in config.sections():
            # skip main configuration section
            if section == "platformio":
                continue

            if not section.startswith("env:"):
                raise exception.InvalidEnvName(section)

            envname = section[4:]
            if environment and envname not in environment:
                # echo("Skipped %s environment" % style(envname, fg="yellow"))
                continue

            if results:
                click.echo()

            options = {}
            for k, v in config.items(section):
                options[k] = v

            ep = EnvironmentProcessor(
                ctx, envname, options, target, upload_port, verbose)
            results.append(ep.process())

        if not all(results):
            raise exception.ReturnErrorCode()
Esempio n. 9
0
    def _get_platformio_packages(self):
        log.debug("Getting Scons Packages")
        ori_current_dir = os.getcwd()
        ori_click_confirm = click.confirm

        def click_confirm(message):
            print message
            return True

        click.confirm = click_confirm
        try:
            os.chdir(pm.PLATFORMIO_WORKSPACE_SKELETON)
            config = util.get_project_config()
            for section in config.sections():
                env_options_dict = {x[0]: x[1] for x in config.items(section)}
                platform = PlatformFactory.newPlatform(env_options_dict["platform"])
                log.info("getting packages for: {}".format(env_options_dict))
                platform.configure_default_packages(env_options_dict, ["upload"])
                platform._install_default_packages()
            os.chdir(ori_current_dir)

            log.info("all platformio packages are successfully installed")

            platformio_packages_path = os.path.abspath(util.get_home_dir())

            def is_doc(file_path):
                is_doc_condition = os.sep + "doc" + os.sep not in file_path
                is_doc_condition = is_doc_condition and os.sep + "examples" + os.sep not in file_path
                is_doc_condition = is_doc_condition and os.sep + "tool-scons" + os.sep not in file_path
                is_doc_condition = is_doc_condition and os.sep + "README" not in file_path.upper()
                return not is_doc_condition

            # installerPlatformioPackagesPath = self._getPlatformIOPackagesPath()
            # if os.path.exists(installerPlatformioPackagesPath):
            #     shutil.rmtree(installerPlatformioPackagesPath)
            #
            # os.makedirs(installerPlatformioPackagesPath)

            log.info("Cleaning platformio packages files")
            all_files = sorted(utils.find_files(platformio_packages_path, ["*", "**" + os.sep + "*"]), reverse=True)
            for i, f in enumerate(all_files):
                if is_doc(f):
                    if os.path.isfile(f):
                        os.remove(f)
                    else:
                        try:
                            os.rmdir(f)
                        except:
                            shutil.rmtree(f)
        finally:
            os.chdir(ori_current_dir)
            click.confirm = ori_click_confirm
Esempio n. 10
0
def run(
    ctx=None,
    environment=(),
    target=(),
    upload_port=None,  # pylint: disable=R0913,R0914
    project_dir=os.getcwd(),
    verbose=3,
    disable_auto_clean=False,
):
    with util.cd(project_dir):
        config = util.get_project_config()

        if not config.sections():
            raise exception.ProjectEnvsNotAvailable()

        known = set([s[4:] for s in config.sections() if s.startswith("env:")])
        unknown = set(environment) - known
        if unknown:
            raise exception.UnknownEnvNames(", ".join(unknown), ", ".join(known))

        # clean obsolete .pioenvs dir
        if not disable_auto_clean:
            try:
                _clean_pioenvs_dir(util.get_pioenvs_dir())
            except Exception:
                raise exception.CleanPioenvsDirError(util.get_pioenvs_dir())

        results = []
        for section in config.sections():
            # skip main configuration section
            if section == "platformio":
                continue

            if not section.startswith("env:"):
                raise exception.InvalidEnvName(section)

            envname = section[4:]
            if environment and envname not in environment:
                # echo("Skipped %s environment" % style(envname, fg="yellow"))
                continue

            if results:
                click.echo()

            options = {}
            for k, v in config.items(section):
                options[k] = v

            ep = EnvironmentProcessor(ctx, envname, options, target, upload_port, verbose)
            results.append(ep.process())  # [JORGE_GARCIA] modified to get process description

        return results
Esempio n. 11
0
 def get_project_env(self):
     data = {"env_name": "PlatformIO"}
     with util.cd(self.project_dir):
         config = util.get_project_config()
         for section in config.sections():
             if not section.startswith("env:"):
                 continue
             data = {"env_name": section[4:]}
             for k, v in config.items(section):
                 data[k] = v
             if self.board and self.board == data.get("board"):
                 break
     return data
Esempio n. 12
0
 def get_project_env(self):
     data = {"env_name": "PlatformIO"}
     with util.cd(self.project_dir):
         config = util.get_project_config()
         for section in config.sections():
             if not section.startswith("env:"):
                 continue
             data = {"env_name": section[4:]}
             for k, v in config.items(section):
                 data[k] = v
             if self.board and self.board == data.get("board"):
                 break
     return data
Esempio n. 13
0
def test_init_disable_auto_uploading(platformio_setup, clirunner,
                                     validate_cliresult):
    with clirunner.isolated_filesystem():
        result = clirunner.invoke(cli,
                                  ["-b", "uno", "--disable-auto-uploading"])
        validate_cliresult(result)
        validate_pioproject(getcwd())
        config = util.get_project_config()
        expected_result = [("platform", "atmelavr"), ("framework", "arduino"),
                           ("board", "uno")]
        assert config.has_section("env:autogen_uno")
        assert len(
            set(expected_result).symmetric_difference(
                set(config.items("env:autogen_uno")))) == 0
Esempio n. 14
0
def cli(environment, target, upload_port):

    config = get_project_config()

    if not config.sections():
        raise ProjectEnvsNotAvaialable()

    unknown = set(environment) - set([s[4:] for s in config.sections()])
    if unknown:
        raise UnknownEnvNames(", ".join(unknown))

    for section in config.sections():
        # skip main configuration section
        if section == "platformio":
            continue
        elif section[:4] != "env:":
            raise InvalidEnvName(section)

        envname = section[4:]
        if environment and envname not in environment:
            # echo("Skipped %s environment" % style(envname, fg="yellow"))
            continue

        echo("Processing %s environment:" % style(envname, fg="cyan"))

        variables = ["PIOENV=" + envname]
        if upload_port:
            variables.append("UPLOAD_PORT=%s" % upload_port)
        for k, v in config.items(section):
            k = k.upper()
            if k == "TARGETS" or (k == "UPLOAD_PORT" and upload_port):
                continue
            variables.append("%s=%s" % (k.upper(), v))

        envtargets = []
        if target:
            envtargets = [t for t in target]
        elif config.has_option(section, "targets"):
            envtargets = config.get(section, "targets").split()

        if not config.has_option(section, "platform"):
            raise UndefinedEnvPlatform(envname)

        p = PlatformFactory().newPlatform(config.get(section, "platform"))
        result = p.run(variables, envtargets)
        secho(result['out'], fg="green")
        secho(result['err'],
              fg="red" if "Error" in result['err'] else "yellow")
Esempio n. 15
0
def test_init_special_board(platformio_setup, clirunner, validate_cliresult):
    with clirunner.isolated_filesystem():
        result = clirunner.invoke(cli, ["-b", "uno"])
        validate_cliresult(result)
        validate_pioproject(getcwd())

        uno = util.get_boards("uno")
        config = util.get_project_config()
        expected_result = [("platform", str(uno['platform'])),
                           ("framework", str(uno['frameworks'][0])),
                           ("board", "uno"), ("targets", "upload")]

        assert config.has_section("env:autogen_uno")
        assert len(
            set(expected_result).symmetric_difference(
                set(config.items("env:autogen_uno")))) == 0
Esempio n. 16
0
def test_init_disable_auto_uploading(platformio_setup, clirunner,
                                     validate_cliresult):
    with clirunner.isolated_filesystem():
        result = clirunner.invoke(cli,
                                  ["-b", "uno", "--disable-auto-uploading"])
        validate_cliresult(result)
        validate_pioproject(getcwd())
        config = util.get_project_config()
        expected_result = [
            ("platform", "atmelavr"),
            ("framework", "arduino"),
            ("board", "uno")
        ]
        assert config.has_section("env:uno")
        assert len(set(expected_result).symmetric_difference(
            set(config.items("env:uno")))) == 0
Esempio n. 17
0
def cli(
        ctx,
        environment,
        target,
        upload_port,  # pylint: disable=R0913,R0914
        project_dir,
        verbose):
    with util.cd(project_dir):
        config = util.get_project_config()

        if not config.sections():
            raise exception.ProjectEnvsNotAvailable()

        unknown = set(environment) - set([s[4:] for s in config.sections()])
        if unknown:
            raise exception.UnknownEnvNames(", ".join(unknown))

        # clean obsolete .pioenvs dir
        _clean_pioenvs_dir()

        results = []
        for section in config.sections():
            # skip main configuration section
            if section == "platformio":
                continue

            if not section.startswith("env:"):
                raise exception.InvalidEnvName(section)

            envname = section[4:]
            if environment and envname not in environment:
                # echo("Skipped %s environment" % style(envname, fg="yellow"))
                continue

            if results:
                click.echo()

            options = {}
            for k, v in config.items(section):
                options[k] = v

            ep = EnvironmentProcessor(ctx, envname, options, target,
                                      upload_port, verbose)
            results.append(ep.process())

        if not all(results):
            raise exception.ReturnErrorCode()
Esempio n. 18
0
def test_init_special_board(platformio_setup, clirunner, validate_cliresult):
    with clirunner.isolated_filesystem():
        result = clirunner.invoke(cli, ["-b", "uno"])
        validate_cliresult(result)
        validate_pioproject(getcwd())

        uno = util.get_boards("uno")
        config = util.get_project_config()
        expected_result = [
            ("platform", str(uno['platform'])),
            ("framework", str(uno['frameworks'][0])),
            ("board", "uno")
        ]

        assert config.has_section("env:uno")
        assert len(set(expected_result).symmetric_difference(
            set(config.items("env:uno")))) == 0
Esempio n. 19
0
def fill_project_envs(  # pylint: disable=too-many-arguments,too-many-locals
        ctx, platformio_ini, board_types, enable_auto_uploading, env_prefix,
        force_download):
    builtin_boards = get_boards()
    content = []
    used_boards = []
    used_platforms = []

    config = util.get_project_config(platformio_ini)
    for section in config.sections():
        if not all(
            [section.startswith("env:"),
             config.has_option(section, "board")]):
            continue
        used_boards.append(config.get(section, "board"))

    for type_ in board_types:
        data = builtin_boards[type_]
        used_platforms.append(data['platform'])

        if type_ in used_boards:
            continue

        content.append("")
        content.append("[env:%s%s]" % (env_prefix, type_))
        content.append("platform = %s" % data['platform'])

        # find default framework for board
        frameworks = data.get("frameworks")
        if frameworks:
            content.append("framework = %s" % frameworks[0])

        content.append("board = %s" % type_)
        if enable_auto_uploading:
            content.append("targets = upload")

    if force_download and used_platforms:
        _install_dependent_platforms(ctx, used_platforms)

    if not content:
        return

    with open(platformio_ini, "a") as f:
        content.append("")
        f.write("\n".join(content))
Esempio n. 20
0
def cli(ctx, environment, target, upload_port):

    config = util.get_project_config()

    if not config.sections():
        raise exception.ProjectEnvsNotAvailable()

    unknown = set(environment) - set([s[4:] for s in config.sections()])
    if unknown:
        raise exception.UnknownEnvNames(", ".join(unknown))

    # remove ".pioenvs" if project config is modified
    _pioenvs_dir = util.get_pioenvs_dir()
    if (isdir(_pioenvs_dir)
            and getmtime(join(util.get_project_dir(),
                              "platformio.ini")) > getmtime(_pioenvs_dir)):
        rmtree(_pioenvs_dir)

    found_error = False
    _first_done = False
    for section in config.sections():
        # skip main configuration section
        if section == "platformio":
            continue
        elif section[:4] != "env:":
            raise exception.InvalidEnvName(section)

        envname = section[4:]
        if environment and envname not in environment:
            # echo("Skipped %s environment" % style(envname, fg="yellow"))
            continue

        options = {}
        for k, v in config.items(section):
            options[k] = v

        if _first_done:
            click.echo()

        if not process_environment(ctx, envname, options, target, upload_port):
            found_error = True
        _first_done = True

    if found_error:
        raise exception.ReturnErrorCode()
Esempio n. 21
0
def cli(ctx, environment, target, upload_port):

    config = util.get_project_config()

    if not config.sections():
        raise exception.ProjectEnvsNotAvailable()

    unknown = set(environment) - set([s[4:] for s in config.sections()])
    if unknown:
        raise exception.UnknownEnvNames(", ".join(unknown))

    # remove ".pioenvs" if project config is modified
    _pioenvs_dir = util.get_pioenvs_dir()
    if (isdir(_pioenvs_dir) and
            getmtime(join(util.get_project_dir(), "platformio.ini")) >
            getmtime(_pioenvs_dir)):
        rmtree(_pioenvs_dir)

    found_error = False
    _first_done = False
    for section in config.sections():
        # skip main configuration section
        if section == "platformio":
            continue
        elif section[:4] != "env:":
            raise exception.InvalidEnvName(section)

        envname = section[4:]
        if environment and envname not in environment:
            # echo("Skipped %s environment" % style(envname, fg="yellow"))
            continue

        options = {}
        for k, v in config.items(section):
            options[k] = v

        if _first_done:
            click.echo()

        if not process_environment(ctx, envname, options, target, upload_port):
            found_error = True
        _first_done = True

    if found_error:
        raise exception.ReturnErrorCode()
Esempio n. 22
0
def init_base_project(project_dir):
    platformio_ini = join(project_dir, "platformio.ini")
    if not isfile(platformio_ini):
        copyfile(join(get_source_dir(), "projectconftpl.ini"), platformio_ini)

    lib_dir = join(project_dir, "lib")
    src_dir = join(project_dir, "src")
    config = util.get_project_config(platformio_ini)
    if config.has_option("platformio", "src_dir"):
        src_dir = join(project_dir, config.get("platformio", "src_dir"))

    for d in (src_dir, lib_dir):
        if not isdir(d):
            makedirs(d)

    init_lib_readme(lib_dir)
    init_ci_conf(project_dir)
    init_cvs_ignore(project_dir)
Esempio n. 23
0
def fill_project_envs(  # pylint: disable=too-many-arguments,too-many-locals
        ctx, platformio_ini, board_types, enable_auto_uploading,
        env_prefix, force_download):
    builtin_boards = util.get_boards()
    content = []
    used_boards = []
    used_platforms = []

    config = util.get_project_config(platformio_ini)
    for section in config.sections():
        if not all([section.startswith("env:"),
                    config.has_option(section, "board")]):
            continue
        used_boards.append(config.get(section, "board"))

    for type_ in board_types:
        data = builtin_boards[type_]
        used_platforms.append(data['platform'])

        if type_ in used_boards:
            continue

        content.append("")
        content.append("[env:%s%s]" % (env_prefix, type_))
        content.append("platform = %s" % data['platform'])

        # find default framework for board
        frameworks = data.get("frameworks")
        if frameworks:
            content.append("framework = %s" % frameworks[0])

        content.append("board = %s" % type_)
        if enable_auto_uploading:
            content.append("targets = upload")

    if force_download and used_platforms:
        _install_dependent_platforms(ctx, used_platforms)

    if not content:
        return

    with open(platformio_ini, "a") as f:
        content.append("")
        f.write("\n".join(content))
Esempio n. 24
0
def init_base_project(project_dir):
    platformio_ini = join(project_dir, "platformio.ini")
    if not isfile(platformio_ini):
        copyfile(join(util.get_source_dir(), "projectconftpl.ini"),
                 platformio_ini)

    lib_dir = join(project_dir, "lib")
    src_dir = join(project_dir, "src")
    config = util.get_project_config(platformio_ini)
    if config.has_option("platformio", "src_dir"):
        src_dir = join(project_dir, config.get("platformio", "src_dir"))

    for d in (src_dir, lib_dir):
        if not isdir(d):
            makedirs(d)

    init_lib_readme(lib_dir)
    init_ci_conf(project_dir)
    init_cvs_ignore(project_dir)
Esempio n. 25
0
def cli(ctx, environment, target, upload_port, project_dir, verbose, disable_auto_clean):  # pylint: disable=R0913,R0914
    with util.cd(project_dir):
        config = util.get_project_config()

        if not config.sections():
            raise exception.ProjectEnvsNotAvailable()

        unknown = set(environment) - set([s[4:] for s in config.sections()])
        if unknown:
            raise exception.UnknownEnvNames(", ".join(unknown))

        # clean obsolete .pioenvs dir
        if not disable_auto_clean:
            _clean_pioenvs_dir()

        results = []
        for section in config.sections():
            # skip main configuration section
            if section == "platformio":
                continue

            if not section.startswith("env:"):
                raise exception.InvalidEnvName(section)

            envname = section[4:]
            if environment and envname not in environment:
                # echo("Skipped %s environment" % style(envname, fg="yellow"))
                continue

            if results:
                click.echo()

            options = {}
            for k, v in config.items(section):
                options[k] = v

            ep = EnvironmentProcessor(ctx, envname, options, target, upload_port, verbose)
            results.append(ep.process())

        if not all(results):
            raise exception.ReturnErrorCode()
Esempio n. 26
0
    def _get_build_options(board):
        """
        :type board: str
            """
        with util.cd(pm.PLATFORMIO_WORKSPACE_PATH):
            config = util.get_project_config()

            if not config.sections():
                raise exception.ProjectEnvsNotAvailable()

            known = set([s[4:] for s in config.sections()
                         if s.startswith("env:")])
            unknown = set((board,)) - known
            if unknown:
                return None

            for section in config.sections():
                envName = section[4:]
                if board and envName and envName == board:
                    build_options = {k: v for k, v in config.items(section)}
                    build_options["boardData"] = get_boards(build_options["board"])
                    return build_options

            raise CompilerException(ERROR_BOARD_NOT_SUPPORTED, board)