From 5ca5404f727029f8629960ae9efbcbaaf17e549f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sat, 9 Mar 2024 20:53:27 +0100 Subject: [PATCH] Moved template copying from EditorLayer to Project --- GlitchyEditor/src/EditorLayer.bf | 98 ++------------------------- GlitchyEditor/src/Project.bf | 109 ++++++++++++++++++++++++++++++- 2 files changed, 114 insertions(+), 93 deletions(-) diff --git a/GlitchyEditor/src/EditorLayer.bf b/GlitchyEditor/src/EditorLayer.bf index 990ce50..dd8f213 100644 --- a/GlitchyEditor/src/EditorLayer.bf +++ b/GlitchyEditor/src/EditorLayer.bf @@ -605,22 +605,25 @@ namespace GlitchyEditor Log.ClientLogger.Error($"Target directory is not empty."); return .Err; } + + String templatePath = scope .(); + Directory.GetCurrentDirectory(templatePath); + Path.Combine(templatePath, "Resources/ProjectTemplate"); - Project newProject = Project.CreateNew(workspaceDirectory, projectName); + Result newProjectResult = Project.CreateNewFromTemplate(workspaceDirectory, projectName, templatePath); // If the project couldn't be created or initialization failed, we delete the workspace directory. - if (newProject == null || InitProject(newProject) == .Err) + if (newProjectResult == .Err) { if (Directory.DelTree(workspaceDirectory) case .Err(let error)) { Log.EngineLogger.Error($"Failed to delete workspace ({workspaceDirectory})."); } - delete newProject; return .Err; } - if (OpenProject(newProject) case .Err) + if (OpenProject(newProjectResult.Get()) case .Err) { Log.ClientLogger.Error($"Failed to open newly created project."); return .Err; @@ -629,93 +632,6 @@ namespace GlitchyEditor return .Ok; } - const String ProjectNamePlaceholder = "[ProjectName]"; - const String CoreLibPathPlaceholder = "[CoreLibPath]"; - - /// Initializes the given project with the template. - private static Result InitProject(Project project) - { - Try!(CopyTemplate(project)); - - Try!(RenameAndFixupFiles(project.WorkspacePath, project)); - - return .Ok; - } - - /// Moves files so that [ProjectName] in their paths will be replaced by the actual project name - private static Result RenameAndFixupFiles(StringView directoryPath, Project project) - { - String fullPath = scope .(256); - String modifiedFileName = scope String(256); - - for (FileFindEntry entry in Directory.Enumerate(scope $"{directoryPath}/*", .Files | .Directories)) - { - entry.GetFilePath(fullPath..Clear()); - - if (fullPath.Contains(ProjectNamePlaceholder)) - { - modifiedFileName.Set(fullPath); - modifiedFileName.Replace(ProjectNamePlaceholder, project.Name); - - if (entry.IsDirectory) - Try!(Directory.Move(fullPath, modifiedFileName)); - else - Try!(File.Move(fullPath, modifiedFileName)); - - Swap!(fullPath, modifiedFileName); - } - - if (entry.IsDirectory) - { - Try!(RenameAndFixupFiles(fullPath, project)); - } - else - { - String fileContent = scope String(); - if (File.ReadAllText(fullPath, fileContent, true) case .Err) - { - Log.EngineLogger.Error($"FixupFile: Failed to read file {fullPath}."); - return .Err; - } - - if (!fileContent.Contains(ProjectNamePlaceholder) && !fileContent.Contains(CoreLibPathPlaceholder)) - continue; - - fileContent.Replace(ProjectNamePlaceholder, project.Name); - - // TODO: This is pretty bad, we don't really want to hard code the script core path like that! - String scriptCorePath = scope .(); - Directory.GetCurrentDirectory(scriptCorePath); - scriptCorePath.Append("/Resources/Scripts/ScriptCore.dll"); - fileContent.Replace(CoreLibPathPlaceholder, scriptCorePath); - - if (File.WriteAllText(fullPath, fileContent, false) case .Err) - { - Log.EngineLogger.Error($"FixupFile: Failed to write file {fullPath}."); - return .Err; - } - } - } - - return .Ok; - } - - /// Copies the template files into the given project. - private static Result CopyTemplate(Project project) - { - String templatePath = scope .(); - Directory.GetCurrentDirectory(templatePath); - Path.Combine(templatePath, "Resources/ProjectTemplate"); - - if (Directory.Copy(templatePath, project.WorkspacePath) case .Err) - { - Log.EngineLogger.Error($"CopyTemplate: Failed to copy template {templatePath} to {project.WorkspacePath}."); - return .Err; - } - - return .Ok; - } - /// If set to true, the popup for creating a new project will be shown. private bool _openCreateProjectModal; diff --git a/GlitchyEditor/src/Project.bf b/GlitchyEditor/src/Project.bf index 3799ee7..36038b0 100644 --- a/GlitchyEditor/src/Project.bf +++ b/GlitchyEditor/src/Project.bf @@ -94,7 +94,7 @@ class Project } /// Creates a new project with the given directory and name. - public static Project CreateNew(StringView projectDirectory, StringView projectName) + public static Result CreateNew(StringView projectDirectory, StringView projectName) { Project project = new Project(projectDirectory); project._projectName = new String(projectName); @@ -108,12 +108,117 @@ class Project Log.EngineLogger.Warning($"Failed to save project file \"{settingsFile}\"."); delete project; - return null; + return .Err; } return project; } + /// Creates a new project with the given name in the specified directory basend on the provided template. + public static Result CreateNewFromTemplate(StringView projectDirectory, StringView projectName, StringView templatePath) + { + Project newProject = Try!(Project.CreateNew(projectDirectory, projectName)); + + if (Project.InitializeTemplate(newProject, templatePath) case .Err) + { + delete newProject; + return .Err; + } + + return newProject; + } + + /// Initializes a project with the provided template. + public static Result InitializeTemplate(Project project, StringView templatePath) + { + Try!(CopyTemplate(project, templatePath)); + + Try!(RenameAndFixupFiles(project.WorkspacePath, project)); + + return .Ok; + } + + /// Copies the template files into the given project. + private static Result CopyTemplate(Project project, StringView templatePath) + { + if (Directory.Copy(templatePath, project.WorkspacePath) case .Err) + { + Log.EngineLogger.Error($"CopyTemplate: Failed to copy template {templatePath} to {project.WorkspacePath}."); + return .Err; + } + + return .Ok; + } + + const String ProjectNamePlaceholder = "[ProjectName]"; + const String CoreLibPathPlaceholder = "[CoreLibPath]"; + + /// Moves files so that [ProjectName] in their paths will be replaced by the actual project name + private static Result RenameAndFixupFiles(StringView directoryPath, Project project) + { + String fullPath = scope .(256); + String modifiedFileName = scope String(256); + + for (FileFindEntry entry in Directory.Enumerate(scope $"{directoryPath}/*", .Files | .Directories)) + { + entry.GetFilePath(fullPath..Clear()); + + if (fullPath.Contains(ProjectNamePlaceholder)) + { + modifiedFileName.Set(fullPath); + modifiedFileName.Replace(ProjectNamePlaceholder, project.Name); + + if (entry.IsDirectory) + Try!(Directory.Move(fullPath, modifiedFileName)); + else + Try!(File.Move(fullPath, modifiedFileName)); + + Swap!(fullPath, modifiedFileName); + } + + if (entry.IsDirectory) + { + Try!(RenameAndFixupFiles(fullPath, project)); + } + else + { + Try!(FixupFile(fullPath, project)); + } + } + + return .Ok; + } + + // Fixups a file by replacing placeholders for e.g. the project name. + private static Result FixupFile(StringView filePath, Project project) + { + String fileContent = scope String(); + if (File.ReadAllText(filePath, fileContent, true) case .Err) + { + Log.EngineLogger.Error($"FixupFile: Failed to read file {filePath}."); + return .Err; + } + + if (!fileContent.Contains(ProjectNamePlaceholder) && !fileContent.Contains(CoreLibPathPlaceholder)) + return .Ok; + + fileContent.Replace(ProjectNamePlaceholder, project.Name); + + // TODO: This is pretty bad, we don't really want to hard code the script core path like that! + String scriptCorePath = scope .(); + Directory.GetCurrentDirectory(scriptCorePath); + scriptCorePath.Append("/Resources/Scripts/ScriptCore.dll"); + fileContent.Replace(CoreLibPathPlaceholder, scriptCorePath); + + if (File.WriteAllText(filePath, fileContent, false) case .Err) + { + Log.EngineLogger.Error($"FixupFile: Failed to write file {filePath}."); + return .Err; + } + + return .Ok; + } + public static Result Load(StringView projectDirectory) { Project project = new Project(projectDirectory);