introduce SettingsProviders

This commit is contained in:
Artur
2023-03-10 22:14:19 +01:00
parent 7ad54e0e3b
commit c57d094fe8
30 changed files with 256 additions and 413 deletions

View File

@@ -0,0 +1,15 @@
export enum SetupFields {
includePrerelease = 'includePrerelease',
versionSpec = 'versionSpec',
ignoreFailedSources = 'ignoreFailedSources'
}
export interface ISetupSettings {
[SetupFields.versionSpec]: string
[SetupFields.includePrerelease]: boolean
[SetupFields.ignoreFailedSources]: boolean
}
export interface ISettingsProvider {
getSetupSettings(): ISetupSettings
}

View File

@@ -0,0 +1,20 @@
import { injectable } from 'inversify'
import { ISettingsProvider, ISetupSettings, SetupFields } from './models'
import { IBuildAgent } from '../../core/models'
@injectable()
export class SettingsProvider implements ISettingsProvider {
constructor(protected buildAgent: IBuildAgent) {}
public getSetupSettings(): ISetupSettings {
const versionSpec = this.buildAgent.getInput(SetupFields.versionSpec)
const includePrerelease = this.buildAgent.getBooleanInput(SetupFields.includePrerelease)
const ignoreFailedSources = this.buildAgent.getBooleanInput(SetupFields.ignoreFailedSources)
return {
versionSpec,
includePrerelease,
ignoreFailedSources
}
}
}

View File

