You've already forked setup-dotnet
							
							
				mirror of
				https://github.com/actions/setup-dotnet.git
				synced 2025-10-31 15:26:22 +07:00 
			
		
		
		
	linter fixes
This commit is contained in:
		| @ -1,340 +1,336 @@ | ||||
| import io = require('@actions/io'); | ||||
| import fs = require('fs'); | ||||
| import path = require('path'); | ||||
|  | ||||
| const fakeSourcesDirForTesting = path.join( | ||||
|   __dirname, | ||||
|   'runner', | ||||
|   path.join( | ||||
|     Math.random() | ||||
|       .toString(36) | ||||
|       .substring(7) | ||||
|   ), | ||||
|   's' | ||||
| ); | ||||
|  | ||||
| const invalidNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>`; | ||||
|  | ||||
| const emptyNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
| </configuration>`; | ||||
|  | ||||
| const nugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const gprnugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="GPR" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" /> | ||||
|     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const gprNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="GPR" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const twogprNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="GPR-GitHub" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" /> | ||||
|     <add key="GPR-Actions" value="https://nuget.pkg.github.com/actions/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const spaceNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="GPR GitHub" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const azureartifactsNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="AzureArtifacts" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const azureartifactsnugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="AzureArtifacts" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json" protocolVersion="3" /> | ||||
|     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| // We want a NuGet.config one level above the sources directory, so it doesn't trample a user's NuGet.config but is still picked up by NuGet/dotnet. | ||||
| const nugetConfigFile = path.join(fakeSourcesDirForTesting, '../nuget.config'); | ||||
|  | ||||
| process.env['GITHUB_REPOSITORY'] = 'OwnerName/repo'; | ||||
| import * as auth from '../src/authutil'; | ||||
|  | ||||
| describe('authutil tests', () => { | ||||
|   beforeEach(async () => { | ||||
|     await io.rmRF(fakeSourcesDirForTesting); | ||||
|     await io.mkdirP(fakeSourcesDirForTesting); | ||||
|   }, 30000); | ||||
|  | ||||
|   afterAll(async () => { | ||||
|     await io.rmRF(fakeSourcesDirForTesting); | ||||
|   }, 30000); | ||||
|  | ||||
|   beforeEach(() => { | ||||
|     if (fs.existsSync(nugetConfigFile)) { | ||||
|       fs.unlinkSync(nugetConfigFile); | ||||
|     } | ||||
|     process.env['INPUT_OWNER'] = ''; | ||||
|     process.env['NUGET_AUTH_TOKEN'] = ''; | ||||
|   }); | ||||
|  | ||||
|   it('No existing config, sets up a full NuGet.config with URL and user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('No existing config, auth token environment variable not provided, throws', async () => { | ||||
|     let thrown = false; | ||||
|     try { | ||||
|       await auth.configAuthentication( | ||||
|         'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|         '', | ||||
|         fakeSourcesDirForTesting | ||||
|       ); | ||||
|     } catch { | ||||
|       thrown = true; | ||||
|     } | ||||
|     expect(thrown).toBe(true); | ||||
|   }); | ||||
|  | ||||
|   it('No existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     process.env['INPUT_OWNER'] = 'otherorg'; | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/otherorg/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config (invalid), tries to parse an invalid NuGet.config and throws', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, invalidNuGetConfig); | ||||
|     let thrown = false; | ||||
|     try { | ||||
|       await auth.configAuthentication( | ||||
|         'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|         '', | ||||
|         fakeSourcesDirForTesting | ||||
|       ); | ||||
|     } catch { | ||||
|       thrown = true; | ||||
|     } | ||||
|     expect(thrown).toBe(true); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, emptyNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, nugetorgNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, gprnugetorgNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, twogprNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ spaces in key, throws for now', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, spaceNuGetConfig); | ||||
|     let thrown = false; | ||||
|     try { | ||||
|       await auth.configAuthentication( | ||||
|         'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|         '', | ||||
|         fakeSourcesDirForTesting | ||||
|       ); | ||||
|     } catch { | ||||
|       thrown = true; | ||||
|     } | ||||
|     expect(thrown).toBe(true); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigDirectory: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'subfolder' | ||||
|     ); | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       inputNuGetConfigDirectory, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.mkdirSync(inputNuGetConfigDirectory, {recursive: true}); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       'subfolder/nuget.config', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, azureartifactsNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, azureartifactsnugetorgNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('No existing config, sets up a full NuGet.config with URL and token for other source', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     await auth.configAuthentication( | ||||
|       'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
| }); | ||||
| import io = require('@actions/io'); | ||||
| import fs = require('fs'); | ||||
| import path = require('path'); | ||||
|  | ||||
| const fakeSourcesDirForTesting = path.join( | ||||
|   __dirname, | ||||
|   'runner', | ||||
|   path.join(Math.random().toString(36).substring(7)), | ||||
|   's' | ||||
| ); | ||||
|  | ||||
| const invalidNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?>`; | ||||
|  | ||||
| const emptyNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
| </configuration>`; | ||||
|  | ||||
| const nugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const gprnugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="GPR" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" /> | ||||
|     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const gprNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="GPR" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const twogprNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="GPR-GitHub" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" /> | ||||
|     <add key="GPR-Actions" value="https://nuget.pkg.github.com/actions/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const spaceNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="GPR GitHub" value="https://nuget.pkg.github.com/OwnerName/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const azureartifactsNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="AzureArtifacts" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| const azureartifactsnugetorgNuGetConfig: string = `<?xml version="1.0" encoding="utf-8"?> | ||||
| <configuration> | ||||
|   <packageSources> | ||||
|     <add key="AzureArtifacts" value="https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json" protocolVersion="3" /> | ||||
|     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> | ||||
|   </packageSources> | ||||
| </configuration>`; | ||||
|  | ||||
| // We want a NuGet.config one level above the sources directory, so it doesn't trample a user's NuGet.config but is still picked up by NuGet/dotnet. | ||||
| const nugetConfigFile = path.join(fakeSourcesDirForTesting, '../nuget.config'); | ||||
|  | ||||
| process.env['GITHUB_REPOSITORY'] = 'OwnerName/repo'; | ||||
| import * as auth from '../src/authutil'; | ||||
|  | ||||
| describe('authutil tests', () => { | ||||
|   beforeEach(async () => { | ||||
|     await io.rmRF(fakeSourcesDirForTesting); | ||||
|     await io.mkdirP(fakeSourcesDirForTesting); | ||||
|   }, 30000); | ||||
|  | ||||
|   afterAll(async () => { | ||||
|     await io.rmRF(fakeSourcesDirForTesting); | ||||
|   }, 30000); | ||||
|  | ||||
|   beforeEach(() => { | ||||
|     if (fs.existsSync(nugetConfigFile)) { | ||||
|       fs.unlinkSync(nugetConfigFile); | ||||
|     } | ||||
|     process.env['INPUT_OWNER'] = ''; | ||||
|     process.env['NUGET_AUTH_TOKEN'] = ''; | ||||
|   }); | ||||
|  | ||||
|   it('No existing config, sets up a full NuGet.config with URL and user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('No existing config, auth token environment variable not provided, throws', async () => { | ||||
|     let thrown = false; | ||||
|     try { | ||||
|       await auth.configAuthentication( | ||||
|         'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|         '', | ||||
|         fakeSourcesDirForTesting | ||||
|       ); | ||||
|     } catch { | ||||
|       thrown = true; | ||||
|     } | ||||
|     expect(thrown).toBe(true); | ||||
|   }); | ||||
|  | ||||
|   it('No existing config, sets up a full NuGet.config with URL and other owner/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     process.env['INPUT_OWNER'] = 'otherorg'; | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/otherorg/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config (invalid), tries to parse an invalid NuGet.config and throws', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, invalidNuGetConfig); | ||||
|     let thrown = false; | ||||
|     try { | ||||
|       await auth.configAuthentication( | ||||
|         'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|         '', | ||||
|         fakeSourcesDirForTesting | ||||
|       ); | ||||
|     } catch { | ||||
|       thrown = true; | ||||
|     } | ||||
|     expect(thrown).toBe(true); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ no sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, emptyNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ no GPR sources, sets up a full NuGet.config with URL and user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, nugetorgNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ only GPR source, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ GPR source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, gprnugetorgNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ two GPR sources, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, twogprNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ spaces in key, throws for now', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, spaceNuGetConfig); | ||||
|     let thrown = false; | ||||
|     try { | ||||
|       await auth.configAuthentication( | ||||
|         'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|         '', | ||||
|         fakeSourcesDirForTesting | ||||
|       ); | ||||
|     } catch { | ||||
|       thrown = true; | ||||
|     } | ||||
|     expect(thrown).toBe(true); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config not in repo root, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigDirectory: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'subfolder' | ||||
|     ); | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       inputNuGetConfigDirectory, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.mkdirSync(inputNuGetConfigDirectory, {recursive: true}); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, gprNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://nuget.pkg.github.com/OwnerName/index.json', | ||||
|       'subfolder/nuget.config', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ only Azure Artifacts source, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, azureartifactsNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('Existing config w/ Azure Artifacts source and NuGet.org, sets up a partial NuGet.config user/PAT for GPR', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     const inputNuGetConfigPath: string = path.join( | ||||
|       fakeSourcesDirForTesting, | ||||
|       'nuget.config' | ||||
|     ); | ||||
|     fs.writeFileSync(inputNuGetConfigPath, azureartifactsnugetorgNuGetConfig); | ||||
|     await auth.configAuthentication( | ||||
|       'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
|  | ||||
|   it('No existing config, sets up a full NuGet.config with URL and token for other source', async () => { | ||||
|     process.env['NUGET_AUTH_TOKEN'] = 'TEST_FAKE_AUTH_TOKEN'; | ||||
|     await auth.configAuthentication( | ||||
|       'https://pkgs.dev.azure.com/amullans/_packaging/GitHubBuilds/nuget/v3/index.json', | ||||
|       '', | ||||
|       fakeSourcesDirForTesting | ||||
|     ); | ||||
|     expect(fs.existsSync(nugetConfigFile)).toBe(true); | ||||
|     expect( | ||||
|       fs.readFileSync(nugetConfigFile, {encoding: 'utf8'}) | ||||
|     ).toMatchSnapshot(); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
							
								
								
									
										310
									
								
								src/authutil.ts
									
									
									
									
									
								
							
							
						
						
									
										310
									
								
								src/authutil.ts
									
									
									
									
									
								
							| @ -1,155 +1,155 @@ | ||||
| import * as fs from 'fs'; | ||||
| import * as path from 'path'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as github from '@actions/github'; | ||||
| import * as xmlbuilder from 'xmlbuilder'; | ||||
| import * as xmlParser from 'fast-xml-parser'; | ||||
| import {ProcessEnvOptions} from 'child_process'; | ||||
|  | ||||
| export function configAuthentication( | ||||
|   feedUrl: string, | ||||
|   existingFileLocation: string = '', | ||||
|   processRoot: string = process.cwd() | ||||
| ) { | ||||
|   const existingNuGetConfig: string = path.resolve( | ||||
|     processRoot, | ||||
|     existingFileLocation === '' | ||||
|       ? getExistingNugetConfig(processRoot) | ||||
|       : existingFileLocation | ||||
|   ); | ||||
|  | ||||
|   const tempNuGetConfig: string = path.resolve( | ||||
|     processRoot, | ||||
|     '../', | ||||
|     'nuget.config' | ||||
|   ); | ||||
|  | ||||
|   writeFeedToFile(feedUrl, existingNuGetConfig, tempNuGetConfig); | ||||
| } | ||||
|  | ||||
| function isValidKey(key: string): boolean { | ||||
|   return /^[\w\-\.]+$/i.test(key); | ||||
| } | ||||
|  | ||||
| function getExistingNugetConfig(processRoot: string) { | ||||
|   const defaultConfigName = 'nuget.config'; | ||||
|   const configFileNames = fs | ||||
|     .readdirSync(processRoot) | ||||
|     .filter(filename => filename.toLowerCase() === defaultConfigName); | ||||
|   if (configFileNames.length) { | ||||
|     return configFileNames[0]; | ||||
|   } | ||||
|   return defaultConfigName; | ||||
| } | ||||
|  | ||||
| function writeFeedToFile( | ||||
|   feedUrl: string, | ||||
|   existingFileLocation: string, | ||||
|   tempFileLocation: string | ||||
| ) { | ||||
|   console.log( | ||||
|     `dotnet-auth: Finding any source references in ${existingFileLocation}, writing a new temporary configuration file with credentials to ${tempFileLocation}` | ||||
|   ); | ||||
|   let xml: xmlbuilder.XMLElement; | ||||
|   let sourceKeys: string[] = []; | ||||
|   let owner: string = core.getInput('owner'); | ||||
|   let sourceUrl: string = feedUrl; | ||||
|   if (!owner) { | ||||
|     owner = github.context.repo.owner; | ||||
|   } | ||||
|  | ||||
|   if (!process.env.NUGET_AUTH_TOKEN || process.env.NUGET_AUTH_TOKEN == '') { | ||||
|     throw new Error( | ||||
|       'The NUGET_AUTH_TOKEN environment variable was not provided. In this step, add the following: \r\nenv:\r\n  NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}' | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   if (fs.existsSync(existingFileLocation)) { | ||||
|     // get key from existing NuGet.config so NuGet/dotnet can match credentials | ||||
|     const curContents: string = fs.readFileSync(existingFileLocation, 'utf8'); | ||||
|     var json = xmlParser.parse(curContents, {ignoreAttributes: false}); | ||||
|  | ||||
|     if (typeof json.configuration == 'undefined') { | ||||
|       throw new Error(`The provided NuGet.config seems invalid.`); | ||||
|     } | ||||
|     if (typeof json.configuration.packageSources != 'undefined') { | ||||
|       if (typeof json.configuration.packageSources.add != 'undefined') { | ||||
|         // file has at least one <add> | ||||
|         if (typeof json.configuration.packageSources.add[0] == 'undefined') { | ||||
|           // file has only one <add> | ||||
|           if ( | ||||
|             json.configuration.packageSources.add['@_value'] | ||||
|               .toLowerCase() | ||||
|               .includes(feedUrl.toLowerCase()) | ||||
|           ) { | ||||
|             let key = json.configuration.packageSources.add['@_key']; | ||||
|             sourceKeys.push(key); | ||||
|             core.debug(`Found a URL with key ${key}`); | ||||
|           } | ||||
|         } else { | ||||
|           // file has 2+ <add> | ||||
|           for ( | ||||
|             let i = 0; | ||||
|             i < json.configuration.packageSources.add.length; | ||||
|             i++ | ||||
|           ) { | ||||
|             const source = json.configuration.packageSources.add[i]; | ||||
|             const value = source['@_value']; | ||||
|             core.debug(`source '${value}'`); | ||||
|             if (value.toLowerCase().includes(feedUrl.toLowerCase())) { | ||||
|               let key = source['@_key']; | ||||
|               sourceKeys.push(key); | ||||
|               core.debug(`Found a URL with key ${key}`); | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   xml = xmlbuilder | ||||
|     .create('configuration') | ||||
|     .ele('config') | ||||
|     .ele('add', {key: 'defaultPushSource', value: sourceUrl}) | ||||
|     .up() | ||||
|     .up(); | ||||
|  | ||||
|   if (sourceKeys.length == 0) { | ||||
|     let keystring = 'Source'; | ||||
|     xml = xml | ||||
|       .ele('packageSources') | ||||
|       .ele('add', {key: keystring, value: sourceUrl}) | ||||
|       .up() | ||||
|       .up(); | ||||
|     sourceKeys.push(keystring); | ||||
|   } | ||||
|   xml = xml.ele('packageSourceCredentials'); | ||||
|  | ||||
|   sourceKeys.forEach(key => { | ||||
|     if (!isValidKey(key)) { | ||||
|       throw new Error( | ||||
|         "Source name can contain letters, numbers, and '-', '_', '.' symbols only. Please, fix source name in NuGet.config and try again." | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     xml = xml | ||||
|       .ele(key) | ||||
|       .ele('add', {key: 'Username', value: owner}) | ||||
|       .up() | ||||
|       .ele('add', { | ||||
|         key: 'ClearTextPassword', | ||||
|         value: process.env.NUGET_AUTH_TOKEN | ||||
|       }) | ||||
|       .up() | ||||
|       .up(); | ||||
|   }); | ||||
|  | ||||
|   // If NuGet fixes itself such that on Linux it can look for environment variables in the config file (it doesn't seem to work today), | ||||
|   // use this for the value above | ||||
|   //           process.platform == 'win32' | ||||
|   //             ? '%NUGET_AUTH_TOKEN%' | ||||
|   //             : '$NUGET_AUTH_TOKEN' | ||||
|  | ||||
|   var output = xml.end({pretty: true}); | ||||
|   fs.writeFileSync(tempFileLocation, output); | ||||
| } | ||||
| import * as fs from 'fs'; | ||||
| import * as path from 'path'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as github from '@actions/github'; | ||||
| import * as xmlbuilder from 'xmlbuilder'; | ||||
| import * as xmlParser from 'fast-xml-parser'; | ||||
| import {ProcessEnvOptions} from 'child_process'; | ||||
|  | ||||
| export function configAuthentication( | ||||
|   feedUrl: string, | ||||
|   existingFileLocation: string = '', | ||||
|   processRoot: string = process.cwd() | ||||
| ) { | ||||
|   const existingNuGetConfig: string = path.resolve( | ||||
|     processRoot, | ||||
|     existingFileLocation === '' | ||||
|       ? getExistingNugetConfig(processRoot) | ||||
|       : existingFileLocation | ||||
|   ); | ||||
|  | ||||
|   const tempNuGetConfig: string = path.resolve( | ||||
|     processRoot, | ||||
|     '../', | ||||
|     'nuget.config' | ||||
|   ); | ||||
|  | ||||
|   writeFeedToFile(feedUrl, existingNuGetConfig, tempNuGetConfig); | ||||
| } | ||||
|  | ||||
| function isValidKey(key: string): boolean { | ||||
|   return /^[\w\-\.]+$/i.test(key); | ||||
| } | ||||
|  | ||||
| function getExistingNugetConfig(processRoot: string) { | ||||
|   const defaultConfigName = 'nuget.config'; | ||||
|   const configFileNames = fs | ||||
|     .readdirSync(processRoot) | ||||
|     .filter(filename => filename.toLowerCase() === defaultConfigName); | ||||
|   if (configFileNames.length) { | ||||
|     return configFileNames[0]; | ||||
|   } | ||||
|   return defaultConfigName; | ||||
| } | ||||
|  | ||||
| function writeFeedToFile( | ||||
|   feedUrl: string, | ||||
|   existingFileLocation: string, | ||||
|   tempFileLocation: string | ||||
| ) { | ||||
|   console.log( | ||||
|     `dotnet-auth: Finding any source references in ${existingFileLocation}, writing a new temporary configuration file with credentials to ${tempFileLocation}` | ||||
|   ); | ||||
|   let xml: xmlbuilder.XMLElement; | ||||
|   let sourceKeys: string[] = []; | ||||
|   let owner: string = core.getInput('owner'); | ||||
|   let sourceUrl: string = feedUrl; | ||||
|   if (!owner) { | ||||
|     owner = github.context.repo.owner; | ||||
|   } | ||||
|  | ||||
|   if (!process.env.NUGET_AUTH_TOKEN || process.env.NUGET_AUTH_TOKEN == '') { | ||||
|     throw new Error( | ||||
|       'The NUGET_AUTH_TOKEN environment variable was not provided. In this step, add the following: \r\nenv:\r\n  NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}' | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   if (fs.existsSync(existingFileLocation)) { | ||||
|     // get key from existing NuGet.config so NuGet/dotnet can match credentials | ||||
|     const curContents: string = fs.readFileSync(existingFileLocation, 'utf8'); | ||||
|     var json = xmlParser.parse(curContents, {ignoreAttributes: false}); | ||||
|  | ||||
|     if (typeof json.configuration == 'undefined') { | ||||
|       throw new Error(`The provided NuGet.config seems invalid.`); | ||||
|     } | ||||
|     if (typeof json.configuration.packageSources != 'undefined') { | ||||
|       if (typeof json.configuration.packageSources.add != 'undefined') { | ||||
|         // file has at least one <add> | ||||
|         if (typeof json.configuration.packageSources.add[0] == 'undefined') { | ||||
|           // file has only one <add> | ||||
|           if ( | ||||
|             json.configuration.packageSources.add['@_value'] | ||||
|               .toLowerCase() | ||||
|               .includes(feedUrl.toLowerCase()) | ||||
|           ) { | ||||
|             let key = json.configuration.packageSources.add['@_key']; | ||||
|             sourceKeys.push(key); | ||||
|             core.debug(`Found a URL with key ${key}`); | ||||
|           } | ||||
|         } else { | ||||
|           // file has 2+ <add> | ||||
|           for ( | ||||
|             let i = 0; | ||||
|             i < json.configuration.packageSources.add.length; | ||||
|             i++ | ||||
|           ) { | ||||
|             const source = json.configuration.packageSources.add[i]; | ||||
|             const value = source['@_value']; | ||||
|             core.debug(`source '${value}'`); | ||||
|             if (value.toLowerCase().includes(feedUrl.toLowerCase())) { | ||||
|               let key = source['@_key']; | ||||
|               sourceKeys.push(key); | ||||
|               core.debug(`Found a URL with key ${key}`); | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   xml = xmlbuilder | ||||
|     .create('configuration') | ||||
|     .ele('config') | ||||
|     .ele('add', {key: 'defaultPushSource', value: sourceUrl}) | ||||
|     .up() | ||||
|     .up(); | ||||
|  | ||||
|   if (sourceKeys.length == 0) { | ||||
|     let keystring = 'Source'; | ||||
|     xml = xml | ||||
|       .ele('packageSources') | ||||
|       .ele('add', {key: keystring, value: sourceUrl}) | ||||
|       .up() | ||||
|       .up(); | ||||
|     sourceKeys.push(keystring); | ||||
|   } | ||||
|   xml = xml.ele('packageSourceCredentials'); | ||||
|  | ||||
|   sourceKeys.forEach(key => { | ||||
|     if (!isValidKey(key)) { | ||||
|       throw new Error( | ||||
|         "Source name can contain letters, numbers, and '-', '_', '.' symbols only. Please, fix source name in NuGet.config and try again." | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     xml = xml | ||||
|       .ele(key) | ||||
|       .ele('add', {key: 'Username', value: owner}) | ||||
|       .up() | ||||
|       .ele('add', { | ||||
|         key: 'ClearTextPassword', | ||||
|         value: process.env.NUGET_AUTH_TOKEN | ||||
|       }) | ||||
|       .up() | ||||
|       .up(); | ||||
|   }); | ||||
|  | ||||
|   // If NuGet fixes itself such that on Linux it can look for environment variables in the config file (it doesn't seem to work today), | ||||
|   // use this for the value above | ||||
|   //           process.platform == 'win32' | ||||
|   //             ? '%NUGET_AUTH_TOKEN%' | ||||
|   //             : '$NUGET_AUTH_TOKEN' | ||||
|  | ||||
|   var output = xml.end({pretty: true}); | ||||
|   fs.writeFileSync(tempFileLocation, output); | ||||
| } | ||||
|  | ||||
							
								
								
									
										610
									
								
								src/installer.ts
									
									
									
									
									
								
							
							
						
						
									
										610
									
								
								src/installer.ts
									
									
									
									
									
								
							| @ -1,305 +1,305 @@ | ||||
| // Load tempDirectory before it gets wiped by tool-cache | ||||
| import * as core from '@actions/core'; | ||||
| import * as exec from '@actions/exec'; | ||||
| import * as io from '@actions/io'; | ||||
| import hc = require('@actions/http-client'); | ||||
| import {chmodSync} from 'fs'; | ||||
| import * as path from 'path'; | ||||
| import {ExecOptions} from '@actions/exec/lib/interfaces'; | ||||
| import * as semver from 'semver'; | ||||
|  | ||||
| const IS_WINDOWS = process.platform === 'win32'; | ||||
|  | ||||
| /** | ||||
|  * Represents the inputted version information | ||||
|  */ | ||||
| export class DotNetVersionInfo { | ||||
|   public inputVersion: string; | ||||
|   private fullversion: string; | ||||
|   private isExactVersionSet: boolean = false; | ||||
|  | ||||
|   constructor(version: string) { | ||||
|     this.inputVersion = version; | ||||
|  | ||||
|     // Check for exact match | ||||
|     if (semver.valid(semver.clean(version) || '') != null) { | ||||
|       this.fullversion = semver.clean(version) as string; | ||||
|       this.isExactVersionSet = true; | ||||
|  | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const parts: string[] = version.split('.'); | ||||
|  | ||||
|     if (parts.length < 2 || parts.length > 3) this.throwInvalidVersionFormat(); | ||||
|  | ||||
|     if (parts.length == 3 && parts[2] !== 'x' && parts[2] !== '*') { | ||||
|       this.throwInvalidVersionFormat(); | ||||
|     } | ||||
|  | ||||
|     const major = this.getVersionNumberOrThrow(parts[0]); | ||||
|     const minor = ['x', '*'].includes(parts[1]) | ||||
|       ? parts[1] | ||||
|       : this.getVersionNumberOrThrow(parts[1]); | ||||
|  | ||||
|     this.fullversion = major + '.' + minor; | ||||
|   } | ||||
|  | ||||
|   private getVersionNumberOrThrow(input: string): number { | ||||
|     try { | ||||
|       if (!input || input.trim() === '') this.throwInvalidVersionFormat(); | ||||
|  | ||||
|       let number = Number(input); | ||||
|  | ||||
|       if (Number.isNaN(number) || number < 0) this.throwInvalidVersionFormat(); | ||||
|  | ||||
|       return number; | ||||
|     } catch { | ||||
|       this.throwInvalidVersionFormat(); | ||||
|       return -1; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private throwInvalidVersionFormat() { | ||||
|     throw new Error( | ||||
|       'Invalid version format! Supported: 1.2.3, 1.2, 1.2.x, 1.2.*' | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * If true exacatly one version should be resolved | ||||
|    */ | ||||
|   public isExactVersion(): boolean { | ||||
|     return this.isExactVersionSet; | ||||
|   } | ||||
|  | ||||
|   public version(): string { | ||||
|     return this.fullversion; | ||||
|   } | ||||
| } | ||||
|  | ||||
| export class DotnetCoreInstaller { | ||||
|   constructor(version: string, includePrerelease: boolean = false) { | ||||
|     this.version = version; | ||||
|     this.includePrerelease = includePrerelease; | ||||
|   } | ||||
|  | ||||
|   public async installDotnet() { | ||||
|     let output = ''; | ||||
|     let resultCode = 0; | ||||
|  | ||||
|     let calculatedVersion = await this.resolveVersion( | ||||
|       new DotNetVersionInfo(this.version) | ||||
|     ); | ||||
|  | ||||
|     var envVariables: {[key: string]: string} = {}; | ||||
|     for (let key in process.env) { | ||||
|       if (process.env[key]) { | ||||
|         let value: any = process.env[key]; | ||||
|         envVariables[key] = value; | ||||
|       } | ||||
|     } | ||||
|     if (IS_WINDOWS) { | ||||
|       let escapedScript = path | ||||
|         .join(__dirname, '..', 'externals', 'install-dotnet.ps1') | ||||
|         .replace(/'/g, "''"); | ||||
|       let command = `& '${escapedScript}'`; | ||||
|       if (calculatedVersion) { | ||||
|         command += ` -Version ${calculatedVersion}`; | ||||
|       } | ||||
|       if (process.env['https_proxy'] != null) { | ||||
|         command += ` -ProxyAddress ${process.env['https_proxy']}`; | ||||
|       } | ||||
|       // This is not currently an option | ||||
|       if (process.env['no_proxy'] != null) { | ||||
|         command += ` -ProxyBypassList ${process.env['no_proxy']}`; | ||||
|       } | ||||
|  | ||||
|       // process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used | ||||
|       const powershellPath = | ||||
|         (await io.which('pwsh', false)) || (await io.which('powershell', true)); | ||||
|  | ||||
|       var options: ExecOptions = { | ||||
|         listeners: { | ||||
|           stdout: (data: Buffer) => { | ||||
|             output += data.toString(); | ||||
|           } | ||||
|         }, | ||||
|         env: envVariables | ||||
|       }; | ||||
|  | ||||
|       resultCode = await exec.exec( | ||||
|         `"${powershellPath}"`, | ||||
|         [ | ||||
|           '-NoLogo', | ||||
|           '-Sta', | ||||
|           '-NoProfile', | ||||
|           '-NonInteractive', | ||||
|           '-ExecutionPolicy', | ||||
|           'Unrestricted', | ||||
|           '-Command', | ||||
|           command | ||||
|         ], | ||||
|         options | ||||
|       ); | ||||
|     } else { | ||||
|       let escapedScript = path | ||||
|         .join(__dirname, '..', 'externals', 'install-dotnet.sh') | ||||
|         .replace(/'/g, "''"); | ||||
|       chmodSync(escapedScript, '777'); | ||||
|  | ||||
|       const scriptPath = await io.which(escapedScript, true); | ||||
|  | ||||
|       let scriptArguments: string[] = []; | ||||
|       if (calculatedVersion) { | ||||
|         scriptArguments.push('--version', calculatedVersion); | ||||
|       } | ||||
|  | ||||
|       // process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used | ||||
|       resultCode = await exec.exec(`"${scriptPath}"`, scriptArguments, { | ||||
|         listeners: { | ||||
|           stdout: (data: Buffer) => { | ||||
|             output += data.toString(); | ||||
|           } | ||||
|         }, | ||||
|         env: envVariables | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     if (resultCode != 0) { | ||||
|       throw new Error(`Failed to install dotnet ${resultCode}. ${output}`); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   static addToPath() { | ||||
|     if (process.env['DOTNET_INSTALL_DIR']) { | ||||
|       core.addPath(process.env['DOTNET_INSTALL_DIR']); | ||||
|       core.exportVariable('DOTNET_ROOT', process.env['DOTNET_INSTALL_DIR']); | ||||
|     } else { | ||||
|       if (IS_WINDOWS) { | ||||
|         // This is the default set in install-dotnet.ps1 | ||||
|         core.addPath( | ||||
|           path.join(process.env['LocalAppData'] + '', 'Microsoft', 'dotnet') | ||||
|         ); | ||||
|         core.exportVariable( | ||||
|           'DOTNET_ROOT', | ||||
|           path.join(process.env['LocalAppData'] + '', 'Microsoft', 'dotnet') | ||||
|         ); | ||||
|       } else { | ||||
|         // This is the default set in install-dotnet.sh | ||||
|         core.addPath(path.join(process.env['HOME'] + '', '.dotnet')); | ||||
|         core.exportVariable( | ||||
|           'DOTNET_ROOT', | ||||
|           path.join(process.env['HOME'] + '', '.dotnet') | ||||
|         ); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     console.log(process.env['PATH']); | ||||
|   } | ||||
|  | ||||
|   // versionInfo - versionInfo of the SDK/Runtime | ||||
|   async resolveVersion(versionInfo: DotNetVersionInfo): Promise<string> { | ||||
|     if (versionInfo.isExactVersion()) { | ||||
|       return versionInfo.version(); | ||||
|     } | ||||
|  | ||||
|     const httpClient = new hc.HttpClient('actions/setup-dotnet', [], { | ||||
|       allowRetries: true, | ||||
|       maxRetries: 3 | ||||
|     }); | ||||
|  | ||||
|     const releasesJsonUrl: string = await this.getReleasesJsonUrl( | ||||
|       httpClient, | ||||
|       versionInfo.version().split('.') | ||||
|     ); | ||||
|  | ||||
|     const releasesResponse = await httpClient.getJson<any>(releasesJsonUrl); | ||||
|     const releasesResult = releasesResponse.result || {}; | ||||
|     let releasesInfo: any[] = releasesResult['releases']; | ||||
|     releasesInfo = releasesInfo.filter((releaseInfo: any) => { | ||||
|       return ( | ||||
|         semver.satisfies(releaseInfo['sdk']['version'], versionInfo.version(), { | ||||
|           includePrerelease: this.includePrerelease | ||||
|         }) || | ||||
|         semver.satisfies( | ||||
|           releaseInfo['sdk']['version-display'], | ||||
|           versionInfo.version(), | ||||
|           { | ||||
|             includePrerelease: this.includePrerelease | ||||
|           } | ||||
|         ) | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     // Exclude versions that are newer than the latest if using not exact | ||||
|     let latestSdk: string = releasesResult['latest-sdk']; | ||||
|  | ||||
|     releasesInfo = releasesInfo.filter((releaseInfo: any) => | ||||
|       semver.lte(releaseInfo['sdk']['version'], latestSdk, { | ||||
|         includePrerelease: this.includePrerelease | ||||
|       }) | ||||
|     ); | ||||
|  | ||||
|     // Sort for latest version | ||||
|     releasesInfo = releasesInfo.sort((a, b) => | ||||
|       semver.rcompare(a['sdk']['version'], b['sdk']['version'], { | ||||
|         includePrerelease: this.includePrerelease | ||||
|       }) | ||||
|     ); | ||||
|  | ||||
|     if (releasesInfo.length == 0) { | ||||
|       throw new Error( | ||||
|         `Could not find dotnet core version. Please ensure that specified version ${versionInfo.inputVersion} is valid.` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     let release = releasesInfo[0]; | ||||
|     return release['sdk']['version']; | ||||
|   } | ||||
|  | ||||
|   private async getReleasesJsonUrl( | ||||
|     httpClient: hc.HttpClient, | ||||
|     versionParts: string[] | ||||
|   ): Promise<string> { | ||||
|     const response = await httpClient.getJson<any>(DotNetCoreIndexUrl); | ||||
|  | ||||
|     const result = response.result || {}; | ||||
|     let releasesInfo: any[] = result['releases-index']; | ||||
|  | ||||
|     releasesInfo = releasesInfo.filter((info: any) => { | ||||
|       // channel-version is the first 2 elements of the version (e.g. 2.1), filter out versions that don't match 2.1.x. | ||||
|       const sdkParts: string[] = info['channel-version'].split('.'); | ||||
|       if ( | ||||
|         versionParts.length >= 2 && | ||||
|         !(versionParts[1] == 'x' || versionParts[1] == '*') | ||||
|       ) { | ||||
|         return versionParts[0] == sdkParts[0] && versionParts[1] == sdkParts[1]; | ||||
|       } | ||||
|       return versionParts[0] == sdkParts[0]; | ||||
|     }); | ||||
|  | ||||
|     if (releasesInfo.length === 0) { | ||||
|       throw new Error( | ||||
|         `Could not find info for version ${versionParts.join( | ||||
|           '.' | ||||
|         )} at ${DotNetCoreIndexUrl}` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     const releaseInfo = releasesInfo[0]; | ||||
|     if (releaseInfo['support-phase'] === 'eol') { | ||||
|       core.warning( | ||||
|         `${releaseInfo['product']} ${releaseInfo['channel-version']} is no longer supported and will not receive security updates in the future. Please refer to https://aka.ms/dotnet-core-support for more information about the .NET support policy.` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     return releaseInfo['releases.json']; | ||||
|   } | ||||
|  | ||||
|   private version: string; | ||||
|   private includePrerelease: boolean; | ||||
| } | ||||
|  | ||||
| const DotNetCoreIndexUrl: string = | ||||
|   'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json'; | ||||
| // Load tempDirectory before it gets wiped by tool-cache | ||||
| import * as core from '@actions/core'; | ||||
| import * as exec from '@actions/exec'; | ||||
| import * as io from '@actions/io'; | ||||
| import hc = require('@actions/http-client'); | ||||
| import {chmodSync} from 'fs'; | ||||
| import * as path from 'path'; | ||||
| import {ExecOptions} from '@actions/exec/lib/interfaces'; | ||||
| import * as semver from 'semver'; | ||||
|  | ||||
| const IS_WINDOWS = process.platform === 'win32'; | ||||
|  | ||||
| /** | ||||
|  * Represents the inputted version information | ||||
|  */ | ||||
| export class DotNetVersionInfo { | ||||
|   public inputVersion: string; | ||||
|   private fullversion: string; | ||||
|   private isExactVersionSet: boolean = false; | ||||
|  | ||||
|   constructor(version: string) { | ||||
|     this.inputVersion = version; | ||||
|  | ||||
|     // Check for exact match | ||||
|     if (semver.valid(semver.clean(version) || '') != null) { | ||||
|       this.fullversion = semver.clean(version) as string; | ||||
|       this.isExactVersionSet = true; | ||||
|  | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const parts: string[] = version.split('.'); | ||||
|  | ||||
|     if (parts.length < 2 || parts.length > 3) this.throwInvalidVersionFormat(); | ||||
|  | ||||
|     if (parts.length == 3 && parts[2] !== 'x' && parts[2] !== '*') { | ||||
|       this.throwInvalidVersionFormat(); | ||||
|     } | ||||
|  | ||||
|     const major = this.getVersionNumberOrThrow(parts[0]); | ||||
|     const minor = ['x', '*'].includes(parts[1]) | ||||
|       ? parts[1] | ||||
|       : this.getVersionNumberOrThrow(parts[1]); | ||||
|  | ||||
|     this.fullversion = major + '.' + minor; | ||||
|   } | ||||
|  | ||||
|   private getVersionNumberOrThrow(input: string): number { | ||||
|     try { | ||||
|       if (!input || input.trim() === '') this.throwInvalidVersionFormat(); | ||||
|  | ||||
|       let number = Number(input); | ||||
|  | ||||
|       if (Number.isNaN(number) || number < 0) this.throwInvalidVersionFormat(); | ||||
|  | ||||
|       return number; | ||||
|     } catch { | ||||
|       this.throwInvalidVersionFormat(); | ||||
|       return -1; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private throwInvalidVersionFormat() { | ||||
|     throw new Error( | ||||
|       'Invalid version format! Supported: 1.2.3, 1.2, 1.2.x, 1.2.*' | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * If true exacatly one version should be resolved | ||||
|    */ | ||||
|   public isExactVersion(): boolean { | ||||
|     return this.isExactVersionSet; | ||||
|   } | ||||
|  | ||||
|   public version(): string { | ||||
|     return this.fullversion; | ||||
|   } | ||||
| } | ||||
|  | ||||
| export class DotnetCoreInstaller { | ||||
|   constructor(version: string, includePrerelease: boolean = false) { | ||||
|     this.version = version; | ||||
|     this.includePrerelease = includePrerelease; | ||||
|   } | ||||
|  | ||||
|   public async installDotnet() { | ||||
|     let output = ''; | ||||
|     let resultCode = 0; | ||||
|  | ||||
|     let calculatedVersion = await this.resolveVersion( | ||||
|       new DotNetVersionInfo(this.version) | ||||
|     ); | ||||
|  | ||||
|     var envVariables: {[key: string]: string} = {}; | ||||
|     for (let key in process.env) { | ||||
|       if (process.env[key]) { | ||||
|         let value: any = process.env[key]; | ||||
|         envVariables[key] = value; | ||||
|       } | ||||
|     } | ||||
|     if (IS_WINDOWS) { | ||||
|       let escapedScript = path | ||||
|         .join(__dirname, '..', 'externals', 'install-dotnet.ps1') | ||||
|         .replace(/'/g, "''"); | ||||
|       let command = `& '${escapedScript}'`; | ||||
|       if (calculatedVersion) { | ||||
|         command += ` -Version ${calculatedVersion}`; | ||||
|       } | ||||
|       if (process.env['https_proxy'] != null) { | ||||
|         command += ` -ProxyAddress ${process.env['https_proxy']}`; | ||||
|       } | ||||
|       // This is not currently an option | ||||
|       if (process.env['no_proxy'] != null) { | ||||
|         command += ` -ProxyBypassList ${process.env['no_proxy']}`; | ||||
|       } | ||||
|  | ||||
|       // process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used | ||||
|       const powershellPath = | ||||
|         (await io.which('pwsh', false)) || (await io.which('powershell', true)); | ||||
|  | ||||
|       var options: ExecOptions = { | ||||
|         listeners: { | ||||
|           stdout: (data: Buffer) => { | ||||
|             output += data.toString(); | ||||
|           } | ||||
|         }, | ||||
|         env: envVariables | ||||
|       }; | ||||
|  | ||||
|       resultCode = await exec.exec( | ||||
|         `"${powershellPath}"`, | ||||
|         [ | ||||
|           '-NoLogo', | ||||
|           '-Sta', | ||||
|           '-NoProfile', | ||||
|           '-NonInteractive', | ||||
|           '-ExecutionPolicy', | ||||
|           'Unrestricted', | ||||
|           '-Command', | ||||
|           command | ||||
|         ], | ||||
|         options | ||||
|       ); | ||||
|     } else { | ||||
|       let escapedScript = path | ||||
|         .join(__dirname, '..', 'externals', 'install-dotnet.sh') | ||||
|         .replace(/'/g, "''"); | ||||
|       chmodSync(escapedScript, '777'); | ||||
|  | ||||
|       const scriptPath = await io.which(escapedScript, true); | ||||
|  | ||||
|       let scriptArguments: string[] = []; | ||||
|       if (calculatedVersion) { | ||||
|         scriptArguments.push('--version', calculatedVersion); | ||||
|       } | ||||
|  | ||||
|       // process.env must be explicitly passed in for DOTNET_INSTALL_DIR to be used | ||||
|       resultCode = await exec.exec(`"${scriptPath}"`, scriptArguments, { | ||||
|         listeners: { | ||||
|           stdout: (data: Buffer) => { | ||||
|             output += data.toString(); | ||||
|           } | ||||
|         }, | ||||
|         env: envVariables | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     if (resultCode != 0) { | ||||
|       throw new Error(`Failed to install dotnet ${resultCode}. ${output}`); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   static addToPath() { | ||||
|     if (process.env['DOTNET_INSTALL_DIR']) { | ||||
|       core.addPath(process.env['DOTNET_INSTALL_DIR']); | ||||
|       core.exportVariable('DOTNET_ROOT', process.env['DOTNET_INSTALL_DIR']); | ||||
|     } else { | ||||
|       if (IS_WINDOWS) { | ||||
|         // This is the default set in install-dotnet.ps1 | ||||
|         core.addPath( | ||||
|           path.join(process.env['LocalAppData'] + '', 'Microsoft', 'dotnet') | ||||
|         ); | ||||
|         core.exportVariable( | ||||
|           'DOTNET_ROOT', | ||||
|           path.join(process.env['LocalAppData'] + '', 'Microsoft', 'dotnet') | ||||
|         ); | ||||
|       } else { | ||||
|         // This is the default set in install-dotnet.sh | ||||
|         core.addPath(path.join(process.env['HOME'] + '', '.dotnet')); | ||||
|         core.exportVariable( | ||||
|           'DOTNET_ROOT', | ||||
|           path.join(process.env['HOME'] + '', '.dotnet') | ||||
|         ); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     console.log(process.env['PATH']); | ||||
|   } | ||||
|  | ||||
|   // versionInfo - versionInfo of the SDK/Runtime | ||||
|   async resolveVersion(versionInfo: DotNetVersionInfo): Promise<string> { | ||||
|     if (versionInfo.isExactVersion()) { | ||||
|       return versionInfo.version(); | ||||
|     } | ||||
|  | ||||
|     const httpClient = new hc.HttpClient('actions/setup-dotnet', [], { | ||||
|       allowRetries: true, | ||||
|       maxRetries: 3 | ||||
|     }); | ||||
|  | ||||
|     const releasesJsonUrl: string = await this.getReleasesJsonUrl( | ||||
|       httpClient, | ||||
|       versionInfo.version().split('.') | ||||
|     ); | ||||
|  | ||||
|     const releasesResponse = await httpClient.getJson<any>(releasesJsonUrl); | ||||
|     const releasesResult = releasesResponse.result || {}; | ||||
|     let releasesInfo: any[] = releasesResult['releases']; | ||||
|     releasesInfo = releasesInfo.filter((releaseInfo: any) => { | ||||
|       return ( | ||||
|         semver.satisfies(releaseInfo['sdk']['version'], versionInfo.version(), { | ||||
|           includePrerelease: this.includePrerelease | ||||
|         }) || | ||||
|         semver.satisfies( | ||||
|           releaseInfo['sdk']['version-display'], | ||||
|           versionInfo.version(), | ||||
|           { | ||||
|             includePrerelease: this.includePrerelease | ||||
|           } | ||||
|         ) | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     // Exclude versions that are newer than the latest if using not exact | ||||
|     let latestSdk: string = releasesResult['latest-sdk']; | ||||
|  | ||||
|     releasesInfo = releasesInfo.filter((releaseInfo: any) => | ||||
|       semver.lte(releaseInfo['sdk']['version'], latestSdk, { | ||||
|         includePrerelease: this.includePrerelease | ||||
|       }) | ||||
|     ); | ||||
|  | ||||
|     // Sort for latest version | ||||
|     releasesInfo = releasesInfo.sort((a, b) => | ||||
|       semver.rcompare(a['sdk']['version'], b['sdk']['version'], { | ||||
|         includePrerelease: this.includePrerelease | ||||
|       }) | ||||
|     ); | ||||
|  | ||||
|     if (releasesInfo.length == 0) { | ||||
|       throw new Error( | ||||
|         `Could not find dotnet core version. Please ensure that specified version ${versionInfo.inputVersion} is valid.` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     let release = releasesInfo[0]; | ||||
|     return release['sdk']['version']; | ||||
|   } | ||||
|  | ||||
|   private async getReleasesJsonUrl( | ||||
|     httpClient: hc.HttpClient, | ||||
|     versionParts: string[] | ||||
|   ): Promise<string> { | ||||
|     const response = await httpClient.getJson<any>(DotNetCoreIndexUrl); | ||||
|  | ||||
|     const result = response.result || {}; | ||||
|     let releasesInfo: any[] = result['releases-index']; | ||||
|  | ||||
|     releasesInfo = releasesInfo.filter((info: any) => { | ||||
|       // channel-version is the first 2 elements of the version (e.g. 2.1), filter out versions that don't match 2.1.x. | ||||
|       const sdkParts: string[] = info['channel-version'].split('.'); | ||||
|       if ( | ||||
|         versionParts.length >= 2 && | ||||
|         !(versionParts[1] == 'x' || versionParts[1] == '*') | ||||
|       ) { | ||||
|         return versionParts[0] == sdkParts[0] && versionParts[1] == sdkParts[1]; | ||||
|       } | ||||
|       return versionParts[0] == sdkParts[0]; | ||||
|     }); | ||||
|  | ||||
|     if (releasesInfo.length === 0) { | ||||
|       throw new Error( | ||||
|         `Could not find info for version ${versionParts.join( | ||||
|           '.' | ||||
|         )} at ${DotNetCoreIndexUrl}` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     const releaseInfo = releasesInfo[0]; | ||||
|     if (releaseInfo['support-phase'] === 'eol') { | ||||
|       core.warning( | ||||
|         `${releaseInfo['product']} ${releaseInfo['channel-version']} is no longer supported and will not receive security updates in the future. Please refer to https://aka.ms/dotnet-core-support for more information about the .NET support policy.` | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     return releaseInfo['releases.json']; | ||||
|   } | ||||
|  | ||||
|   private version: string; | ||||
|   private includePrerelease: boolean; | ||||
| } | ||||
|  | ||||
| const DotNetCoreIndexUrl: string = | ||||
|   'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json'; | ||||
|  | ||||
| @ -38,9 +38,8 @@ export async function run() { | ||||
|     } | ||||
|  | ||||
|     if (versions.length) { | ||||
|       const includePrerelease: boolean = core.getBooleanInput( | ||||
|         'include-prerelease' | ||||
|       ); | ||||
|       const includePrerelease: boolean = | ||||
|         core.getBooleanInput('include-prerelease'); | ||||
|       let dotnetInstaller!: installer.DotnetCoreInstaller; | ||||
|       for (const version of new Set<string>(versions)) { | ||||
|         dotnetInstaller = new installer.DotnetCoreInstaller( | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Zachary Taylor
					Zachary Taylor