Skip to content

Commit c6024b0

Browse files
author
Andrew Hall
committed
Initial attempt
1 parent a004c50 commit c6024b0

File tree

2 files changed

+109
-62
lines changed

2 files changed

+109
-62
lines changed

tasks/createTagsTasks.ts

Lines changed: 108 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import * as gulp from 'gulp';
77
import * as fs from 'fs';
88
import minimist from 'minimist';
99
import { Octokit } from '@octokit/rest';
10+
import { allNugetPackages, NugetPackageInfo, platformSpecificPackages } from './offlinePackagingTasks';
11+
import { PlatformInformation } from '../src/shared/platform';
12+
import path from 'path';
1013

1114
interface Options {
1215
releaseVersion: string;
@@ -15,16 +18,65 @@ interface Options {
1518
dryRun: string;
1619
}
1720

18-
gulp.task('createTags', async (): Promise<void> => {
21+
gulp.task('createTags', gulp.series('createTags:roslyn', 'createTags:razor', 'createTags:vscode-csharp'));
22+
23+
gulp.task('createTags:roslyn', async (): Promise<void> => {
24+
const options = minimist<Options>(process.argv.slice(2));
25+
26+
return createTagsAsync(
27+
options,
28+
'dotnet',
29+
'roslyn',
30+
async () => getCommitFromNugetAsync(allNugetPackages.roslyn),
31+
(releaseVersion: string): [string, string] => [
32+
`v${releaseVersion}`,
33+
`${releaseVersion} VSCode C# extension release`,
34+
]
35+
);
36+
});
37+
38+
gulp.task('createTags:razor', async (): Promise<void> => {
39+
const options = minimist<Options>(process.argv.slice(2));
40+
41+
return createTagsAsync(
42+
options,
43+
'dotnet',
44+
'razor',
45+
async () => getCommitFromNugetAsync(allNugetPackages.razor),
46+
(releaseVersion: string): [string, string] => [
47+
`VSCode-CSharp-${releaseVersion}`,
48+
`${releaseVersion} VSCode C# extension release`,
49+
]
50+
);
51+
});
52+
53+
gulp.task('createTags:vscode-csharp', async (): Promise<void> => {
1954
const options = minimist<Options>(process.argv.slice(2));
55+
56+
return createTagsAsync(
57+
options,
58+
'dotnet',
59+
'vscode-csharp',
60+
async () => options.releaseCommit,
61+
(releaseVersion: string): [string, string] => [`v${releaseVersion}`, releaseVersion]
62+
);
63+
});
64+
65+
async function createTagsAsync(
66+
options: Options,
67+
owner: string,
68+
repo: string,
69+
getCommit: () => Promise<string | null>,
70+
getTagAndMessage: (releaseVersion: string) => [string, string]
71+
): Promise<void> {
2072
console.log(`releaseVersion: ${options.releaseVersion}`);
2173
console.log(`releaseCommit: ${options.releaseCommit}`);
2274
const dryRun = options.dryRun.toLocaleLowerCase() === 'true';
2375
console.log(`dry run: ${dryRun}`);
2476

25-
const roslynCommit = await findRoslynCommitAsync();
26-
if (!roslynCommit) {
27-
logError('Failed to find roslyn commit.');
77+
const commit = await getCommit();
78+
if (!commit) {
79+
logError('Failed to find commit.');
2880
return;
2981
}
3082

@@ -33,68 +85,16 @@ gulp.task('createTags', async (): Promise<void> => {
3385
console.log('Tagging is skipped in dry run mode.');
3486
return;
3587
} else {
36-
const tagCreatedInRoslyn = await tagRepoAsync(
37-
'dotnet',
38-
'roslyn',
39-
roslynCommit,
40-
`VSCode-CSharp-${options.releaseVersion}`,
41-
`${options.releaseVersion} VSCode C# extension release`
42-
);
43-
44-
if (!tagCreatedInRoslyn) {
45-
logError('Failed to tag roslyn');
46-
return;
47-
}
48-
49-
console.log('tag created in roslyn');
50-
51-
const tagCreatedInVsCodeCsharp = await tagRepoAsync(
52-
'dotnet',
53-
'vscode-csharp',
54-
options.releaseCommit,
55-
`v${options.releaseVersion}`,
56-
options.releaseVersion
57-
);
88+
const [tag, message] = getTagAndMessage(options.releaseVersion);
89+
const tagCreated = await tagRepoAsync(owner, repo, commit, tag, message);
5890

59-
if (!tagCreatedInVsCodeCsharp) {
60-
logError('Failed to tag vscode-csharp');
91+
if (!tagCreated) {
92+
logError(`Failed to tag '${owner}/${repo}'`);
6193
return;
6294
}
6395

64-
console.log('tag created in vscode-csharp');
65-
}
66-
});
67-
68-
async function findRoslynCommitAsync(): Promise<string | null> {
69-
const packageJsonString = fs.readFileSync('./package.json').toString();
70-
const packageJson = JSON.parse(packageJsonString);
71-
const roslynVersion = packageJson['defaults']['roslyn'];
72-
if (!roslynVersion) {
73-
logError("Can't find roslyn version in package.json");
74-
return null;
75-
}
76-
77-
console.log(`Roslyn version is ${roslynVersion}`);
78-
// Nuget package should exist under out/.nuget/ since we have run the install dependencies task.
79-
const nuspecFile = fs
80-
.readFileSync(
81-
`out/.nuget/microsoft.codeanalysis.languageserver.linux-x64/${roslynVersion}/microsoft.codeanalysis.languageserver.linux-x64.nuspec`
82-
)
83-
.toString();
84-
const results = /commit="(.*)"/.exec(nuspecFile);
85-
if (results == null || results.length == 0) {
86-
logError('Failed to find commit number from nuspec file');
87-
return null;
88-
}
89-
90-
if (results.length != 2) {
91-
logError('Unexpected regex match result from nuspec file.');
92-
return null;
96+
console.log(`tag created in '${owner}/${repo}'`);
9397
}
94-
95-
const commitNumber = results[1];
96-
console.log(`commitNumber is ${commitNumber}`);
97-
return commitNumber;
9898
}
9999

100100
async function tagRepoAsync(
@@ -144,3 +144,50 @@ async function tagRepoAsync(
144144
function logError(message: string): void {
145145
console.log(`##vso[task.logissue type=error]${message}`);
146146
}
147+
async function getCommitFromNugetAsync(packageInfo: NugetPackageInfo): Promise<string | null> {
148+
const packageJsonString = fs.readFileSync('./package.json').toString();
149+
const packageJson = JSON.parse(packageJsonString);
150+
const packageVersion = packageJson['defaults'][packageInfo.packageJsonName];
151+
if (!packageVersion) {
152+
logError("Can't find razor version in package.json");
153+
return null;
154+
}
155+
156+
const platform = await PlatformInformation.GetCurrent();
157+
const vsixPlatformInfo = platformSpecificPackages.find(
158+
(p) => p.platformInfo.platform === platform.platform && p.platformInfo.architecture === platform.architecture
159+
)!;
160+
161+
const packageName = packageInfo.getPackageName(vsixPlatformInfo);
162+
console.log(`${packageName} version is ${packageVersion}`);
163+
164+
// Nuget package should exist under out/.nuget/ since we have run the install dependencies task.
165+
const packageDir = path.join('out', '.nuget', packageName, packageVersion);
166+
const nuspecFiles = fs.readdirSync(packageDir).filter((file) => file.endsWith('.nuspec'));
167+
168+
if (nuspecFiles.length === 0) {
169+
logError(`No .nuspec file found in ${packageDir}`);
170+
return null;
171+
}
172+
173+
if (nuspecFiles.length > 1) {
174+
logError(`Multiple .nuspec files found in ${packageDir}`);
175+
return null;
176+
}
177+
178+
const nuspecFile = fs.readFileSync(nuspecFiles[0]).toString();
179+
const results = /commit="(.*)"/.exec(nuspecFile);
180+
if (results == null || results.length == 0) {
181+
logError('Failed to find commit number from nuspec file');
182+
return null;
183+
}
184+
185+
if (results.length != 2) {
186+
logError('Unexpected regex match result from nuspec file.');
187+
return null;
188+
}
189+
190+
const commitNumber = results[1];
191+
console.log(`commitNumber is ${commitNumber}`);
192+
return commitNumber;
193+
}

tasks/offlinePackagingTasks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export const platformSpecificPackages: VSIXPlatformInfo[] = [
6060
{ vsceTarget: 'darwin-arm64', rid: 'osx-arm64', platformInfo: new PlatformInformation('darwin', 'arm64') },
6161
];
6262

63-
interface NugetPackageInfo {
63+
export interface NugetPackageInfo {
6464
getPackageName: (platformInfo: VSIXPlatformInfo | undefined) => string;
6565
packageJsonName: string;
6666
getPackageContentPath: (platformInfo: VSIXPlatformInfo | undefined) => string;

0 commit comments

Comments
 (0)