Пример #1
0
        public static async Task <Error[]> Run(ToolchainCommand command, WaxHub waxHub)
        {
            NotifyStatusChange("TOOLCHAIN-START");
            Error[] errors = await RunImpl(command, waxHub);

            NotifyStatusChange("TOOLCHAIN-END");
            return(errors);
        }
Пример #2
0
        public static async Task <Error[]> RunImpl(ToolchainCommand command, WaxHub waxHub)
        {
            List <ExtensionArg> extensionArgs = new List <ExtensionArg>(command.ExtensionArgs);
            bool skipRun = command.SkipRun;

            // BUILD PHASE
            NotifyStatusChange("BUILD-START");
            BuildData buildResult = null;

            if (command.BuildFile != null)
            {
                buildResult = new BuildData(await waxHub.SendRequest("builder", new BuildRequest()
                {
                    BuildFile               = command.BuildFile,
                    BuildTarget             = command.BuildTarget,
                    OutputDirectoryOverride = command.OutputDirectoryOverride,
                }));

                if (buildResult.HasErrors || command.IsErrorCheckOnly)
                {
                    return(buildResult.Errors);
                }

                extensionArgs = new List <ExtensionArg>(buildResult.ExportProperties.ExtensionArgs); // These include the flattened data from the command's ExtensionArgs.
                skipRun       = skipRun || buildResult.ExportProperties.SkipRun;
            }
            else
            {
                NotifyStatusChange("BUILD-SKIP");
            }
            NotifyStatusChange("BUILD-END");

            // GET BUNDLE PHASE (Create a CBX bundle OR use the provided one)
            string cbxFilePath = null;

            NotifyStatusChange("CBX-EXPORT-START");
            // Bundle phase version 1: Create one
            if (command.CbxExportPath != null)
            {
                if (buildResult == null)
                {
                    return new Error[] { new Error()
                                         {
                                             Message = "Cannot export CBX file without a build file."
                                         } }
                }
                ;

                string outputFolder = (command.CbxExportPath ?? "").Length > 0
                    ? command.CbxExportPath
                    : buildResult.ExportProperties.OutputDirectory.Replace("%TARGET_NAME%", "cbx");
                if (!Path.IsAbsolute(outputFolder))
                {
                    outputFolder = FileUtil.JoinPath(
                        buildResult.ExportProperties.ProjectDirectory,
                        outputFolder);
                }

                byte[] cbxFileBytes = CbxFileEncoder.Encode(buildResult.CbxBundle);

                FileUtil.EnsureFolderExists(outputFolder);
                cbxFilePath = FileUtil.JoinPath(outputFolder, buildResult.ProjectID + ".cbx");
                System.IO.File.WriteAllBytes(cbxFilePath, cbxFileBytes);
            }
            else
            {
                NotifyStatusChange("CBX-EXPORT-SKIP");
            }
            NotifyStatusChange("CBX-EXPORT-END");

            // Bundle phase version 2: Use the provided one
            NotifyStatusChange("CBX-FETCH-START");
            if (command.CbxFile != null)
            {
                if (!System.IO.File.Exists(command.CbxFile))
                {
                    return(new Error[] { new Error()
                                         {
                                             Message = "The provided CBX file does not exist: " + command.CbxFile
                                         } });
                }
                cbxFilePath = command.CbxFile;
            }
            else
            {
                NotifyStatusChange("CBX-FETCH-SKIP");
            }
            NotifyStatusChange("CBX-FETCH-END");

            // EXTENSION PHASE
            NotifyStatusChange("EXTENSIONS-START");
            if (extensionArgs.Count == 0)
            {
                NotifyStatusChange("EXTENSIONS-SKIP");
            }
            foreach (string extensionName in extensionArgs.Select(ea => ea.Extension).Distinct())
            {
                NotifyStatusChange("EXTENSION-RUN-START:" + extensionName);
                Dictionary <string, object> extensionRequest = new Dictionary <string, object>();
                if (cbxFilePath != null)
                {
                    extensionRequest["cbxFile"] = cbxFilePath;
                }
                if (buildResult != null)
                {
                    extensionRequest["buildData"] = buildResult;
                }
                Dictionary <string, object> extensionDirectArgs = new Dictionary <string, object>();
                extensionRequest["extArgs"] = extensionDirectArgs;
                foreach (ExtensionArg extensionArg in extensionArgs.Where(extArg => extArg.Extension == extensionName && extArg.Name != null && extArg.Name.Length > 0))
                {
                    extensionDirectArgs[extensionArg.Name] = extensionArg.Value;
                }
                Dictionary <string, object> extensionResult = await waxHub.SendRequest(extensionName, extensionRequest);

                Error[] extensionErrors = Error.GetErrorsFromResult(extensionResult);
                if (extensionErrors.Length > 0)
                {
                    return(extensionErrors);
                }
                NotifyStatusChange("EXTENSION-RUN-END:" + extensionName);
            }
            NotifyStatusChange("EXTENSIONS-END");

            // RUN PHASE
            NotifyStatusChange("RUN-START");
            if ((cbxFilePath != null || buildResult != null) && !skipRun)
            {
                Dictionary <string, object> runtimeRequest = new Dictionary <string, object>()
                {
                    { "realTimePrint", true },
                    { "args", command.RuntimeArgs },
                    { "showLibStack", command.ShowLibraryStackTraces },
                    { "useOutputPrefixes", command.UseOutputPrefixes },
                };
                if (buildResult != null)
                {
                    runtimeRequest["cbxBundle"] = buildResult.CbxBundle;
                }
                else
                {
                    runtimeRequest["cbxPath"] = cbxFilePath;
                }
                Dictionary <string, object> runtimeResult = await waxHub.SendRequest("runtime", runtimeRequest);

                // TODO: return errors
            }
            else
            {
                NotifyStatusChange("RUN-SKIP");
            }
            NotifyStatusChange("RUN-END");

            return(new Error[0]);
        }
