@@ -17392,7 +17392,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
17392
17392
});
17393
17393
};
17394
17394
Object.defineProperty(exports, "__esModule", { value: true });
17395
- exports.DotnetCoreInstaller = void 0;
17395
+ exports.DotnetCoreInstaller = exports.DotNetVersionInfo = void 0;
17396
17396
// Load tempDirectory before it gets wiped by tool-cache
17397
17397
let tempDirectory = process.env['RUNNER_TEMPDIRECTORY'] || '';
17398
17398
const core = __importStar(__webpack_require__(470));
@@ -17421,30 +17421,103 @@ if (!tempDirectory) {
17421
17421
}
17422
17422
tempDirectory = path.join(baseLocation, 'actions', 'temp');
17423
17423
}
17424
- class DotnetCoreInstaller {
17424
+ /**
17425
+ * Represents the inputted version information
17426
+ */
17427
+ class DotNetVersionInfo {
17425
17428
constructor(version) {
17426
- if (semver.valid(semver.clean(version) || '') == null) {
17427
- throw 'Implicit version not permitted';
17429
+ this.isExactVersionSet = false;
17430
+ // Check for exact match
17431
+ if (semver.valid(semver.clean(version) || '') != null) {
17432
+ this.fullversion = semver.clean(version);
17433
+ this.isExactVersionSet = true;
17434
+ return;
17435
+ }
17436
+ //Note: No support for previews when using generic
17437
+ let parts = version.split('.');
17438
+ if (parts.length < 2 || parts.length > 3)
17439
+ this.throwInvalidVersionFormat();
17440
+ if (parts.length == 3 && parts[2] !== 'x' && parts[2] !== '*') {
17441
+ this.throwInvalidVersionFormat();
17442
+ }
17443
+ let major = this.getVersionNumberOrThrow(parts[0]);
17444
+ let minor = this.getVersionNumberOrThrow(parts[1]);
17445
+ this.fullversion = major + '.' + minor;
17446
+ }
17447
+ getVersionNumberOrThrow(input) {
17448
+ try {
17449
+ if (!input || input.trim() === '')
17450
+ this.throwInvalidVersionFormat();
17451
+ let number = Number(input);
17452
+ if (Number.isNaN(number) || number < 0)
17453
+ this.throwInvalidVersionFormat();
17454
+ return number;
17455
+ }
17456
+ catch (_a) {
17457
+ this.throwInvalidVersionFormat();
17458
+ return -1;
17428
17459
}
17429
- this.version = version;
17460
+ }
17461
+ throwInvalidVersionFormat() {
17462
+ throw 'Invalid version format! Supported: 1.2.3, 1.2, 1.2.x, 1.2.*';
17463
+ }
17464
+ /**
17465
+ * If true exacatly one version should be resolved
17466
+ */
17467
+ isExactVersion() {
17468
+ return this.isExactVersionSet;
17469
+ }
17470
+ version() {
17471
+ return this.fullversion;
17472
+ }
17473
+ }
17474
+ exports.DotNetVersionInfo = DotNetVersionInfo;
17475
+ /**
17476
+ * Represents a resolved version from the Web-Api
17477
+ */
17478
+ class ResolvedVersionInfo {
17479
+ constructor(downloadUrls, resolvedVersion) {
17480
+ if (downloadUrls.length === 0) {
17481
+ throw 'DownloadUrls can not be empty';
17482
+ }
17483
+ if (!resolvedVersion) {
17484
+ throw 'Resolved version is invalid';
17485
+ }
17486
+ this.downloadUrls = downloadUrls;
17487
+ this.resolvedVersion = resolvedVersion;
17488
+ }
17489
+ }
17490
+ class DotnetCoreInstaller {
17491
+ constructor(version) {
17492
+ this.versionInfo = new DotNetVersionInfo(version);
17430
17493
this.cachedToolName = 'dncs';
17431
17494
this.arch = 'x64';
17432
17495
}
17433
17496
installDotnet() {
17434
17497
return __awaiter(this, void 0, void 0, function* () {
17435
17498
// Check cache
17436
- let toolPath;
17499
+ let toolPath = '' ;
17437
17500
let osSuffixes = yield this.detectMachineOS();
17438
17501
let parts = osSuffixes[0].split('-');
17439
17502
if (parts.length > 1) {
17440
17503
this.arch = parts[1];
17441
17504
}
17442
- toolPath = this.getLocalTool();
17505
+ // If version is not generic -> look up cache
17506
+ if (this.versionInfo.isExactVersion())
17507
+ toolPath = this.getLocalTool(this.versionInfo.version());
17443
17508
if (!toolPath) {
17444
17509
// download, extract, cache
17445
- console.log('Getting a download url', this.version);
17446
- let downloadUrls = yield this.getDownloadUrls(osSuffixes, this.version);
17447
- toolPath = yield this.downloadAndInstall(downloadUrls);
17510
+ console.log('Getting a download url', this.versionInfo.version());
17511
+ let resolvedVersionInfo = yield this.resolveInfos(osSuffixes, this.versionInfo);
17512
+ //Check if cache exists for resolved version
17513
+ toolPath = this.getLocalTool(resolvedVersionInfo.resolvedVersion);
17514
+ if (!toolPath) {
17515
+ //If not exists install it
17516
+ toolPath = yield this.downloadAndInstall(resolvedVersionInfo);
17517
+ }
17518
+ else {
17519
+ console.log('Using cached tool');
17520
+ }
17448
17521
}
17449
17522
else {
17450
17523
console.log('Using cached tool');
@@ -17455,9 +17528,9 @@ class DotnetCoreInstaller {
17455
17528
core.addPath(toolPath);
17456
17529
});
17457
17530
}
17458
- getLocalTool() {
17459
- console.log('Checking tool cache');
17460
- return tc.find(this.cachedToolName, this. version, this.arch);
17531
+ getLocalTool(version ) {
17532
+ console.log('Checking tool cache', version );
17533
+ return tc.find(this.cachedToolName, version, this.arch);
17461
17534
}
17462
17535
detectMachineOS() {
17463
17536
return __awaiter(this, void 0, void 0, function* () {
@@ -17517,18 +17590,18 @@ class DotnetCoreInstaller {
17517
17590
return osSuffix;
17518
17591
});
17519
17592
}
17520
- downloadAndInstall(downloadUrls ) {
17593
+ downloadAndInstall(resolvedVersionInfo ) {
17521
17594
return __awaiter(this, void 0, void 0, function* () {
17522
17595
let downloaded = false;
17523
17596
let downloadPath = '';
17524
- for (const url of downloadUrls) {
17597
+ for (const url of resolvedVersionInfo. downloadUrls) {
17525
17598
try {
17526
17599
downloadPath = yield tc.downloadTool(url);
17527
17600
downloaded = true;
17528
17601
break;
17529
17602
}
17530
17603
catch (error) {
17531
- console.log('Could Not Download', url, JSON.stringify(error));
17604
+ console.log('Could not Download', url, JSON.stringify(error));
17532
17605
}
17533
17606
}
17534
17607
if (!downloaded) {
@@ -17541,31 +17614,40 @@ class DotnetCoreInstaller {
17541
17614
: yield tc.extractTar(downloadPath);
17542
17615
// cache tool
17543
17616
console.log('Caching tool');
17544
- let cachedDir = yield tc.cacheDir(extPath, this.cachedToolName, this.version , this.arch);
17545
- console.log('Successfully installed', this.version );
17617
+ let cachedDir = yield tc.cacheDir(extPath, this.cachedToolName, resolvedVersionInfo.resolvedVersion , this.arch);
17618
+ console.log('Successfully installed', resolvedVersionInfo.resolvedVersion );
17546
17619
return cachedDir;
17547
17620
});
17548
17621
}
17549
17622
// OsSuffixes - The suffix which is a part of the file name ex- linux-x64, windows-x86
17550
17623
// Type - SDK / Runtime
17551
- // Version - Version of the SDK/Runtime
17552
- getDownloadUrls (osSuffixes, version ) {
17624
+ // versionInfo - versionInfo of the SDK/Runtime
17625
+ resolveInfos (osSuffixes, versionInfo ) {
17553
17626
return __awaiter(this, void 0, void 0, function* () {
17554
- let downloadUrls = [];
17555
17627
const httpClient = new hc.HttpClient('actions/setup-dotnet', [], {
17556
17628
allowRetries: true,
17557
17629
maxRetries: 3
17558
17630
});
17559
- const releasesJsonUrl = yield this.getReleasesJsonUrl(httpClient, version.split('.'));
17631
+ const releasesJsonUrl = yield this.getReleasesJsonUrl(httpClient, versionInfo. version() .split('.'));
17560
17632
const releasesResponse = yield httpClient.getJson(releasesJsonUrl);
17561
17633
const releasesResult = releasesResponse.result || {};
17562
17634
let releasesInfo = releasesResult['releases'];
17563
17635
releasesInfo = releasesInfo.filter((releaseInfo) => {
17564
- return (releaseInfo['sdk']['version'] === version ||
17565
- releaseInfo['sdk']['version-display'] === version);
17636
+ return (semver.satisfies( releaseInfo['sdk']['version'], versionInfo. version()) ||
17637
+ semver.satisfies( releaseInfo['sdk']['version-display'], versionInfo. version()) );
17566
17638
});
17639
+ // Exclude versions that are newer than the latest if using not exact
17640
+ if (!versionInfo.isExactVersion()) {
17641
+ let latestSdk = releasesResult['latest-sdk'];
17642
+ releasesInfo = releasesInfo.filter((releaseInfo) => semver.lte(releaseInfo['sdk']['version'], latestSdk));
17643
+ }
17644
+ // Sort for latest version
17645
+ releasesInfo = releasesInfo.sort((a, b) => semver.rcompare(a['sdk']['version'], b['sdk']['version']));
17646
+ let downloadedVersion = '';
17647
+ let downloadUrls = [];
17567
17648
if (releasesInfo.length != 0) {
17568
17649
let release = releasesInfo[0];
17650
+ downloadedVersion = release['sdk']['version'];
17569
17651
let files = release['sdk']['files'];
17570
17652
files = files.filter((file) => {
17571
17653
if (file['rid'] == osSuffixes[0] || file['rid'] == osSuffixes[1]) {
@@ -17582,14 +17664,21 @@ class DotnetCoreInstaller {
17582
17664
}
17583
17665
}
17584
17666
else {
17585
- console.log(`Could not fetch download information for version ${version}`);
17586
- downloadUrls = yield this.getFallbackDownloadUrls(version);
17667
+ console.log(`Could not fetch download information for version ${versionInfo.version()}`);
17668
+ if (versionInfo.isExactVersion()) {
17669
+ console.log('Using fallback');
17670
+ downloadUrls = yield this.getFallbackDownloadUrls(versionInfo.version());
17671
+ downloadedVersion = versionInfo.version();
17672
+ }
17673
+ else {
17674
+ console.log('Unable to use fallback, version is generic!');
17675
+ }
17587
17676
}
17588
17677
if (downloadUrls.length == 0) {
17589
- throw `Could not construct download URL. Please ensure that specified version ${version} is valid.`;
17678
+ throw `Could not construct download URL. Please ensure that specified version ${versionInfo. version()}/${downloadedVersion } is valid.`;
17590
17679
}
17591
17680
core.debug(`Got download urls ${downloadUrls}`);
17592
- return downloadUrls;
17681
+ return new ResolvedVersionInfo( downloadUrls, downloadedVersion) ;
17593
17682
});
17594
17683
}
17595
17684
getReleasesJsonUrl(httpClient, versionParts) {
0 commit comments