Update tag resolver to use tag order instead of author date

This commit is contained in:
Paul Hatcherian 2022-04-15 11:34:02 -04:00
parent 0e3d4652d7
commit cd16d71443
6 changed files with 126 additions and 13 deletions

View file

@ -337,6 +337,7 @@ test('Changes to multiple monitored path is false when change is not in path', a
expect(result.changed).toBe(false);
}, 15000);
test('Namespace is tracked separately', async () => {
const repo = createTestRepo({ tagPrefix: '' }); // 0.0.0
@ -464,3 +465,85 @@ test('Tag prefix can include forward slash', async () => {
expect(result.formattedVersion).toBe('1.2.3+0');
}, 15000);
test('Tags immediately before merge are detected', async () => {
const repo = createTestRepo({ tagPrefix: 'v' }); // 0.0.0
repo.makeCommit('Initial Commit');
repo.makeCommit('Commit 1');
repo.exec('git tag v1.0.0');
repo.makeCommit('Commit 2');
repo.exec('git checkout -b feature/branch');
repo.makeCommit('Commit 3');
repo.makeCommit('Commit 4');
repo.exec('git tag v2.0.0');
repo.exec('git checkout master');
repo.makeCommit('Commit 5');
repo.exec('git merge feature/branch');
const result = await repo.runAction();
expect(result.versionTag).toBe('v2.0.1');
}, 15000);
test('Correct tag is detected on merged branches', async () => {
const repo = createTestRepo({ tagPrefix: 'v' }); // 0.0.0
repo.makeCommit('Initial Commit');
repo.makeCommit('Commit 1');
repo.exec('git tag v1.0.0');
repo.makeCommit('Commit 2');
repo.exec('git checkout -b feature/branch');
repo.makeCommit('Commit 3');
repo.exec('git tag v2.0.0');
repo.makeCommit('Commit 4');
repo.exec('git checkout master');
repo.makeCommit('Commit 5');
repo.exec('git merge feature/branch');
const result = await repo.runAction();
expect(result.versionTag).toBe('v2.0.1');
}, 15000);
test('Correct tag is detected on multiple branches', async () => {
const repo = createTestRepo({ tagPrefix: 'v' }); // 0.0.0
repo.makeCommit('Initial Commit');
repo.makeCommit('Commit 1');
repo.exec('git checkout -b feature/branch1');
repo.exec('git tag v1.0.0');
repo.makeCommit('Commit 2');
repo.exec('git checkout master');
repo.exec('git merge feature/branch1');
repo.exec('git checkout -b feature/branch2');
repo.makeCommit('Commit 3');
repo.exec('git tag v2.0.0');
repo.makeCommit('Commit 4');
repo.exec('git checkout master');
repo.makeCommit('Commit 5');
repo.exec('git merge feature/branch2');
const result = await repo.runAction();
expect(result.versionTag).toBe('v2.0.1');
}, 15000);
test('Correct tag is detected when versions pass 10s place', async () => {
const repo = createTestRepo({ tagPrefix: 'v' }); // 0.0.0
repo.makeCommit('Initial Commit');
repo.makeCommit('Commit 1');
repo.exec('git checkout -b feature/branch1');
repo.exec('git tag v10.15.0');
repo.makeCommit('Commit 2');
repo.exec('git checkout master');
repo.exec('git merge feature/branch1');
repo.exec('git checkout -b feature/branch2');
repo.makeCommit('Commit 3');
repo.exec('git tag v10.7.0');
repo.makeCommit('Commit 4');
repo.exec('git checkout master');
repo.makeCommit('Commit 5');
repo.exec('git merge feature/branch2');
const result = await repo.runAction();
expect(result.versionTag).toBe('v10.15.1');
}, 15000);

View file

@ -21,17 +21,20 @@ export class TagLastReleaseResolver implements LastReleaseResolver {
)).trim();
const [currentMajor, currentMinor, currentPatch] = !!currentTag ? tagFormatter.Parse(currentTag) : [null, null, null];
let tag = '';
try {
tag = (await cmd(
'git',
`describe`,
`--tags`,
`--abbrev=0`,
`--match=${releasePattern}`,
`${current}~1`
)).trim();
if (!!currentTag) {
// If we already have the current branch tagged, we are checking for the previous one
// so that we will have an accurate increment (assuming the new tag is the expected one)
const command = `git for-each-ref --count=2 --sort=-v:*refname --format=%(refname:short) --merged=${current} refs/tags/${releasePattern}`;
tag = await cmd(command);
tag = tag.split('\n').at(-1) || '';
} else {
const command = `git for-each-ref --count=1 --sort=-v:*refname --format=%(refname:short) --merged=${current} refs/tags/${releasePattern}`;
tag = await cmd(command);
}
tag = tag.trim();
}
catch (err) {
tag = '';