Merge pull request #12089 from ljiljanaholden/ljiljanaholden/scaffolder-gitlab-mr

Ljiljanaholden/scaffolder gitlab mr
This commit is contained in:
Ben Lambert
2022-07-20 15:44:23 +02:00
committed by GitHub
4 changed files with 189 additions and 1 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': minor
---
Updated `publish:gitlab:merge-request` action to allow commit updates and deletes
+1
View File
@@ -406,6 +406,7 @@ export const createPublishGitlabMergeRequestAction: (options: {
branchName: string;
targetPath: string;
token?: string | undefined;
commitAction?: 'update' | 'create' | 'delete' | undefined;
projectid?: string | undefined;
removeSourceBranch?: boolean | undefined;
assignee?: string | undefined;
@@ -377,4 +377,178 @@ describe('createGitLabMergeRequest', () => {
);
});
});
describe('createGitLabMergeRequestWithoutCommitAction', () => {
it('default commitAction is create', async () => {
const input = {
repoUrl: 'gitlab.com?repo=repo&owner=owner',
title: 'Create my new MR',
branchName: 'new-mr',
description: 'This MR is really good',
draft: true,
targetPath: 'source',
};
mockFs({
[workspacePath]: {
source: { 'foo.txt': 'Hello there!' },
irrelevant: { 'bar.txt': 'Nothing to see here' },
},
});
const ctx = {
createTemporaryDirectory: jest.fn(),
output: jest.fn(),
logger: getRootLogger(),
logStream: new Writable(),
input,
workspacePath,
};
await instance.handler(ctx);
expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith(
'owner/repo',
'new-mr',
'Create my new MR',
[
{
action: 'create',
filePath: 'source/foo.txt',
content: 'SGVsbG8gdGhlcmUh',
encoding: 'base64',
execute_filemode: false,
},
],
);
});
});
describe('createGitLabMergeRequestWithCommitAction', () => {
it('commitAction is create when create is passed in options', async () => {
const input = {
repoUrl: 'gitlab.com?repo=repo&owner=owner',
title: 'Create my new MR',
branchName: 'new-mr',
description: 'MR description',
commitAction: 'create',
draft: true,
targetPath: 'source',
};
mockFs({
[workspacePath]: {
source: { 'foo.txt': 'Hello there!' },
irrelevant: { 'bar.txt': 'Nothing to see here' },
},
});
const ctx = {
createTemporaryDirectory: jest.fn(),
output: jest.fn(),
logger: getRootLogger(),
logStream: new Writable(),
input,
workspacePath,
};
await instance.handler(ctx);
expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith(
'owner/repo',
'new-mr',
'Create my new MR',
[
{
action: 'create',
filePath: 'source/foo.txt',
content: 'SGVsbG8gdGhlcmUh',
encoding: 'base64',
execute_filemode: false,
},
],
);
});
it('commitAction is update when update is passed in options', async () => {
const input = {
repoUrl: 'gitlab.com?repo=repo&owner=owner',
title: 'Create my new MR',
branchName: 'new-mr',
description: 'MR description',
commitAction: 'update',
draft: true,
targetPath: 'source',
};
mockFs({
[workspacePath]: {
source: { 'foo.txt': 'Hello there!' },
irrelevant: { 'bar.txt': 'Nothing to see here' },
},
});
const ctx = {
createTemporaryDirectory: jest.fn(),
output: jest.fn(),
logger: getRootLogger(),
logStream: new Writable(),
input,
workspacePath,
};
await instance.handler(ctx);
expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith(
'owner/repo',
'new-mr',
'Create my new MR',
[
{
action: 'update',
filePath: 'source/foo.txt',
content: 'SGVsbG8gdGhlcmUh',
encoding: 'base64',
execute_filemode: false,
},
],
);
});
it('commitAction is delete when delete is passed in options', async () => {
const input = {
repoUrl: 'gitlab.com?repo=repo&owner=owner',
title: 'Create my new MR',
branchName: 'new-mr',
description: 'other MR description',
commitAction: 'delete',
draft: true,
targetPath: 'source',
};
mockFs({
[workspacePath]: {
source: { 'foo.txt': 'Hello there!' },
irrelevant: { 'bar.txt': 'Nothing to see here' },
},
});
const ctx = {
createTemporaryDirectory: jest.fn(),
output: jest.fn(),
logger: getRootLogger(),
logStream: new Writable(),
input,
workspacePath,
};
await instance.handler(ctx);
expect(mockGitlabClient.Commits.create).toHaveBeenCalledWith(
'owner/repo',
'new-mr',
'Create my new MR',
[
{
action: 'delete',
filePath: 'source/foo.txt',
content: 'SGVsbG8gdGhlcmUh',
encoding: 'base64',
execute_filemode: false,
},
],
);
});
});
});
@@ -40,6 +40,7 @@ export const createPublishGitlabMergeRequestAction = (options: {
branchName: string;
targetPath: string;
token?: string;
commitAction?: 'create' | 'delete' | 'update';
/** @deprecated Use projectPath instead */
projectid?: string;
removeSourceBranch?: boolean;
@@ -87,6 +88,13 @@ export const createPublishGitlabMergeRequestAction = (options: {
type: 'string',
description: 'The token to use for authorization to GitLab',
},
commitAction: {
title: 'Commit action',
type: 'string',
enum: ['create', 'update', 'delete'],
description:
'The action to be used for git commit. Defaults to create.',
},
removeSourceBranch: {
title: 'Delete source branch',
type: 'boolean',
@@ -176,7 +184,7 @@ export const createPublishGitlabMergeRequestAction = (options: {
});
const actions: Types.CommitAction[] = fileContents.map(file => ({
action: 'create',
action: ctx.input.commitAction ?? 'create',
filePath: path.posix.join(ctx.input.targetPath, file.path),
encoding: 'base64',
content: file.content.toString('base64'),