@@ -7,6 +7,9 @@ import * as gulp from 'gulp';
77import * as fs from 'fs' ;
88import minimist from 'minimist' ;
99import { Octokit } from '@octokit/rest' ;
10+ import { allNugetPackages , NugetPackageInfo , platformSpecificPackages } from './offlinePackagingTasks' ;
11+ import { PlatformInformation } from '../src/shared/platform' ;
12+ import path from 'path' ;
1013
1114interface 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 = / c o m m i t = " ( .* ) " / . 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
100100async function tagRepoAsync (
@@ -144,3 +144,50 @@ async function tagRepoAsync(
144144function 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 = / c o m m i t = " ( .* ) " / . 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+ }
0 commit comments