feat: per-command parameters parsing
parent
cd3128149a
commit
18af761e9f
|
|
@ -1,10 +1,11 @@
|
||||||
import { exec, OutputMode } from 'https://deno.land/x/exec@0.0.5/mod.ts';
|
import { exec, OutputMode } from 'https://deno.land/x/exec@0.0.5/mod.ts';
|
||||||
import { CommandInterface } from './command-interface.ts';
|
import { CommandInterface } from './command-interface.ts';
|
||||||
import { Options } from '../../config/options.ts';
|
import { Options } from '../../config/options.ts';
|
||||||
import { Action, Cache, CloudRunner, Docker, ImageTag, Output } from '../../model/index.ts';
|
import { Action, Cache, CloudRunner, Docker, ImageTag, Input, Output } from '../../model/index.ts';
|
||||||
import PlatformSetup from '../../model/platform-setup.ts';
|
import PlatformSetup from '../../model/platform-setup.ts';
|
||||||
import { core, process } from '../../dependencies.ts';
|
import { core, process } from '../../dependencies.ts';
|
||||||
import MacBuilder from '../../model/mac-builder.ts';
|
import MacBuilder from '../../model/mac-builder.ts';
|
||||||
|
import Parameters from '../../model/parameters.ts';
|
||||||
|
|
||||||
export class BuildCommand implements CommandInterface {
|
export class BuildCommand implements CommandInterface {
|
||||||
public readonly name: string;
|
public readonly name: string;
|
||||||
|
|
@ -13,6 +14,8 @@ export class BuildCommand implements CommandInterface {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async parseParameters(input: Input, parameters: Parameters) {}
|
||||||
|
|
||||||
public async execute(options: Options): Promise<boolean> {
|
public async execute(options: Options): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
log.info('options', options);
|
log.info('options', options);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import { CommandInterface } from './command-interface.ts';
|
import { CommandInterface } from './command-interface.ts';
|
||||||
import { Options } from '../../config/options.ts';
|
import { Options } from '../../config/options.ts';
|
||||||
import { CloudRunner, ImageTag, Output } from '../../model/index.ts';
|
import { CloudRunner, ImageTag, Input, Output } from '../../model/index.ts';
|
||||||
import { core } from '../../dependencies.ts';
|
import { core } from '../../dependencies.ts';
|
||||||
|
import Parameters from '../../model/parameters.ts';
|
||||||
|
|
||||||
// Todo - Verify this entire flow
|
// Todo - Verify this entire flow
|
||||||
export class BuildRemoteCommand implements CommandInterface {
|
export class BuildRemoteCommand implements CommandInterface {
|
||||||
|
|
@ -11,6 +12,8 @@ export class BuildRemoteCommand implements CommandInterface {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async parseParameters(input: Input, parameters: Parameters) {}
|
||||||
|
|
||||||
public async execute(options: Options): Promise<boolean> {
|
public async execute(options: Options): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
const { buildParameters } = options;
|
const { buildParameters } = options;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
import { Options } from '../../config/options.ts';
|
import { Options } from '../../config/options.ts';
|
||||||
|
import Parameters from '../../model/parameters.ts';
|
||||||
|
import { Input } from '../../model/index.ts';
|
||||||
|
|
||||||
export interface CommandInterface {
|
export interface CommandInterface {
|
||||||
name: string;
|
name: string;
|
||||||
execute: (options: Options) => Promise<boolean>;
|
execute: (options: Options) => Promise<boolean>;
|
||||||
|
parseParameters: (input: Input, parameters: Parameters) => Promise<Partial<Parameters>>;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,4 +11,6 @@ export class NonExistentCommand implements CommandInterface {
|
||||||
public async execute(options: Options): Promise<boolean> {
|
public async execute(options: Options): Promise<boolean> {
|
||||||
throw new Error(`Command ${this.name} does not exist`);
|
throw new Error(`Command ${this.name} does not exist`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async parseParameters() {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,26 @@
|
||||||
import { CliArguments } from '../core/cli/cli-arguments.ts';
|
import { CliArguments } from '../core/cli/cli-arguments.ts';
|
||||||
import { EnvVariables } from '../core/env/env-variables.ts';
|
import { EnvVariables } from '../core/env/env-variables.ts';
|
||||||
import { Parameters, Input } from '../model/index.ts';
|
import { Parameters, Input } from '../model/index.ts';
|
||||||
|
import { CommandInterface } from '../commands/command/command-interface.ts';
|
||||||
|
|
||||||
export class Options {
|
export class Options {
|
||||||
public input: Input;
|
public input: Input;
|
||||||
public parameters: Parameters;
|
public parameters: Parameters;
|
||||||
|
private readonly env: EnvVariables;
|
||||||
|
private readonly command: CommandInterface;
|
||||||
|
|
||||||
constructor(env: EnvVariables) {
|
constructor(command: CommandInterface, env: EnvVariables) {
|
||||||
|
this.input = null;
|
||||||
|
this.parameters = null;
|
||||||
this.env = env;
|
this.env = env;
|
||||||
|
this.command = command;
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async generateParameters(args: CliArguments) {
|
public async generateParameters(args: CliArguments) {
|
||||||
this.input = new Input(args);
|
this.input = new Input(args);
|
||||||
this.parameters = await new Parameters(this.input, this.env).parse();
|
this.parameters = await new Parameters(this.input, this.env).registerCommand(this.command).parse();
|
||||||
|
|
||||||
log.debug('Parameters generated.');
|
log.debug('Parameters generated.');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,10 @@ import { GitRepoReader } from './input-readers/git-repo.ts';
|
||||||
import { GithubCliReader } from './input-readers/github-cli.ts';
|
import { GithubCliReader } from './input-readers/github-cli.ts';
|
||||||
import { Cli } from './cli/cli.ts';
|
import { Cli } from './cli/cli.ts';
|
||||||
import { EnvVariables } from '../core/env/env-variables.ts';
|
import { EnvVariables } from '../core/env/env-variables.ts';
|
||||||
|
import { CommandInterface } from '../commands/command/command-interface.ts';
|
||||||
|
|
||||||
class Parameters {
|
class Parameters {
|
||||||
|
private command: CommandInterface;
|
||||||
public editorVersion!: string;
|
public editorVersion!: string;
|
||||||
public customImage!: string;
|
public customImage!: string;
|
||||||
public unitySerial!: string;
|
public unitySerial!: string;
|
||||||
|
|
@ -99,25 +101,24 @@ class Parameters {
|
||||||
// Todo - Don't use process.env directly, that's what the input model class is for.
|
// Todo - Don't use process.env directly, that's what the input model class is for.
|
||||||
// ---
|
// ---
|
||||||
let unitySerial = '';
|
let unitySerial = '';
|
||||||
if (!Deno.env.get('UNITY_SERIAL') && this.input.githubInputEnabled) {
|
if (!this.env.UNITY_SERIAL && this.input.githubInputEnabled) {
|
||||||
// No serial was present, so it is a personal license that we need to convert
|
// No serial was present, so it is a personal license that we need to convert
|
||||||
if (!Deno.env.get('UNITY_LICENSE')) {
|
if (!this.env.UNITY_LICENSE) {
|
||||||
throw new Error(`Missing Unity License File and no Serial was found. If this
|
throw new Error(`Missing Unity License File and no Serial was found. If this
|
||||||
is a personal license, make sure to follow the activation
|
is a personal license, make sure to follow the activation
|
||||||
steps and set the UNITY_LICENSE GitHub secret or enter a Unity
|
steps and set the UNITY_LICENSE GitHub secret or enter a Unity
|
||||||
serial number inside the UNITY_SERIAL GitHub secret.`);
|
serial number inside the UNITY_SERIAL GitHub secret.`);
|
||||||
}
|
}
|
||||||
unitySerial = this.getSerialFromLicenseFile(Deno.env.get('UNITY_LICENSE'));
|
unitySerial = this.getSerialFromLicenseFile(this.env.UNITY_LICENSE);
|
||||||
} else {
|
} else {
|
||||||
unitySerial = Deno.env.get('UNITY_SERIAL')!;
|
unitySerial = this.env.UNITY_SERIAL!;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
const parameters = {
|
||||||
editorVersion,
|
editorVersion,
|
||||||
customImage: this.input.customImage,
|
customImage: this.input.customImage,
|
||||||
unitySerial,
|
unitySerial,
|
||||||
|
runnerTempPath: this.env.RUNNER_TEMP,
|
||||||
runnerTempPath: Deno.env.get('RUNNER_TEMP'),
|
|
||||||
targetPlatform: this.input.targetPlatform,
|
targetPlatform: this.input.targetPlatform,
|
||||||
projectPath: this.input.projectPath,
|
projectPath: this.input.projectPath,
|
||||||
buildName: this.input.buildName,
|
buildName: this.input.buildName,
|
||||||
|
|
@ -168,6 +169,14 @@ class Parameters {
|
||||||
startDependenciesOverride: this.input.startDependenciesOverride,
|
startDependenciesOverride: this.input.startDependenciesOverride,
|
||||||
cacheKey: this.input.cacheKey,
|
cacheKey: this.input.cacheKey,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const commandParameterOverrides = this.command.parseParameters(this.input, parameters);
|
||||||
|
|
||||||
|
// Todo - Maybe return an instance instead
|
||||||
|
return {
|
||||||
|
...parameters,
|
||||||
|
...commandParameterOverrides,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static parseBuildFile(filename, platform, androidAppBundle) {
|
static parseBuildFile(filename, platform, androidAppBundle) {
|
||||||
|
|
@ -194,6 +203,12 @@ class Parameters {
|
||||||
// Slice off the first 4 characters as they are garbage values
|
// Slice off the first 4 characters as they are garbage values
|
||||||
return Buffer.from(license.slice(startIndex, endIndex), 'base64').toString('binary').slice(4);
|
return Buffer.from(license.slice(startIndex, endIndex), 'base64').toString('binary').slice(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
registerCommand(command: CommandInterface) {
|
||||||
|
this.command = command;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Parameters;
|
export default Parameters;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue