@@ -65,19 +65,24 @@ type PreviewNextBetaState = {
6565 readonly targetMainCommit : string ;
6666 readonly mergeBase : Maybe < string > ;
6767 readonly commitsInspected : readonly string [ ] ;
68- readonly pullRequestNumbers : readonly number [ ] ;
68+ readonly pullRequests : readonly PreviewPullRequest [ ] ;
6969 readonly commitsWithoutMergedMainPullRequest : readonly string [ ] ;
7070 readonly failureMessages : readonly string [ ] ;
7171} ;
7272
73+ type PreviewPullRequest = {
74+ readonly number : number ;
75+ readonly title : string ;
76+ } ;
77+
7378type DiscoverPullRequestsOptions = {
7479 readonly commits : readonly string [ ] ;
7580 readonly githubClient : GitHubClient ;
7681 readonly githubToken : string ;
7782} ;
7883
7984type DiscoverPullRequestsResult = {
80- readonly pullRequestNumbers : readonly number [ ] ;
85+ readonly pullRequests : readonly PreviewPullRequest [ ] ;
8186 readonly commitsWithoutMergedMainPullRequest : readonly string [ ] ;
8287 readonly failureMessages : readonly string [ ] ;
8388} ;
@@ -114,6 +119,7 @@ type WriteSummarySafelyOptions = {
114119
115120const processArgumentStartIndex = 2 ;
116121const fullGitCommitPattern = / ^ [ 0 - 9 a - f ] { 40 } $ / i;
122+ const markdownSpecialCharacterPattern = / [ \\ ` * _ \[ \] < > ~ ] / gu;
117123const executeFile = promisify ( execFile ) ;
118124const advisoryMessage =
119125 'This is an advisory preview. These changes are on main but have not been deployed or verified in Beta.' ;
@@ -189,7 +195,7 @@ async function discoverPullRequests(
189195 discoverPullRequestsOptions : DiscoverPullRequestsOptions ,
190196) : Promise < DiscoverPullRequestsResult > {
191197 const { commits, githubClient, githubToken} = discoverPullRequestsOptions ;
192- const pullRequestNumbersByNumber = new Set < number > ( ) ;
198+ const pullRequestsByNumber = new Map < number , PreviewPullRequest > ( ) ;
193199 const commitsWithoutMergedMainPullRequest : string [ ] = [ ] ;
194200 const failureMessages : string [ ] = [ ] ;
195201
@@ -219,13 +225,18 @@ async function discoverPullRequests(
219225 }
220226
221227 for ( const pullRequest of mergedMainPullRequests ) {
222- pullRequestNumbersByNumber . add ( pullRequest . number ) ;
228+ if ( ! pullRequestsByNumber . has ( pullRequest . number ) ) {
229+ pullRequestsByNumber . set ( pullRequest . number , {
230+ number : pullRequest . number ,
231+ title : pullRequest . title ,
232+ } ) ;
233+ }
223234 }
224235 }
225236
226237 return {
227- pullRequestNumbers : [ ...pullRequestNumbersByNumber ] . toSorted ( ( leftNumber , rightNumber ) => {
228- return leftNumber - rightNumber ;
238+ pullRequests : [ ...pullRequestsByNumber . values ( ) ] . toSorted ( ( leftPullRequest , rightPullRequest ) => {
239+ return leftPullRequest . number - rightPullRequest . number ;
229240 } ) ,
230241 commitsWithoutMergedMainPullRequest,
231242 failureMessages,
@@ -241,7 +252,7 @@ function createUnavailableState(
241252 targetMainCommit,
242253 mergeBase : Maybe . nothing < string > ( ) ,
243254 commitsInspected : [ ] ,
244- pullRequestNumbers : [ ] ,
255+ pullRequests : [ ] ,
245256 commitsWithoutMergedMainPullRequest : [ ] ,
246257 failureMessages,
247258 } ;
@@ -279,7 +290,7 @@ async function createPreviewState(createPreviewStateOptions: CreatePreviewStateO
279290 targetMainCommit : resolvedTargetMainCommit ,
280291 mergeBase : Maybe . just ( mergeBase ) ,
281292 commitsInspected : commits ,
282- pullRequestNumbers : discoveryResult . pullRequestNumbers ,
293+ pullRequests : discoveryResult . pullRequests ,
283294 commitsWithoutMergedMainPullRequest : discoveryResult . commitsWithoutMergedMainPullRequest ,
284295 failureMessages : discoveryResult . failureMessages ,
285296 } ;
@@ -302,13 +313,24 @@ function formatPullRequestLines(state: PreviewNextBetaState, githubRepository: s
302313 return [ 'Not inspected.' ] ;
303314 }
304315
305- return is . emptyArray ( state . pullRequestNumbers )
316+ return is . emptyArray ( state . pullRequests )
306317 ? [ 'No merged pull requests are currently waiting for the next Beta.' ]
307- : state . pullRequestNumbers . map ( pullRequestNumber => {
308- return `- [#${ pullRequestNumber } ](https://github.com/${ githubRepository } /pull/${ pullRequestNumber } )` ;
318+ : state . pullRequests . map ( pullRequest => {
319+ return `- [#${ pullRequest . number } ](https://github.com/${ githubRepository } /pull/${ pullRequest . number } ) ${ normalizePullRequestTitle (
320+ pullRequest . title ,
321+ ) } `;
309322 } ) ;
310323}
311324
325+ function normalizePullRequestTitle ( title : string ) : string {
326+ return title
327+ . trim ( )
328+ . replace ( / \s + / gu, ' ' )
329+ . replace ( markdownSpecialCharacterPattern , character => {
330+ return `\\${ character } ` ;
331+ } ) ;
332+ }
333+
312334function formatDetailValue ( value : string , markdown : boolean ) : string {
313335 return markdown ? `\`${ value } \`` : value ;
314336}
@@ -329,7 +351,7 @@ function createDetailLines(state: PreviewNextBetaState, markdown: boolean): read
329351 const inspectionValues = state . mergeBase . isJust
330352 ? {
331353 commitsInspected : state . commitsInspected . length . toString ( ) ,
332- pullRequests : state . pullRequestNumbers . length . toString ( ) ,
354+ pullRequests : state . pullRequests . length . toString ( ) ,
333355 commitsWithoutPullRequests : state . commitsWithoutMergedMainPullRequest . length . toString ( ) ,
334356 }
335357 : {
@@ -390,7 +412,7 @@ function createReport(createReportOptions: CreateReportOptions): string {
390412 'Preview next Beta changes' ,
391413 ...createDetailLines ( state , false ) ,
392414 ...( is . emptyString ( unavailableMessage ) ? [ ] : [ '' , unavailableMessage ] ) ,
393- ...( state . mergeBase . isJust && is . emptyArray ( state . pullRequestNumbers )
415+ ...( state . mergeBase . isJust && is . emptyArray ( state . pullRequests )
394416 ? [ 'No merged pull requests are currently waiting for the next Beta.' ]
395417 : [ ] ) ,
396418 ...( is . emptyArray ( failureLines ) ? [ ] : [ 'Failures:' , ...failureLines ] ) ,
0 commit comments