@@ -34278,7 +34278,8 @@ async function ValidateInputs() {
3427834278 versions.sort(([a], [b]) => semver.compare(a, b, true));
3427934279 core.info(`Unity Versions:`);
3428034280 for (const [version, changeset] of versions) {
34281- core.info(` > ${version} (${changeset})`);
34281+ const changesetStr = changeset ? ` (${changeset})` : '';
34282+ core.info(` > ${version}${changesetStr}`);
3428234283 }
3428334284 return [versions, architecture, modules, unityProjectPath];
3428434285}
@@ -34397,10 +34398,15 @@ function getUnityVersionsFromInput() {
3439734398 if (!inputVersions || inputVersions.length == 0) {
3439834399 return versions;
3439934400 }
34400- const versionRegEx = new RegExp(/(?<version>(?:(?<major>\d+)\.)? (?:(?<minor>\d+)\.)?(?:(?<patch>\d+[fab]\d+)\b))\s?(?:\((?<changeset>\w+)\))?/g);
34401+ const versionRegEx = new RegExp(/(?<version>(?:(?<major>\d+)\.?) (?:(?<minor>\d+)\.? )?(?:(?<patch>\d+[fab]\d+)? \b))\s?(?:\((?<changeset>\w+)\))?/g);
3440134402 const matches = Array.from(inputVersions.matchAll(versionRegEx));
34403+ core.debug(`Unity Versions from input:`);
3440234404 for (const match of matches) {
34403- versions.push([match.groups.version, match.groups.changeset]);
34405+ const version = match.groups.version.replace(/\.$/, '');
34406+ const changeset = match.groups.changeset;
34407+ const changesetStr = changeset ? ` (${changeset})` : '';
34408+ core.debug(`${version}${changesetStr}`);
34409+ versions.push([version, changeset]);
3440434410 }
3440534411 return versions;
3440634412}
@@ -34784,6 +34790,11 @@ async function Unity(version, changeset, architecture, modules) {
3478434790 core.info(`Unity ${version} does not support arm64 architecture, falling back to x86_64`);
3478534791 architecture = 'x86_64';
3478634792 }
34793+ if (!changeset) {
34794+ const [latestVersion, latestChangeset] = await getLatestRelease(version, architecture === 'arm64');
34795+ version = latestVersion;
34796+ changeset = latestChangeset;
34797+ }
3478734798 let editorPath = await checkInstalledEditors(version, architecture, false);
3478834799 if (!editorPath) {
3478934800 await installUnity(version, changeset, architecture, modules);
@@ -34793,7 +34804,8 @@ async function Unity(version, changeset, architecture, modules) {
3479334804 core.info(`Unity Editor Path:\n > "${editorPath}"`);
3479434805 core.addPath(editorPath);
3479534806 try {
34796- core.startGroup(`Checking installed modules for Unity ${version}(${changeset})...`);
34807+ const changesetStr = changeset ? ` (${changeset})` : '';
34808+ core.startGroup(`Checking installed modules for Unity ${version}${changesetStr}...`);
3479734809 const [installedModules, additionalModules] = await checkEditorModules(editorPath, version, architecture, modules);
3479834810 if (installedModules && installedModules.length > 0) {
3479934811 core.info(`Installed Modules:`);
@@ -34813,9 +34825,59 @@ async function Unity(version, changeset, architecture, modules) {
3481334825 }
3481434826 return editorPath;
3481534827}
34828+ async function getLatestRelease(version, isSilicon) {
34829+ const releases = (await execUnityHub([`editors`, `--releases`])).split('\n');
34830+ for (const release of releases) {
34831+ if (!release || release.trim().length === 0) {
34832+ continue;
34833+ }
34834+ const semVersion = semver.coerce(version);
34835+ const semVerRelease = semver.coerce(release);
34836+ core.debug(`Checking ${semVersion} against ${semVerRelease}`);
34837+ if (semver.satisfies(semVerRelease, `^${semVersion}`)) {
34838+ const match = release.match(/(?<version>\d+\.\d+\.\d+[fab]?\d*)\s*(?:\((?<arch>Apple silicon|Intel)\))?/);
34839+ if (match && match.groups && match.groups.version) {
34840+ core.info(`Found Unity ${match.groups.version}`);
34841+ return [match.groups.version, undefined];
34842+ }
34843+ }
34844+ }
34845+ core.info(`Searching for Unity ${version} release...`);
34846+ const baseUrl = `https://public-cdn.cloud.unity3d.com/hub/prod`;
34847+ const url = isSilicon
34848+ ? `${baseUrl}/releases-silicon.json`
34849+ : `${baseUrl}/releases-${process.platform}.json`;
34850+ const response = await fetch(url);
34851+ const data = await response.text();
34852+ return await parseReleases(version, data);
34853+ }
34854+ async function parseReleases(version, data) {
34855+ const releases = JSON.parse(data);
34856+ core.debug(`Found ${releases.official.length} official releases...`);
34857+ releases.official.sort((a, b) => semver.compare(a.version, b.version, true));
34858+ for (const release of releases.official) {
34859+ const semVersion = semver.coerce(version);
34860+ const semVerRelease = semver.coerce(release.version);
34861+ core.debug(`Checking ${semVersion} against ${semVerRelease}`);
34862+ if (semver.satisfies(semVerRelease, `^${semVersion}`)) {
34863+ core.debug(`Found Unity ${release.version} release.`);
34864+ const match = release.downloadUrl.match(/download_unity\/(?<changeset>[a-zA-Z0-9]+)\//);
34865+ if (match && match.groups && match.groups.changeset) {
34866+ const changeset = match.groups.changeset;
34867+ core.info(`Found Unity ${release.version} (${changeset})`);
34868+ return [release.version, changeset];
34869+ }
34870+ }
34871+ }
34872+ throw new Error(`Failed to find Unity ${version} release. Please provide a valid changeset.`);
34873+ }
3481634874async function installUnity(version, changeset, architecture, modules) {
34817- core.startGroup(`Installing Unity ${version} (${changeset})...`);
34818- const args = ['install', '--version', version, '--changeset', changeset];
34875+ const changesetStr = changeset ? ` (${changeset})` : '';
34876+ core.startGroup(`Installing Unity ${version}${changesetStr}...`);
34877+ const args = ['install', '--version', version];
34878+ if (changeset) {
34879+ args.push('--changeset', changeset);
34880+ }
3481934881 if (architecture) {
3482034882 args.push('-a', architecture);
3482134883 }
@@ -34837,7 +34899,11 @@ async function ListInstalledEditors() {
3483734899 return await execUnityHub(['editors', '-i']);
3483834900}
3483934901function isArmCompatible(version) {
34840- return semver.compare(version, '2021.1.0f1', true) >= 0;
34902+ const semVersion = semver.coerce(version);
34903+ if (semVersion.major < 2021) {
34904+ return false;
34905+ }
34906+ return semver.compare(semVersion, '2021.1.0f1', true) >= 0;
3484134907}
3484234908async function checkInstalledEditors(version, architecture, failOnEmpty = true) {
3484334909 const output = await ListInstalledEditors();
@@ -45419,7 +45485,7 @@ const main = async () => {
4541945485 process.exit(0);
4542045486 }
4542145487 catch (error) {
45422- core.setFailed(error);
45488+ core.setFailed(error.stack );
4542345489 }
4542445490};
4542545491main();
0 commit comments