Read-only mirror — the public repositories of the Forgejo instance, refreshed every 10 minutes. The live instance (fg.dieschoenewolke.de) is reachable only over the VPN; clone here with https://git.dieschoenewolke.de/git/<owner>/<repo>.git.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--__test__/git-auth-helper.test.ts3
-rw-r--r--__test__/git-directory-helper.test.ts62
-rw-r--r--dist/index.js12
-rw-r--r--src/git-command-manager.ts7
-rw-r--r--src/git-directory-helper.ts6
5 files changed, 90 insertions, 0 deletions
diff --git a/__test__/git-auth-helper.test.ts b/__test__/git-auth-helper.test.ts
index 2acec38..b58010b 100644
--- a/__test__/git-auth-helper.test.ts
+++ b/__test__/git-auth-helper.test.ts
@@ -770,6 +770,9 @@ async function setup(testName: string): Promise<void> {
return ''
}),
submoduleSync: jest.fn(),
+ submoduleStatus: jest.fn(async () => {
+ return true
+ }),
submoduleUpdate: jest.fn(),
tagExists: jest.fn(),
tryClean: jest.fn(),
diff --git a/__test__/git-directory-helper.test.ts b/__test__/git-directory-helper.test.ts
index 70849b5..02118ae 100644
--- a/__test__/git-directory-helper.test.ts
+++ b/__test__/git-directory-helper.test.ts
@@ -281,6 +281,65 @@ describe('git-directory-helper tests', () => {
expect(git.branchDelete).toHaveBeenCalledWith(false, 'local-branch-2')
})
+ const cleanWhenSubmoduleStatusIsFalse =
+ 'cleans when submodule status is false'
+
+ it(cleanWhenSubmoduleStatusIsFalse, async () => {
+ // Arrange
+ await setup(cleanWhenSubmoduleStatusIsFalse)
+ await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
+
+ //mock bad submodule
+
+ const submoduleStatus = git.submoduleStatus as jest.Mock<any, any>
+ submoduleStatus.mockImplementation(async (remote: boolean) => {
+ return false
+ })
+
+ // Act
+ await gitDirectoryHelper.prepareExistingDirectory(
+ git,
+ repositoryPath,
+ repositoryUrl,
+ clean,
+ ref
+ )
+
+ // Assert
+ const files = await fs.promises.readdir(repositoryPath)
+ expect(files).toHaveLength(0)
+ expect(git.tryClean).toHaveBeenCalled()
+ })
+
+ const doesNotCleanWhenSubmoduleStatusIsTrue =
+ 'does not clean when submodule status is true'
+
+ it(doesNotCleanWhenSubmoduleStatusIsTrue, async () => {
+ // Arrange
+ await setup(doesNotCleanWhenSubmoduleStatusIsTrue)
+ await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '')
+
+ const submoduleStatus = git.submoduleStatus as jest.Mock<any, any>
+ submoduleStatus.mockImplementation(async (remote: boolean) => {
+ return true
+ })
+
+ // Act
+ await gitDirectoryHelper.prepareExistingDirectory(
+ git,
+ repositoryPath,
+ repositoryUrl,
+ clean,
+ ref
+ )
+
+ // Assert
+
+ const files = await fs.promises.readdir(repositoryPath)
+ expect(files.sort()).toEqual(['.git', 'my-file'])
+ expect(git.tryClean).toHaveBeenCalled()
+ })
+
const removesLockFiles = 'removes lock files'
it(removesLockFiles, async () => {
// Arrange
@@ -423,6 +482,9 @@ async function setup(testName: string): Promise<void> {
submoduleForeach: jest.fn(),
submoduleSync: jest.fn(),
submoduleUpdate: jest.fn(),
+ submoduleStatus: jest.fn(async () => {
+ return true
+ }),
tagExists: jest.fn(),
tryClean: jest.fn(async () => {
return true
diff --git a/dist/index.js b/dist/index.js
index 1b418d7..13a291a 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -765,6 +765,13 @@ class GitCommandManager {
yield this.execGit(args);
});
}
+ submoduleStatus() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const output = yield this.execGit(['submodule', 'status'], true);
+ core.debug(output.stdout);
+ return output.exitCode === 0;
+ });
+ }
tagExists(pattern) {
return __awaiter(this, void 0, void 0, function* () {
const output = yield this.execGit(['tag', '--list', pattern]);
@@ -1023,6 +1030,11 @@ function prepareExistingDirectory(git, repositoryPath, repositoryUrl, clean, ref
}
}
core.endGroup();
+ // Check for submodules and delete any existing files if submodules are present
+ if (!(yield git.submoduleStatus())) {
+ remove = true;
+ core.info('Bad Submodules found, removing existing files');
+ }
// Clean
if (clean) {
core.startGroup('Cleaning the repository');
diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts
index 01aedfe..ab07524 100644
--- a/src/git-command-manager.ts
+++ b/src/git-command-manager.ts
@@ -41,6 +41,7 @@ export interface IGitCommandManager {
submoduleForeach(command: string, recursive: boolean): Promise<string>
submoduleSync(recursive: boolean): Promise<void>
submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void>
+ submoduleStatus(): Promise<boolean>
tagExists(pattern: string): Promise<boolean>
tryClean(): Promise<boolean>
tryConfigUnset(configKey: string, globalConfig?: boolean): Promise<boolean>
@@ -357,6 +358,12 @@ class GitCommandManager {
await this.execGit(args)
}
+ async submoduleStatus(): Promise<boolean> {
+ const output = await this.execGit(['submodule', 'status'], true)
+ core.debug(output.stdout)
+ return output.exitCode === 0
+ }
+
async tagExists(pattern: string): Promise<boolean> {
const output = await this.execGit(['tag', '--list', pattern])
return !!output.stdout.trim()
diff --git a/src/git-directory-helper.ts b/src/git-directory-helper.ts
index 2979e97..fcd4b60 100644
--- a/src/git-directory-helper.ts
+++ b/src/git-directory-helper.ts
@@ -81,6 +81,12 @@ export async function prepareExistingDirectory(
}
core.endGroup()
+ // Check for submodules and delete any existing files if submodules are present
+ if (!(await git.submoduleStatus())) {
+ remove = true
+ core.info('Bad Submodules found, removing existing files')
+ }
+
// Clean
if (clean) {
core.startGroup('Cleaning the repository')