Skip to content

Commit 3b6be76

Browse files
dorlugasigalCopilot
andcommitted
refactor(version): combine dev version into single semver-style string
Instead of '1.11.0-dev (v1.11.0-2-g939240b)', output '1.11.0-dev.2+g939240b'. Parses git describe components into a combined semver-compatible format. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 939240b commit 3b6be76

2 files changed

Lines changed: 17 additions & 8 deletions

File tree

src/version.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,26 @@ function getVersion() {
1919
stdio: ['pipe', 'pipe', 'pipe'],
2020
}).trim();
2121

22-
const tagMatch = gitDesc.match(/^v(\d+\.\d+\.\d+)/);
22+
const tagMatch = gitDesc.match(/^v(\d+\.\d+\.\d+)(?:-(\d+)-g([0-9a-f]+))?(-dirty)?$/);
2323
if (tagMatch) {
2424
const gitVersion = tagMatch[1];
25+
const commits = tagMatch[2];
26+
const hash = tagMatch[3];
27+
const dirty = tagMatch[4];
28+
2529
// Exactly on a clean tag — return the tag version
26-
if (gitDesc === `v${gitVersion}`) return gitVersion;
27-
// Ahead of tag or dirty — show dev version derived from the tag
28-
return `${gitVersion}-dev (${gitDesc})`;
30+
if (!commits && !dirty) return gitVersion;
31+
32+
// Build a combined semver-style dev string
33+
let ver = `${gitVersion}-dev`;
34+
if (commits) ver += `.${commits}`;
35+
const meta = [hash ? `g${hash}` : null, dirty ? 'dirty' : null].filter(Boolean).join('.');
36+
if (meta) ver += `+${meta}`;
37+
return ver;
2938
}
3039

3140
// No semver tag found (e.g. bare commit hash) — fall back to package.json
32-
return `${base}-dev (${gitDesc})`;
41+
return `${base}-dev+${gitDesc}`;
3342
} catch {
3443
return `${base}-dev`;
3544
}

test/version.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ describe('Version', () => {
6767
try {
6868
delete require.cache[require.resolve('../src/version')];
6969
const { getVersion } = require('../src/version');
70-
assert.equal(getVersion(), '2.5.0-dev (v2.5.0-3-gabcdef1)');
70+
assert.equal(getVersion(), '2.5.0-dev.3+gabcdef1');
7171
} finally {
7272
child_process.execSync = origExecSync;
7373
delete require.cache[require.resolve('../src/version')];
@@ -85,7 +85,7 @@ describe('Version', () => {
8585
try {
8686
delete require.cache[require.resolve('../src/version')];
8787
const { getVersion } = require('../src/version');
88-
assert.equal(getVersion(), '2.5.0-dev (v2.5.0-dirty)');
88+
assert.equal(getVersion(), '2.5.0-dev+dirty');
8989
} finally {
9090
child_process.execSync = origExecSync;
9191
delete require.cache[require.resolve('../src/version')];
@@ -104,7 +104,7 @@ describe('Version', () => {
104104
delete require.cache[require.resolve('../src/version')];
105105
const { getVersion } = require('../src/version');
106106
const pkg = require('../package.json');
107-
assert.equal(getVersion(), `${pkg.version}-dev (abcdef1)`);
107+
assert.equal(getVersion(), `${pkg.version}-dev+abcdef1`);
108108
} finally {
109109
child_process.execSync = origExecSync;
110110
delete require.cache[require.resolve('../src/version')];

0 commit comments

Comments
 (0)