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)
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()
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
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
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()
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
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
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
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
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")
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
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
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()
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
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))
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()
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)
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))
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)
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()
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)