From 55a6d2a8c6004b4f8edbfe9898725a22b8133def Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:08:42 -0400 Subject: [PATCH] Fix build-info crash when HEAD has a non-ember-source tag When a commit is tagged for another package (e.g. `v2.1.1-@glimmer/component`), `parseTagVersion` would crash because `semver.parse()` returns null for tags that aren't valid semver after stripping the `-ember-source` suffix. This fixes `parseTagVersion` to return null for unrecognized tags, and updates `buildFromParts` to fall through to the channel build path when the tag isn't a recognized ember-source version tag. Co-Authored-By: Claude Opus 4.6 (1M context) --- broccoli/build-info.js | 7 ++++--- tests/node/build-info-test.js | 31 +++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/broccoli/build-info.js b/broccoli/build-info.js index 1b4c5df4f45..2419e0ef5a2 100644 --- a/broccoli/build-info.js +++ b/broccoli/build-info.js @@ -75,8 +75,8 @@ function buildGitInfo(root) { function buildFromParts(packageVersion, gitInfo) { let { tag, branch, sha } = gitInfo; let shortSha = sha.slice(0, 8); - if (tag) { - let tagVersion = parseTagVersion(tag); + let tagVersion = tag ? parseTagVersion(tag) : null; + if (tag && tagVersion) { return { tag, branch: null, @@ -126,7 +126,8 @@ function readPackageVersion(root) { */ function parseTagVersion(tag) { if (tag) { - return semver.parse(tag.replace(/-ember-source$/, '')).version; + let parsed = semver.parse(tag.replace(/-ember-source$/, '')); + return parsed ? parsed.version : null; } } diff --git a/tests/node/build-info-test.js b/tests/node/build-info-test.js index f25bbdef90a..aede531aa48 100644 --- a/tests/node/build-info-test.js +++ b/tests/node/build-info-test.js @@ -62,10 +62,12 @@ QUnit.module('parseTagVersion', () => { }); }); - QUnit.test('parseTagVersion raises on non-semver tags', function (assert) { - assert.throws(() => { - parseTagVersion('some-non-version-tag'); - }); + QUnit.test('parseTagVersion returns null for non-semver tags', function (assert) { + assert.equal(parseTagVersion('some-non-version-tag'), null); + }); + + QUnit.test('parseTagVersion returns null for non-ember-source package tags', function (assert) { + assert.equal(parseTagVersion('v2.1.1-@glimmer/component'), null); }); }); @@ -134,6 +136,27 @@ QUnit.module('buildFromParts', () => { isBuildForTag: true, }, }, + { + args: [ + '3.4.4', // Non-ember-source tag (e.g. @glimmer/component) should be treated as channel build + { + sha: 'f572d396fae9206628714fb2ce00f72e94f2258f', + branch: 'main', + tag: 'v2.1.1-@glimmer/component', + }, + ], + expected: { + tag: null, + branch: 'main', + sha: 'f572d396fae9206628714fb2ce00f72e94f2258f', + shortSha: 'f572d396', + channel: 'canary', + packageVersion: '3.4.4', + tagVersion: null, + version: '3.4.4-canary+f572d396', + isBuildForTag: false, + }, + }, ].forEach(({ args, expected }) => { QUnit.test(JSON.stringify(args), function (assert) { assert.deepEqual(buildFromParts(...args), expected);