diff --git a/node-src/git/git.test.ts b/node-src/git/git.test.ts index 41eb9ef51..b619eac05 100644 --- a/node-src/git/git.test.ts +++ b/node-src/git/git.test.ts @@ -1,12 +1,49 @@ import { execaCommand } from 'execa'; import { describe, expect, it, vi } from 'vitest'; -import { getSlug } from './git'; +import { getCommit, getSlug } from './git'; vi.mock('execa'); const command = vi.mocked(execaCommand); +describe('getCommit', () => { + it('parses log output', async () => { + command.mockImplementation( + () => + Promise.resolve({ + all: `19b6c9c5b3d34d9fc55627fcaf8a85bd5d5e5b2a ## 1696588814 ## info@ghengeveld.nl ## Gert Hengeveld`, + }) as any + ); + expect(await getCommit()).toEqual({ + commit: '19b6c9c5b3d34d9fc55627fcaf8a85bd5d5e5b2a', + committedAt: 1696588814 * 1000, + committerEmail: 'info@ghengeveld.nl', + committerName: 'Gert Hengeveld', + }); + }); + + it('ignores gpg signature information', async () => { + command.mockImplementation( + () => + Promise.resolve({ + all: ` +gpg: Signature made Fri Oct 6 12:40:14 2023 CEST +gpg: using RSA key 4AEE18F83AFDEB23 +gpg: Can't check signature: No public key +19b6c9c5b3d34d9fc55627fcaf8a85bd5d5e5b2a ## 1696588814 ## info@ghengeveld.nl ## Gert Hengeveld + `.trim(), + }) as any + ); + expect(await getCommit()).toEqual({ + commit: '19b6c9c5b3d34d9fc55627fcaf8a85bd5d5e5b2a', + committedAt: 1696588814 * 1000, + committerEmail: 'info@ghengeveld.nl', + committerName: 'Gert Hengeveld', + }); + }); +}); + describe('getSlug', () => { it('returns the slug portion of the git url', async () => { command.mockImplementation( diff --git a/node-src/git/git.ts b/node-src/git/git.ts index 8ff11b6d3..70b290451 100644 --- a/node-src/git/git.ts +++ b/node-src/git/git.ts @@ -68,7 +68,12 @@ export async function getCommit(revision = '') { // Technically this yields the author info, not committer info `git --no-pager log -n 1 --format="%H ## %ct ## %ae ## %an" ${revision}` ); - const [commit, committedAtSeconds, committerEmail, committerName] = result.split(' ## '); + + // Ignore lines that don't match the expected format (e.g. gpg signature info) + const format = new RegExp('^[a-f0-9]+ ## '); + const data = result.split('\n').find((line: string) => format.test(line)); + + const [commit, committedAtSeconds, committerEmail, committerName] = data.split(' ## '); const committedAt = Number(committedAtSeconds) * 1000; return { commit, committedAt, committerEmail, committerName }; } @@ -119,7 +124,10 @@ export async function getUncommittedHash() { export async function hasPreviousCommit() { const result = await execGitCommand(`git --no-pager log -n 1 --skip=1 --format="%H"`); - return !!result.trim(); + + // Ignore lines that don't match the expected format (e.g. gpg signature info) + const allhex = new RegExp('^[a-f0-9]+$'); + return result.split('\n').some((line: string) => allhex.test(line)); } // Check if a commit exists in the repository