async function executeInBackground()

in src/utils/mavenUtils.ts [58:109]


async function executeInBackground(mvnArgs: string, pomfile?: string): Promise<any> {
    const mvn: string | undefined = await getMaven(pomfile);
    if (mvn === undefined) {
        throw new MavenNotFoundError();
    }

    const command: string = wrappedWithQuotes(mvn);
    // TODO: re-visit cwd
    const workspaceFolder: vscode.WorkspaceFolder | undefined = pomfile ? vscode.workspace.getWorkspaceFolder(vscode.Uri.file(pomfile)) : undefined;
    const cwd: string | undefined = workspaceFolder ? path.resolve(workspaceFolder.uri.fsPath, mvn, "..") : undefined;
    const userArgs: string | undefined = Settings.Executable.options(pomfile);
    const mvnSettingsFile: string | undefined = Settings.getSettingsFilePath();
    const mvnSettingsArg: string | undefined = mvnSettingsFile ? `-s "${await mavenTerminal.formattedPathForTerminal(mvnSettingsFile)}"` : undefined;
    const matched: RegExpMatchArray | null = [mvnSettingsArg, mvnArgs, userArgs].filter(Boolean).join(" ").match(/(?:[^\s"]+|"[^"]*")+/g); // Split by space, but ignore spaces in quotes
    const args: string[] = matched !== null ? matched : [];
    if (pomfile) {
        args.push("-f", `"${pomfile}"`);
    }
    const spawnOptions: child_process.SpawnOptions = {
        cwd,
        env: Object.assign({}, process.env, Settings.getEnvironment(pomfile)),
        shell: true
    };
    return new Promise<{}>((resolve: (value: any) => void, reject: (e: Error) => void): void => {
        mavenOutputChannel.appendLine(`Spawn ${JSON.stringify({ command, args })}`);
        const proc: child_process.ChildProcess = child_process.spawn(command, args, spawnOptions);
        proc.on("error", (err: Error) => {
            reject(new Error(`Error occurred in background process. ${err.message}`));
        });
        proc.on("exit", (code: number, signal: string) => {
            if (code !== null) {
                if (code === 0) {
                    resolve(code);
                } else {
                    reject(new Error(`Background process terminated with code ${code}.`));
                }
            } else {
                reject(new Error(`Background process killed by signal ${signal}.`));
            }
        });
        if (proc.stdout !== null) {
            proc.stdout.on("data", (chunk: Buffer) => {
                mavenOutputChannel.append(chunk.toString());
            });
        }
        if (proc.stderr !== null) {
            proc.stderr.on("data", (chunk: Buffer) => {
                mavenOutputChannel.append(chunk.toString());
            });
        }
    });
}