Пример #3
0
        public static ToolchainCommand Parse(string[] args)
        {
            Dictionary <string, Dictionary <string, string> > extensionArgsByExtensionName = new Dictionary <string, Dictionary <string, string> >();
            Dictionary <string, string> crayonArgsByName = new Dictionary <string, string>();
            List <string>   runtimeArgs  = new List <string>();
            List <BuildArg> buildArgList = new List <BuildArg>();
            string          targetFile   = null;

            string[] parts;
            for (int i = 0; i < args.Length; i++)
            {
                string arg = args[i];
                if (arg[0] == '-')
                {
                    if (arg.StartsWith("-crayon:"))
                    {
                        parts = arg.Substring("-crayon:".Length).Split('=', 2, StringSplitOptions.None);
                        string argName  = parts[0];
                        string argValue = parts.Length == 1 ? "" : parts[1];
                        crayonArgsByName[argName] = argValue;
                    }
                    else if (arg.StartsWith("-build:"))
                    {
                        parts = arg.Substring("-build:".Length).Split('=', 2, StringSplitOptions.None);
                        string argName  = parts[0];
                        string argValue = parts.Length == 1 ? "" : parts[1];
                        buildArgList.Add(new BuildArg()
                        {
                            Name = argName, Value = argValue
                        });
                    }
                    else if (arg.StartsWith("-ext:"))
                    {
                        string extArgName  = null;
                        string extArgValue = null;
                        parts = arg.Substring("-ext:".Length).Split('.', 2, StringSplitOptions.None);
                        string extName = parts[0];
                        if (parts.Length > 1)
                        {
                            parts       = parts[1].Split('=', 2, StringSplitOptions.None);
                            extArgName  = parts[0];
                            extArgValue = parts.Length == 1 ? "" : parts[1];
                        }

                        if (!extensionArgsByExtensionName.ContainsKey(extName))
                        {
                            extensionArgsByExtensionName.Add(extName, new Dictionary <string, string>());
                        }
                        extensionArgsByExtensionName[extName][extArgName] = extArgValue;
                    }
                    else
                    {
                        runtimeArgs.Add(arg);
                    }
                }
                else if (targetFile == null &&
                         (arg.ToLowerInvariant().EndsWith(".build") || arg.ToLowerInvariant().EndsWith(".cbx")))
                {
                    targetFile = arg;
                }
                else
                {
                    runtimeArgs.Add(arg);
                }
            }

            ToolchainCommand output = new ToolchainCommand()
            {
                BuildArgs = buildArgList.ToArray()
            };

            if (targetFile != null)
            {
                if (targetFile.EndsWith(".cbx"))
                {
                    output.CbxFile = targetFile;
                }
                else
                {
                    output.BuildFile = targetFile;
                }
            }

            output.RuntimeArgs = runtimeArgs.ToArray();

            List <ExtensionArg> extensionArgList = new List <ExtensionArg>();

            foreach (string extension in extensionArgsByExtensionName.Keys.OrderBy(k => k))
            {
                Dictionary <string, string> extensionArgs = extensionArgsByExtensionName[extension];
                if (extensionArgs.Count == 0)
                {
                    extensionArgList.Add(new ExtensionArg()
                    {
                        Extension = extension
                    });
                }
                foreach (string argName in extensionArgs.Keys.OrderBy(k => k))
                {
                    extensionArgList.Add(new ExtensionArg()
                    {
                        Extension = extension, Name = argName, Value = extensionArgs[argName]
                    });
                }
            }
            output.ExtensionArgs = extensionArgList.ToArray();

            List <ToolchainArg> toolchainArgList = new List <ToolchainArg>();

            foreach (string toolchainArg in crayonArgsByName.Keys.OrderBy(k => k))
            {
                toolchainArgList.Add(new ToolchainArg()
                {
                    Name = toolchainArg, Value = crayonArgsByName[toolchainArg]
                });
            }
            output.ToolchainArgs = toolchainArgList.ToArray();

            return(output);
        }