@@ -16,6 +16,7 @@ import { PRDocumentCommentProvider } from '../view/prDocumentCommentProvider';
16
16
import { convertRESTPullRequestToRawPullRequest , parseGraphQLPullRequest } from './utils' ;
17
17
import { PullRequestResponse , MentionableUsersResponse } from './graphql' ;
18
18
const queries = require ( './queries.gql' ) ;
19
+ import axois , { AxiosResponse } from 'axios' ;
19
20
20
21
export const PULL_REQUEST_PAGE_SIZE = 20 ;
21
22
@@ -30,6 +31,7 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
30
31
static ID = 'GitHubRepository' ;
31
32
private _hub : GitHub | undefined ;
32
33
private _initialized : boolean ;
34
+ private _repositoryReturnsAvatar : boolean | null ;
33
35
private _metadata : any ;
34
36
private _toDispose : vscode . Disposable [ ] = [ ] ;
35
37
public commentsController ?: vscode . CommentController ;
@@ -72,6 +74,7 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
72
74
}
73
75
74
76
constructor ( public remote : Remote , private readonly _credentialStore : CredentialStore ) {
77
+ this . _repositoryReturnsAvatar = remote . host . toLowerCase ( ) === 'github.com' ? true : null ;
75
78
}
76
79
77
80
get supportsGraphQl ( ) : boolean {
@@ -206,7 +209,29 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
206
209
}
207
210
208
211
async getPullRequests ( prType : PRType , page ?: number ) : Promise < PullRequestData | undefined > {
209
- return prType === PRType . All ? this . getAllPullRequests ( page ) : this . getPullRequestsForCategory ( prType , page ) ;
212
+ return await ( prType === PRType . All ? this . getAllPullRequests ( page ) : this . getPullRequestsForCategory ( prType , page ) ) ;
213
+ }
214
+
215
+ public async ensureRepositoryReturnsAvatar ( testAvatarUrl : string ) : Promise < boolean > {
216
+ if ( this . _repositoryReturnsAvatar === null ) {
217
+ let response : AxiosResponse | null = null ;
218
+
219
+ try {
220
+ response = await axois ( { method : 'get' , url : testAvatarUrl , maxRedirects : 0 } ) ;
221
+ } catch ( err ) {
222
+ if ( err && err instanceof Error ) {
223
+ response = ( < any > err ) . response as AxiosResponse ;
224
+ }
225
+ }
226
+
227
+ if ( response && response . status === 200 ) {
228
+ this . _repositoryReturnsAvatar = true ;
229
+ }
230
+
231
+ this . _repositoryReturnsAvatar = false ;
232
+ }
233
+
234
+ return this . _repositoryReturnsAvatar ;
210
235
}
211
236
212
237
private async getAllPullRequests ( page ?: number ) : Promise < PullRequestData | undefined > {
@@ -221,6 +246,12 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
221
246
} ) ;
222
247
223
248
const hasMorePages = ! ! result . headers . link && result . headers . link . indexOf ( 'rel="next"' ) > - 1 ;
249
+
250
+ let repoReturnsAvatar : boolean = true ;
251
+ if ( result && result . data . length > 0 ) {
252
+ repoReturnsAvatar = await this . ensureRepositoryReturnsAvatar ( result . data [ 0 ] . user . avatar_url ) ;
253
+ }
254
+
224
255
if ( ! result . data ) {
225
256
// We really don't expect this to happen, but it seems to (see #574).
226
257
// Log a warning and return an empty set.
@@ -242,7 +273,8 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
242
273
}
243
274
244
275
const item = convertRESTPullRequestToRawPullRequest ( pullRequest ) ;
245
- return new PullRequestModel ( this , this . remote , item ) ;
276
+
277
+ return new PullRequestModel ( this , this . remote , item , repoReturnsAvatar ) ;
246
278
}
247
279
)
248
280
. filter ( item => item !== null ) as PullRequestModel [ ] ;
@@ -288,15 +320,23 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
288
320
} ) ;
289
321
290
322
const hasMorePages = ! ! headers . link && headers . link . indexOf ( 'rel="next"' ) > - 1 ;
291
- const pullRequests = await Promise . all ( promises ) . then ( values => {
292
- return values . map ( item => {
293
- if ( ! item . data . head . repo ) {
294
- Logger . appendLine ( 'GitHubRepository> The remote branch for this PR was already deleted.' ) ;
295
- return null ;
296
- }
297
- return new PullRequestModel ( this , this . remote , convertRESTPullRequestToRawPullRequest ( item . data ) ) ;
298
- } ) . filter ( item => item !== null ) as PullRequestModel [ ] ;
299
- } ) ;
323
+ const pullRequestResponses = await Promise . all ( promises ) ;
324
+
325
+ let repoReturnsAvatar = true ;
326
+ if ( pullRequestResponses && pullRequestResponses . length > 0 ) {
327
+ repoReturnsAvatar = await this . ensureRepositoryReturnsAvatar ( pullRequestResponses [ 0 ] . data . user . avatar_url ) ;
328
+ }
329
+
330
+ const pullRequests = pullRequestResponses . map ( response => {
331
+ if ( ! response . data . head . repo ) {
332
+ Logger . appendLine ( 'GitHubRepository> The remote branch for this PR was already deleted.' ) ;
333
+ return null ;
334
+ }
335
+
336
+ const item = convertRESTPullRequestToRawPullRequest ( response . data , ) ;
337
+ return new PullRequestModel ( this , this . remote , item , repoReturnsAvatar ) ;
338
+ } ) . filter ( item => item !== null ) as PullRequestModel [ ] ;
339
+
300
340
Logger . debug ( `Fetch pull request catogory ${ PRType [ prType ] } - done` , GitHubRepository . ID ) ;
301
341
302
342
return {
@@ -328,9 +368,11 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
328
368
number : id
329
369
}
330
370
} ) ;
331
-
332
371
Logger . debug ( `Fetch pull request ${ id } - done` , GitHubRepository . ID ) ;
333
- return new PullRequestModel ( this , remote , parseGraphQLPullRequest ( data ) ) ;
372
+
373
+ const repoReturnsAvatar = await this . ensureRepositoryReturnsAvatar ( data . repository . pullRequest . author . avatarUrl ) ;
374
+
375
+ return new PullRequestModel ( this , remote , parseGraphQLPullRequest ( data ) , repoReturnsAvatar ) ;
334
376
} else {
335
377
let { data } = await octokit . pullRequests . get ( {
336
378
owner : remote . owner ,
@@ -339,13 +381,15 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
339
381
} ) ;
340
382
Logger . debug ( `Fetch pull request ${ id } - done` , GitHubRepository . ID ) ;
341
383
384
+ const repoReturnsAvatar = await this . ensureRepositoryReturnsAvatar ( data . user . avatar_url ) ;
385
+
342
386
if ( ! data . head . repo ) {
343
387
Logger . appendLine ( 'The remote branch for this PR was already deleted.' , GitHubRepository . ID ) ;
344
388
return ;
345
389
}
346
390
347
391
let item = convertRESTPullRequestToRawPullRequest ( data ) ;
348
- return new PullRequestModel ( this , remote , item ) ;
392
+ return new PullRequestModel ( this , remote , item , repoReturnsAvatar ) ;
349
393
}
350
394
} catch ( e ) {
351
395
Logger . appendLine ( `GithubRepository> Unable to fetch PR: ${ e } ` ) ;
0 commit comments