Skip to content

Commit

Permalink
Update tag resolver to use tag order instead of author date
Browse files Browse the repository at this point in the history
  • Loading branch information
PaulHatch committed Apr 15, 2022
1 parent 0e3d465 commit cd16d71
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 13 deletions.
13 changes: 12 additions & 1 deletion dist/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

13 changes: 12 additions & 1 deletion lib/providers/TagLastReleaseResolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,18 @@ class TagLastReleaseResolver {
const [currentMajor, currentMinor, currentPatch] = !!currentTag ? tagFormatter.Parse(currentTag) : [null, null, null];
let tag = '';
try {
tag = (yield (0, CommandRunner_1.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 = yield (0, CommandRunner_1.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 = yield (0, CommandRunner_1.cmd)(command);
}
tag = tag.trim();
}
catch (err) {
tag = '';
Expand Down
7 changes: 6 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
![Build](https://github.com/PaulHatch/semantic-version/workflows/Build/badge.svg)

> *Version 5-alpha now available!*
> Version 5 adds support for several new features and allows easier extension/customization. See the [release notes](https://github.com/PaulHatch/semantic-version/releases/tag/v5.0.0-alpha) for more information.
> Version 5 adds support for several new features and allows easier extension/customization.
> ##### Breaking Changes
> - Versions now use the version number (`--sort=-v:*refname`) rather than date to determine which tag is the latest.
> - "Short tag" support removed
>
> See the [release notes](https://github.com/PaulHatch/semantic-version/releases/tag/v5.0.0-alpha) for more information.
# Git-Based Semantic Versioning

Expand Down
83 changes: 83 additions & 0 deletions src/main.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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);
21 changes: 12 additions & 9 deletions src/providers/TagLastReleaseResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = '';
Expand Down

0 comments on commit cd16d71

Please sign in to comment.