From 898a4ef8c7f2879d9ecacead028132909462ab27 Mon Sep 17 00:00:00 2001 From: mbruhin <47482924+mbruhin@users.noreply.github.com> Date: Wed, 14 May 2025 10:22:08 -0600 Subject: [PATCH 1/4] update filter and consolidate logic Signed-off-by: mbruhin <47482924+mbruhin@users.noreply.github.com> --- .../src/actions/bitbucketCloudPullRequest.ts | 5 ++--- .../src/actions/bitbucketServerPullRequest.ts | 5 ++--- plugins/scaffolder-node/src/actions/index.ts | 2 +- .../scaffolder-node/src/actions/util.test.ts | 22 +++++++++++++++++++ plugins/scaffolder-node/src/actions/util.ts | 9 ++++++++ 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/src/actions/bitbucketCloudPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-cloud/src/actions/bitbucketCloudPullRequest.ts index eba9c74a6a..5a30df24f9 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/src/actions/bitbucketCloudPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/src/actions/bitbucketCloudPullRequest.ts @@ -23,6 +23,7 @@ import { addFiles, cloneRepo, parseRepoUrl, + filterGitFiles, } from '@backstage/plugin-scaffolder-node'; import { Config } from '@backstage/config'; import fs from 'fs-extra'; @@ -413,9 +414,7 @@ export function createPublishBitbucketCloudPullRequestAction(options: { // copy files fs.cpSync(sourceDir, tempDir, { recursive: true, - filter: path => { - return !(path.indexOf('.git') > -1); - }, + filter: filterGitFiles, }); await addFiles({ diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts index 71c16beaa7..9176471913 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts @@ -26,6 +26,7 @@ import { addFiles, cloneRepo, parseRepoUrl, + filterGitFiles, } from '@backstage/plugin-scaffolder-node'; import { Config } from '@backstage/config'; import fs from 'fs-extra'; @@ -453,9 +454,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { // copy files fs.cpSync(sourceDir, tempDir, { recursive: true, - filter: path => { - return !(path.indexOf('.git') > -1); - }, + filter: filterGitFiles, }); await addFiles({ diff --git a/plugins/scaffolder-node/src/actions/index.ts b/plugins/scaffolder-node/src/actions/index.ts index c1c8551c53..041d57328a 100644 --- a/plugins/scaffolder-node/src/actions/index.ts +++ b/plugins/scaffolder-node/src/actions/index.ts @@ -33,4 +33,4 @@ export { createBranch, cloneRepo, } from './gitHelpers'; -export { parseRepoUrl, getRepoSourceDirectory } from './util'; +export { parseRepoUrl, getRepoSourceDirectory, filterGitFiles } from './util'; diff --git a/plugins/scaffolder-node/src/actions/util.test.ts b/plugins/scaffolder-node/src/actions/util.test.ts index 4b1e787bbc..2e0a464304 100644 --- a/plugins/scaffolder-node/src/actions/util.test.ts +++ b/plugins/scaffolder-node/src/actions/util.test.ts @@ -244,4 +244,26 @@ describe('scaffolder action utils', () => { }); }); }); + + describe('filterGitFiles', () => { + it('should filter .git directory and its contents but keep other files', () => { + // Import the function to test + const { filterGitFiles } = require('./util'); + + // Should filter out .git directory + expect(filterGitFiles('.git')).toBe(false); + + // Should filter out .git directory in subdirectories + expect(filterGitFiles('subdir/.git')).toBe(false); + + // Should filter out files inside .git directory + expect(filterGitFiles('.git/config')).toBe(false); + expect(filterGitFiles('subdir/.git/config')).toBe(false); + + // Should keep .gitignore and other non-.git-directory files + expect(filterGitFiles('.gitignore')).toBe(true); + expect(filterGitFiles('src/components/GitHubIcon.js')).toBe(true); + expect(filterGitFiles('.github/workflows/ci.yml')).toBe(true); + }); + }); }); diff --git a/plugins/scaffolder-node/src/actions/util.ts b/plugins/scaffolder-node/src/actions/util.ts index 12f73b0c6c..da86befdc7 100644 --- a/plugins/scaffolder-node/src/actions/util.ts +++ b/plugins/scaffolder-node/src/actions/util.ts @@ -186,3 +186,12 @@ export const parseSchemas = ( outputSchema: action.schema.output, }; }; + +/** + * Filter function to exclude the .git directory and its contents + * while keeping other files like .gitignore + * @public + */ +export function filterGitFiles(path: string): boolean { + return !(path.endsWith('.git') || path.includes('.git/')); +} From 9c8ff0c42e72b09b7b4135b44300bbee87421cad Mon Sep 17 00:00:00 2001 From: mbruhin <47482924+mbruhin@users.noreply.github.com> Date: Wed, 14 May 2025 10:24:28 -0600 Subject: [PATCH 2/4] add changeset Signed-off-by: mbruhin <47482924+mbruhin@users.noreply.github.com> --- .changeset/honest-moles-bet.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/honest-moles-bet.md diff --git a/.changeset/honest-moles-bet.md b/.changeset/honest-moles-bet.md new file mode 100644 index 0000000000..22e0cb4533 --- /dev/null +++ b/.changeset/honest-moles-bet.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch +'@backstage/plugin-scaffolder-node': patch +--- + +Update pull request creation filter to include .gitignore files in the created pull request From 9aec88552697f09005924c6aace22bfccd9f2b1a Mon Sep 17 00:00:00 2001 From: mbruhin <47482924+mbruhin@users.noreply.github.com> Date: Wed, 14 May 2025 10:53:40 -0600 Subject: [PATCH 3/4] add API report Signed-off-by: mbruhin <47482924+mbruhin@users.noreply.github.com> --- plugins/scaffolder-node/report.api.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index f2e8501527..c7cf681d33 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -286,6 +286,9 @@ export function fetchFile(options: { token?: string; }): Promise; +// @public +export function filterGitFiles(path: string): boolean; + // @public (undocumented) export const getRepoSourceDirectory: ( workspacePath: string, From d33b55204973aeb690a4d0b64d86feaa283e9070 Mon Sep 17 00:00:00 2001 From: mbruhin <47482924+mbruhin@users.noreply.github.com> Date: Tue, 20 May 2025 11:18:35 -0600 Subject: [PATCH 4/4] update name Signed-off-by: mbruhin <47482924+mbruhin@users.noreply.github.com> --- .../src/actions/bitbucketCloudPullRequest.ts | 4 ++-- .../src/actions/bitbucketServerPullRequest.ts | 4 ++-- plugins/scaffolder-node/report.api.md | 6 ++--- plugins/scaffolder-node/src/actions/index.ts | 6 ++++- .../scaffolder-node/src/actions/util.test.ts | 22 +++++++++++-------- plugins/scaffolder-node/src/actions/util.ts | 2 +- 6 files changed, 26 insertions(+), 18 deletions(-) diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/src/actions/bitbucketCloudPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-cloud/src/actions/bitbucketCloudPullRequest.ts index 5a30df24f9..b59aaa4e41 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/src/actions/bitbucketCloudPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/src/actions/bitbucketCloudPullRequest.ts @@ -23,7 +23,7 @@ import { addFiles, cloneRepo, parseRepoUrl, - filterGitFiles, + isNotGitDirectoryOrContents, } from '@backstage/plugin-scaffolder-node'; import { Config } from '@backstage/config'; import fs from 'fs-extra'; @@ -414,7 +414,7 @@ export function createPublishBitbucketCloudPullRequestAction(options: { // copy files fs.cpSync(sourceDir, tempDir, { recursive: true, - filter: filterGitFiles, + filter: isNotGitDirectoryOrContents, }); await addFiles({ diff --git a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts index 9176471913..f91d30cd75 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts +++ b/plugins/scaffolder-backend-module-bitbucket-server/src/actions/bitbucketServerPullRequest.ts @@ -26,7 +26,7 @@ import { addFiles, cloneRepo, parseRepoUrl, - filterGitFiles, + isNotGitDirectoryOrContents, } from '@backstage/plugin-scaffolder-node'; import { Config } from '@backstage/config'; import fs from 'fs-extra'; @@ -454,7 +454,7 @@ export function createPublishBitbucketServerPullRequestAction(options: { // copy files fs.cpSync(sourceDir, tempDir, { recursive: true, - filter: filterGitFiles, + filter: isNotGitDirectoryOrContents, }); await addFiles({ diff --git a/plugins/scaffolder-node/report.api.md b/plugins/scaffolder-node/report.api.md index c7cf681d33..9a1c856573 100644 --- a/plugins/scaffolder-node/report.api.md +++ b/plugins/scaffolder-node/report.api.md @@ -286,9 +286,6 @@ export function fetchFile(options: { token?: string; }): Promise; -// @public -export function filterGitFiles(path: string): boolean; - // @public (undocumented) export const getRepoSourceDirectory: ( workspacePath: string, @@ -319,6 +316,9 @@ export function initRepoAndPush(input: { commitHash: string; }>; +// @public +export function isNotGitDirectoryOrContents(path: string): boolean; + // @public (undocumented) export const parseRepoUrl: ( repoUrl: string, diff --git a/plugins/scaffolder-node/src/actions/index.ts b/plugins/scaffolder-node/src/actions/index.ts index 041d57328a..686d89d844 100644 --- a/plugins/scaffolder-node/src/actions/index.ts +++ b/plugins/scaffolder-node/src/actions/index.ts @@ -33,4 +33,8 @@ export { createBranch, cloneRepo, } from './gitHelpers'; -export { parseRepoUrl, getRepoSourceDirectory, filterGitFiles } from './util'; +export { + parseRepoUrl, + getRepoSourceDirectory, + isNotGitDirectoryOrContents, +} from './util'; diff --git a/plugins/scaffolder-node/src/actions/util.test.ts b/plugins/scaffolder-node/src/actions/util.test.ts index 2e0a464304..792e306d00 100644 --- a/plugins/scaffolder-node/src/actions/util.test.ts +++ b/plugins/scaffolder-node/src/actions/util.test.ts @@ -245,25 +245,29 @@ describe('scaffolder action utils', () => { }); }); - describe('filterGitFiles', () => { + describe('isNotGitDirectoryOrContents', () => { it('should filter .git directory and its contents but keep other files', () => { // Import the function to test - const { filterGitFiles } = require('./util'); + const { isNotGitDirectoryOrContents } = require('./util'); // Should filter out .git directory - expect(filterGitFiles('.git')).toBe(false); + expect(isNotGitDirectoryOrContents('.git')).toBe(false); // Should filter out .git directory in subdirectories - expect(filterGitFiles('subdir/.git')).toBe(false); + expect(isNotGitDirectoryOrContents('subdir/.git')).toBe(false); // Should filter out files inside .git directory - expect(filterGitFiles('.git/config')).toBe(false); - expect(filterGitFiles('subdir/.git/config')).toBe(false); + expect(isNotGitDirectoryOrContents('.git/config')).toBe(false); + expect(isNotGitDirectoryOrContents('subdir/.git/config')).toBe(false); // Should keep .gitignore and other non-.git-directory files - expect(filterGitFiles('.gitignore')).toBe(true); - expect(filterGitFiles('src/components/GitHubIcon.js')).toBe(true); - expect(filterGitFiles('.github/workflows/ci.yml')).toBe(true); + expect(isNotGitDirectoryOrContents('.gitignore')).toBe(true); + expect(isNotGitDirectoryOrContents('src/components/GitHubIcon.js')).toBe( + true, + ); + expect(isNotGitDirectoryOrContents('.github/workflows/ci.yml')).toBe( + true, + ); }); }); }); diff --git a/plugins/scaffolder-node/src/actions/util.ts b/plugins/scaffolder-node/src/actions/util.ts index da86befdc7..57141e9c24 100644 --- a/plugins/scaffolder-node/src/actions/util.ts +++ b/plugins/scaffolder-node/src/actions/util.ts @@ -192,6 +192,6 @@ export const parseSchemas = ( * while keeping other files like .gitignore * @public */ -export function filterGitFiles(path: string): boolean { +export function isNotGitDirectoryOrContents(path: string): boolean { return !(path.endsWith('.git') || path.includes('.git/')); }