@@ -1,3 +1,5 @@
import { ISettingsProvider } from '../common/models'
export enum CommonFields {
repository = 'repository',
owner = 'owner',
@@ -35,6 +37,22 @@ export enum AddAssetFields {
assets = 'assets'
}
export interface IGitReleaseManagerSettingsProvider extends ISettingsProvider {
getCreateSettings(): GitReleaseManagerCreateSettings
getDiscardSettings(): GitReleaseManagerDiscardSettings
getCloseSettings(): GitReleaseManagerCloseSettings
getOpenSettings(): GitReleaseManagerOpenSettings
getPublishSettings(): GitReleaseManagerPublishSettings
getAddAssetSettings(): GitReleaseManagerAddAssetSettings
getCommonSettings(): GitReleaseManagerSettings
}
export interface GitReleaseManagerSettings {
[CommonFields.repository]: string
[CommonFields.owner]: string
@@ -42,8 +60,7 @@ export interface GitReleaseManagerSettings {
[CommonFields.targetDirectory]: string
}
export interface GitReleaseManagerCreateSettings
extends GitReleaseManagerSettings {
export interface GitReleaseManagerCreateSettings extends GitReleaseManagerSettings {
[CreateFields.milestone]: string
[CreateFields.name]: string
[CreateFields.inputFileName]: string
@@ -52,28 +69,23 @@ export interface GitReleaseManagerCreateSettings
[CreateFields.assets]?: string[]
}
export interface GitReleaseManagerDiscardSettings
extends GitReleaseManagerSettings {
export interface GitReleaseManagerDiscardSettings extends GitReleaseManagerSettings {
[DiscardFields.milestone]: string
}
export interface GitReleaseManagerCloseSettings
extends GitReleaseManagerSettings {
export interface GitReleaseManagerCloseSettings extends GitReleaseManagerSettings {
[CloseFields.milestone]: string
}
export interface GitReleaseManagerOpenSettings
extends GitReleaseManagerSettings {
export interface GitReleaseManagerOpenSettings extends GitReleaseManagerSettings {
[OpenFields.milestone]: string
}
export interface GitReleaseManagerPublishSettings
extends GitReleaseManagerSettings {
export interface GitReleaseManagerPublishSettings extends GitReleaseManagerSettings {
[PublishFields.tagName]: string
}
export interface GitReleaseManagerAddAssetSettings
extends GitReleaseManagerSettings {
export interface GitReleaseManagerAddAssetSettings extends GitReleaseManagerSettings {
[AddAssetFields.tagName]: string
[AddAssetFields.assets]: string[]
}

View File

@@ -1,35 +1,39 @@
import { IBuildAgent } from '../../core/models'
import { IBuildAgent, TYPES } from '../../core/models'
import {
GitReleaseManagerSettings,
AddAssetFields,
CloseFields,
CommonFields,
CreateFields,
DiscardFields,
CloseFields,
OpenFields,
PublishFields,
AddAssetFields,
GitReleaseManagerAddAssetSettings,
GitReleaseManagerCloseSettings,
GitReleaseManagerCreateSettings,
GitReleaseManagerDiscardSettings,
GitReleaseManagerCloseSettings,
GitReleaseManagerOpenSettings,
GitReleaseManagerPublishSettings,
GitReleaseManagerAddAssetSettings
GitReleaseManagerSettings,
IGitReleaseManagerSettingsProvider,
OpenFields,
PublishFields
} from './models'
import { SettingsProvider } from '../common/settings'
import { inject, injectable } from 'inversify'
export class Settings {
public static getCreateSettings(
buildAgent: IBuildAgent
): GitReleaseManagerCreateSettings {
const milestone = buildAgent.getInput(CreateFields.milestone)
const name = buildAgent.getInput(CreateFields.name)
const inputFileName = buildAgent.getInput(CreateFields.inputFileName)
const isPreRelease = buildAgent.getBooleanInput(
CreateFields.isPreRelease
)
const commit = buildAgent.getInput(CreateFields.commit)
const assets = buildAgent.getListInput(CreateFields.assets)
@injectable()
export class GitReleaseManagerSettingsProvider extends SettingsProvider implements IGitReleaseManagerSettingsProvider {
constructor(@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent) {
super(buildAgent)
}
const commonSettings = Settings.getCommonSettings(buildAgent)
getCreateSettings(): GitReleaseManagerCreateSettings {
const milestone = this.buildAgent.getInput(CreateFields.milestone)
const name = this.buildAgent.getInput(CreateFields.name)
const inputFileName = this.buildAgent.getInput(CreateFields.inputFileName)
const isPreRelease = this.buildAgent.getBooleanInput(CreateFields.isPreRelease)
const commit = this.buildAgent.getInput(CreateFields.commit)
const assets = this.buildAgent.getListInput(CreateFields.assets)
const commonSettings = this.getCommonSettings()
return {
...commonSettings,
milestone,
@@ -41,61 +45,51 @@ export class Settings {
}
}
public static getDiscardSettings(
buildAgent: IBuildAgent
): GitReleaseManagerDiscardSettings {
const milestone = buildAgent.getInput(DiscardFields.milestone)
getDiscardSettings(): GitReleaseManagerDiscardSettings {
const milestone = this.buildAgent.getInput(DiscardFields.milestone)
const commonSettings = Settings.getCommonSettings(buildAgent)
const commonSettings = this.getCommonSettings()
return {
...commonSettings,
milestone
}
}
public static getCloseSettings(
buildAgent: IBuildAgent
): GitReleaseManagerCloseSettings {
const milestone = buildAgent.getInput(CloseFields.milestone)
getCloseSettings(): GitReleaseManagerCloseSettings {
const milestone = this.buildAgent.getInput(CloseFields.milestone)
const commonSettings = Settings.getCommonSettings(buildAgent)
const commonSettings = this.getCommonSettings()
return {
...commonSettings,
milestone
}
}
public static getOpenSettings(
buildAgent: IBuildAgent
): GitReleaseManagerOpenSettings {
const milestone = buildAgent.getInput(OpenFields.milestone)
getOpenSettings(): GitReleaseManagerOpenSettings {
const milestone = this.buildAgent.getInput(OpenFields.milestone)
const commonSettings = Settings.getCommonSettings(buildAgent)
const commonSettings = this.getCommonSettings()
return {
...commonSettings,
milestone
}
}
public static getPublishSettings(
buildAgent: IBuildAgent
): GitReleaseManagerPublishSettings {
const tagName = buildAgent.getInput(PublishFields.tagName)
getPublishSettings(): GitReleaseManagerPublishSettings {
const tagName = this.buildAgent.getInput(PublishFields.tagName)
const commonSettings = Settings.getCommonSettings(buildAgent)
const commonSettings = this.getCommonSettings()
return {
...commonSettings,
tagName
}
}
public static getAddAssetSettings(
buildAgent: IBuildAgent
): GitReleaseManagerAddAssetSettings {
const tagName = buildAgent.getInput(AddAssetFields.tagName)
const assets = buildAgent.getListInput(AddAssetFields.assets)
getAddAssetSettings(): GitReleaseManagerAddAssetSettings {
const tagName = this.buildAgent.getInput(AddAssetFields.tagName)
const assets = this.buildAgent.getListInput(AddAssetFields.assets)
const commonSettings = Settings.getCommonSettings(buildAgent)
const commonSettings = this.getCommonSettings()
return {
...commonSettings,
tagName,
@@ -103,15 +97,11 @@ export class Settings {
}
}
private static getCommonSettings(
buildAgent: IBuildAgent
): GitReleaseManagerSettings {
const owner = buildAgent.getInput(CommonFields.owner, true)
const repository = buildAgent.getInput(CommonFields.repository, true)
const token = buildAgent.getInput(CommonFields.token, true)
const targetDirectory = buildAgent.getInput(
CommonFields.targetDirectory
)
getCommonSettings(): GitReleaseManagerSettings {
const owner = this.buildAgent.getInput(CommonFields.owner, true)
const repository = this.buildAgent.getInput(CommonFields.repository, true)
const token = this.buildAgent.getInput(CommonFields.token, true)
const targetDirectory = this.buildAgent.getInput(CommonFields.targetDirectory)
return {
owner,

View File

@@ -1,19 +1,20 @@
import path = require('path')
import * as path from 'path'
import { TYPES, IBuildAgent, IExecResult, ISetupSettings } from '../../core/models'
import { injectable, inject } from 'inversify'
import { IBuildAgent, IExecResult, TYPES } from '../../core/models'
import { inject, injectable } from 'inversify'
import { DotnetTool, IDotnetTool } from '../../core/dotnet-tool'
import { IVersionManager } from '../../core/versionManager'
import {
GitReleaseManagerSettings,
GitReleaseManagerAddAssetSettings,
GitReleaseManagerCloseSettings,
GitReleaseManagerCreateSettings,
GitReleaseManagerDiscardSettings,
GitReleaseManagerCloseSettings,
GitReleaseManagerOpenSettings,
GitReleaseManagerPublishSettings,
GitReleaseManagerAddAssetSettings
GitReleaseManagerSettings
} from './models'
import { ISetupSettings } from '../common/models'
export interface IGitReleaseManagerTool extends IDotnetTool {
install(setupSettings: ISetupSettings): Promise<void>
@@ -26,43 +27,28 @@ export interface IGitReleaseManagerTool extends IDotnetTool {
}
@injectable()
export class GitReleaseManagerTool
extends DotnetTool
implements IGitReleaseManagerTool {
constructor(
@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent,
@inject(TYPES.IVersionManager) versionManager: IVersionManager
) {
export class GitReleaseManagerTool extends DotnetTool implements IGitReleaseManagerTool {
constructor(@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent, @inject(TYPES.IVersionManager) versionManager: IVersionManager) {
super(buildAgent, versionManager)
}
public async install(setupSettings: ISetupSettings): Promise<void> {
await this.toolInstall(
'GitReleaseManager.Tool',
false,
setupSettings
)
await this.toolInstall('GitReleaseManager.Tool', false, setupSettings)
}
public create(
settings: GitReleaseManagerCreateSettings
): Promise<IExecResult> {
public create(settings: GitReleaseManagerCreateSettings): Promise<IExecResult> {
const args = this.getCreateArguments(settings)
return this.execute('dotnet-gitreleasemanager', args)
}
public discard(
settings: GitReleaseManagerDiscardSettings
): Promise<IExecResult> {
public discard(settings: GitReleaseManagerDiscardSettings): Promise<IExecResult> {
const args = this.getDiscardArguments(settings)
return this.execute('dotnet-gitreleasemanager', args)
}
public close(
settings: GitReleaseManagerCloseSettings
): Promise<IExecResult> {
public close(settings: GitReleaseManagerCloseSettings): Promise<IExecResult> {
const args = this.getCloseArguments(settings)
return this.execute('dotnet-gitreleasemanager', args)
@@ -74,17 +60,13 @@ export class GitReleaseManagerTool
return this.execute('dotnet-gitreleasemanager', args)
}
public publish(
settings: GitReleaseManagerPublishSettings
): Promise<IExecResult> {
public publish(settings: GitReleaseManagerPublishSettings): Promise<IExecResult> {
const args = this.getPublishArguments(settings)
return this.execute('dotnet-gitreleasemanager', args)
}
public addAsset(
settings: GitReleaseManagerAddAssetSettings
): Promise<IExecResult> {
public addAsset(settings: GitReleaseManagerAddAssetSettings): Promise<IExecResult> {
const args = this.getAddAssetArguments(settings)
return this.execute('dotnet-gitreleasemanager', args)
@@ -104,9 +86,7 @@ export class GitReleaseManagerTool
return args
}
private getCreateArguments(
settings: GitReleaseManagerCreateSettings
): string[] {
private getCreateArguments(settings: GitReleaseManagerCreateSettings): string[] {
const args: string[] = ['create', ...this.getCommonArguments(settings)]
if (settings.milestone) {
@@ -123,10 +103,7 @@ export class GitReleaseManagerTool
if (this.buildAgent.fileExists(settings.inputFileName)) {
args.push('--inputFilePath', settings.inputFileName)
} else {
throw new Error(
'GitReleaseManager inputFilePath not found at ' +
settings.inputFileName
)
throw new Error('GitReleaseManager inputFilePath not found at ' + settings.inputFileName)
}
}
if (settings.isPreRelease) {
@@ -143,9 +120,7 @@ export class GitReleaseManagerTool
return args
}
private getDiscardArguments(
settings: GitReleaseManagerDiscardSettings
): string[] {
private getDiscardArguments(settings: GitReleaseManagerDiscardSettings): string[] {
const args: string[] = ['discard', ...this.getCommonArguments(settings)]
if (settings.milestone) {
@@ -155,9 +130,7 @@ export class GitReleaseManagerTool
return args
}
private getCloseArguments(
settings: GitReleaseManagerCloseSettings
): string[] {
private getCloseArguments(settings: GitReleaseManagerCloseSettings): string[] {
const args: string[] = ['close', ...this.getCommonArguments(settings)]
if (settings.milestone) {
@@ -167,9 +140,7 @@ export class GitReleaseManagerTool
return args
}
private getOpenArguments(
settings: GitReleaseManagerOpenSettings
): string[] {
private getOpenArguments(settings: GitReleaseManagerOpenSettings): string[] {
const args: string[] = ['open', ...this.getCommonArguments(settings)]
if (settings.milestone) {
@@ -179,9 +150,7 @@ export class GitReleaseManagerTool
return args
}
private getPublishArguments(
settings: GitReleaseManagerPublishSettings
): string[] {
private getPublishArguments(settings: GitReleaseManagerPublishSettings): string[] {
const args: string[] = ['publish', ...this.getCommonArguments(settings)]
if (settings.tagName) {
@@ -191,13 +160,8 @@ export class GitReleaseManagerTool
return args
}
private getAddAssetArguments(
settings: GitReleaseManagerAddAssetSettings
): string[] {
const args: string[] = [
'addasset',
...this.getCommonArguments(settings)
]
private getAddAssetArguments(settings: GitReleaseManagerAddAssetSettings): string[] {
const args: string[] = ['addasset', ...this.getCommonArguments(settings)]
if (settings.tagName) {
args.push('--tagName', settings.tagName)

View File

@@ -1,3 +1,5 @@
import { ISettingsProvider } from '../common/models'
export enum ExecuteFields {
targetPath = 'targetPath',
useConfigFile = 'useConfigFile',
@@ -18,6 +20,10 @@ export interface GitVersionSettings {
[ExecuteFields.srcDir]: string
}
export interface IGitVersionSettingsProvider extends ISettingsProvider {
getGitVersionSettings(): GitVersionSettings
}
export interface GitVersionOutput {
Major: number
Minor: number

View File

@@ -1,30 +1,27 @@
import { IBuildAgent } from '../../core/models'
import { IBuildAgent, TYPES } from '../../core/models'
import { GitVersionSettings, ExecuteFields } from './models'
import { ExecuteFields, GitVersionSettings, IGitVersionSettingsProvider } from './models'
import { SettingsProvider } from '../common/settings'
import { inject, injectable } from 'inversify'
export class Settings {
public static getGitVersionSettings(
buildAgent: IBuildAgent
): GitVersionSettings {
const targetPath = buildAgent.getInput(ExecuteFields.targetPath)
@injectable()
export class GitVersionSettingsProvider extends SettingsProvider implements IGitVersionSettingsProvider {
constructor(@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent) {
super(buildAgent)
}
const useConfigFile = buildAgent.getBooleanInput(
ExecuteFields.useConfigFile
)
const configFilePath = buildAgent.getInput(ExecuteFields.configFilePath)
public getGitVersionSettings(): GitVersionSettings {
const targetPath = this.buildAgent.getInput(ExecuteFields.targetPath)
const updateAssemblyInfo = buildAgent.getBooleanInput(
ExecuteFields.updateAssemblyInfo
)
const updateAssemblyInfoFilename = buildAgent.getInput(
ExecuteFields.updateAssemblyInfoFilename
)
const useConfigFile = this.buildAgent.getBooleanInput(ExecuteFields.useConfigFile)
const configFilePath = this.buildAgent.getInput(ExecuteFields.configFilePath)
const additionalArguments = buildAgent.getInput(
ExecuteFields.additionalArguments
)
const updateAssemblyInfo = this.buildAgent.getBooleanInput(ExecuteFields.updateAssemblyInfo)
const updateAssemblyInfoFilename = this.buildAgent.getInput(ExecuteFields.updateAssemblyInfoFilename)
const srcDir = buildAgent.getSourceDir()?.replace(/\\/g, '/')
const additionalArguments = this.buildAgent.getInput(ExecuteFields.additionalArguments)
const srcDir = this.buildAgent.getSourceDir()?.replace(/\\/g, '/')
return {
targetPath,

View File

@@ -1,10 +1,9 @@
import path = require('path')
import { injectable, inject } from 'inversify'
import { IExecResult, IBuildAgent, TYPES, ISetupSettings } from '../../core/models'
import { inject, injectable } from 'inversify'
import { IBuildAgent, IExecResult, TYPES } from '../../core/models'
import { DotnetTool, IDotnetTool } from '../../core/dotnet-tool'
import { GitVersionSettings, GitVersionOutput } from './models'
import { GitVersionOutput, GitVersionSettings } from './models'
import { IVersionManager } from '../../core/versionManager'
import { ISetupSettings } from '../common/models'
export interface IGitVersionTool extends IDotnetTool {
install(setupSettings: ISetupSettings): Promise<void>
@@ -14,19 +13,12 @@ export interface IGitVersionTool extends IDotnetTool {
@injectable()
export class GitVersionTool extends DotnetTool implements IGitVersionTool {
constructor(
@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent,
@inject(TYPES.IVersionManager) versionManager: IVersionManager
) {
constructor(@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent, @inject(TYPES.IVersionManager) versionManager: IVersionManager) {
super(buildAgent, versionManager)
}
public async install(setupSettings: ISetupSettings): Promise<void> {
await this.toolInstall(
'GitVersion.Tool',
false,
setupSettings
)
await this.toolInstall('GitVersion.Tool', false, setupSettings)
}
public run(options: GitVersionSettings): Promise<IExecResult> {
@@ -52,33 +44,16 @@ export class GitVersionTool extends DotnetTool implements IGitVersionTool {
return workDir.replace(/\\/g, '/')
}
private getArguments(
workDir: string,
options: GitVersionSettings
): string[] {
private getArguments(workDir: string, options: GitVersionSettings): string[] {
let args = [workDir, '/output', 'json', '/output', 'buildserver']
const {
useConfigFile,
configFilePath,
updateAssemblyInfo,
updateAssemblyInfoFilename,
additionalArguments
} = options
const { useConfigFile, configFilePath, updateAssemblyInfo, updateAssemblyInfoFilename, additionalArguments } = options
if (useConfigFile) {
if (
this.buildAgent.isValidInputFile(
'configFilePath',
configFilePath
)
) {
if (this.buildAgent.isValidInputFile('configFilePath', configFilePath)) {
args.push('/config', configFilePath)
} else {
throw new Error(
'GitVersion configuration file not found at ' +
configFilePath
)
throw new Error('GitVersion configuration file not found at ' + configFilePath)
}
}
if (updateAssemblyInfo) {
@@ -86,18 +61,10 @@ export class GitVersionTool extends DotnetTool implements IGitVersionTool {
// You can specify 'updateAssemblyInfo' without 'updateAssemblyInfoFilename'.
if (updateAssemblyInfoFilename?.length > 0) {
if (
this.buildAgent.isValidInputFile(
'updateAssemblyInfoFilename',
updateAssemblyInfoFilename
)
) {
if (this.buildAgent.isValidInputFile('updateAssemblyInfoFilename', updateAssemblyInfoFilename)) {
args.push(updateAssemblyInfoFilename)
} else {
throw new Error(
'AssemblyInfoFilename file not found at ' +
updateAssemblyInfoFilename
)
throw new Error('AssemblyInfoFilename file not found at ' + updateAssemblyInfoFilename)
}
}
}
@@ -182,12 +149,9 @@ export class GitVersionTool extends DotnetTool implements IGitVersionTool {
}
private toCamelCase(input: string): string {
return input.replace(
/(?:^\w|[A-Z]|\b\w|\s+)/g,
function (match, index) {
if (+match === 0) return '' // or if (/\s+/.test(match)) for white spaces
return index == 0 ? match.toLowerCase() : match.toUpperCase()
}
)
return input.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) {
if (+match === 0) return '' // or if (/\s+/.test(match)) for white spaces
return index == 0 ? match.toLowerCase() : match.toUpperCase()
})
}
}