From 681b90e6b293470af36f7c00e7c8fbde88c514ea Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 3 May 2023 22:28:16 +0300 Subject: [PATCH] Implement ProjectRPC.create_empty --- platformio/home/rpc/handlers/project.py | 40 +++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/platformio/home/rpc/handlers/project.py b/platformio/home/rpc/handlers/project.py index fb77f258..904d00e4 100644 --- a/platformio/home/rpc/handlers/project.py +++ b/platformio/home/rpc/handlers/project.py @@ -16,6 +16,7 @@ import os import shutil import time +import semantic_version from ajsonrpc.core import JSONRPC20DispatchException from platformio import app, exception, fs @@ -265,3 +266,42 @@ class ProjectRPC(BaseRPCHandler): args, options={"cwd": new_project_dir, "force_subprocess": True} ) return new_project_dir + + async def create_empty(self, configuration, options=None): + project_dir = os.path.join(configuration["location"], configuration["name"]) + if not os.path.isdir(project_dir): + os.makedirs(project_dir) + + project_options = [] + platform = configuration["platform"] + board = configuration.get("board", {}).get("id") + env_name = board or platform["name"] + if configuration.get("description"): + project_options.append(("description", configuration.get("description"))) + try: + v = semantic_version.Version(platform.get("version")) + assert not v.prerelease + project_options.append( + ("platform", "{name} @ ^{version}".format(**platform)) + ) + except (AssertionError, ValueError): + project_options.append( + ("platform", "{name} @ {version}".format(**platform)) + ) + if board: + project_options.append(("board", board)) + if configuration.get("framework"): + project_options.append(("framework", configuration["framework"]["name"])) + + args = ["project", "init", "-e", env_name, "--sample-code"] + ide = app.get_session_var("caller_id") + if ide in ProjectGenerator.get_supported_ides(): + args.extend(["--ide", ide]) + for name, value in project_options: + args.extend(["-O", f"{name}={value}"]) + + envclone = os.environ.copy() + envclone["PLATFORMIO_FORCE_ANSI"] = "true" + options = options or {} + options["spawn"] = {"env": envclone, "cwd": project_dir} + return await self.factory.manager.dispatcher["core.exec"](args, options=options)