@@ -62,6 +62,29 @@ ... on PullRequest {{
6262 }}
6363 ...on DisconnectedEvent {{
6464 createdAt,
65+ id,
66+ source {{
67+ __typename,
68+ ... on Issue {{
69+ number
70+ }}
71+ ... on PullRequest {{
72+ number,
73+ author {{
74+ avatarUrl,
75+ resourcePath,
76+ }}
77+ }}
78+ }},
79+ subject {{
80+ __typename
81+ ... on Issue {{
82+ number
83+ }}
84+ ... on PullRequest {{
85+ number
86+ }}
87+ }}
6588 }}
6689 }}
6790 }}
@@ -414,7 +437,7 @@ public string GetIssueType(Issue issue)
414437 return issue . IsPullRequest ? "Pull Request" : "Issue" ;
415438 }
416439
417- public async Task < Issue > GetLinkedIssueAsync ( string owner , string repository , int issueNumber )
440+ public async Task < IEnumerable < Issue > > GetLinkedIssuesAsync ( string owner , string repository , Issue issue )
418441 {
419442 var graphQLQuery = string . Format ( CultureInfo . InvariantCulture , CONNECT_AND_DISCONNECT_EVENTS_GRAPHQL_QUERY ,
420443 string . Format ( CultureInfo . InvariantCulture , CONNECT_AND_DISCONNECT_EVENTS_GRAPHQL_QUERY_FRAGMENT , "issue" ) ,
@@ -428,7 +451,7 @@ public async Task<Issue> GetLinkedIssueAsync(string owner, string repository, in
428451 pageSize = PAGE_SIZE ,
429452 repoName = repository ,
430453 repoOwner = owner ,
431- issueNumber = issueNumber ,
454+ issueNumber = issue . PublicNumber ,
432455 } ,
433456 } ;
434457
@@ -443,41 +466,45 @@ public async Task<Issue> GetLinkedIssueAsync(string owner, string repository, in
443466
444467 if ( issueNode . ValueKind == JsonValueKind . Null || issueNode . ValueKind == JsonValueKind . Undefined )
445468 {
446- throw new NotFoundException ( $ "Unable to find issue/pull request { issueNumber } ") ;
469+ throw new NotFoundException ( $ "Unable to find issue/pull request { issue . PublicNumber } ") ;
447470 }
448471
449472 var nodes = issueNode . GetJsonElement ( "timelineItems.nodes" ) ;
450- var sortedNodes = nodes . EnumerateArray ( ) . OrderByDescending ( n => n . GetJsonElement ( "createdAt" ) . GetDateTime ( ) ) ;
451- var mostRecentConnectedEvent = sortedNodes . FirstOrDefault ( n => n . GetJsonElement ( "__typename" ) . GetString ( ) == "ConnectedEvent" ) ;
452- var mostRecentDisconnectedEvent = sortedNodes . FirstOrDefault ( n => n . GetJsonElement ( "__typename" ) . GetString ( ) == "DisconnectedEvent" ) ;
473+ var sortedNodes = nodes . EnumerateArray ( ) . OrderBy ( n => n . GetJsonElement ( "createdAt" ) . GetDateTime ( ) ) ;
474+ var connectedEvents = sortedNodes . Where ( n => n . GetJsonElement ( "__typename" ) . GetString ( ) == "ConnectedEvent" ) . ToArray ( ) ;
475+ var disconnectedEvents = sortedNodes . Where ( n => n . GetJsonElement ( "__typename" ) . GetString ( ) == "DisconnectedEvent" ) . ToArray ( ) ;
453476
454- // Make sure we found an event that indicates that an issue/PR was linked to this issue/PR
455- if ( mostRecentConnectedEvent . ValueKind == JsonValueKind . Null || mostRecentConnectedEvent . ValueKind == JsonValueKind . Undefined )
477+ if ( ! connectedEvents . Any ( ) )
456478 {
457- return null ;
479+ return Enumerable . Empty < Issue > ( ) ;
458480 }
459481
460- // We found an event indicating that an issue was linked. Make sure it wasn't un-linked
461- else if ( mostRecentDisconnectedEvent . ValueKind == JsonValueKind . Null || mostRecentDisconnectedEvent . ValueKind == JsonValueKind . Undefined )
482+ var linkedIssues = new List < Issue > ( ) ;
483+ foreach ( var connectEvent in connectedEvents )
462484 {
463- var linkedIssueNumber = mostRecentConnectedEvent . GetJsonElement ( "subject.number" ) . GetInt32 ( ) ;
464- var issue = await _gitHubClient . Issue . Get ( owner , repository , linkedIssueNumber ) . ConfigureAwait ( false ) ;
465- return _mapper . Map < Issue > ( issue ) ;
466- }
485+ var linkedIssueNumber = connectEvent . GetJsonElement ( "subject.number" ) . GetInt32 ( ) ;
486+ var correspondingDisconnectEvent = disconnectedEvents
487+ . FirstOrDefault ( e =>
488+ e . GetJsonElement ( "subject.number" ) . GetInt32 ( ) == linkedIssueNumber &&
489+ e . GetJsonElement ( "createdAt" ) . GetDateTime ( ) >= connectEvent . GetJsonElement ( "createdAt" ) . GetDateTime ( ) ) ;
467490
468- // We found a linked issue and a disconnection event. Check which one is the most recent
469- else if ( mostRecentDisconnectedEvent . GetJsonElement ( "createdAt" ) . GetDateTime ( ) >= mostRecentConnectedEvent . GetJsonElement ( "createdAt" ) . GetDateTime ( ) )
470- {
471- return null ;
491+ if ( correspondingDisconnectEvent . ValueKind == JsonValueKind . Null || correspondingDisconnectEvent . ValueKind == JsonValueKind . Undefined )
492+ {
493+ var linkedIssue = await _gitHubClient . Issue . Get ( owner , repository , linkedIssueNumber ) . ConfigureAwait ( false ) ;
494+ linkedIssues . Add ( _mapper . Map < Issue > ( linkedIssue ) ) ;
495+ }
496+ else if ( correspondingDisconnectEvent . GetJsonElement ( "createdAt" ) . GetDateTime ( ) >= connectEvent . GetJsonElement ( "createdAt" ) . GetDateTime ( ) )
497+ {
498+ continue ;
499+ }
500+ else
501+ {
502+ var linkedIssue = await _gitHubClient . Issue . Get ( owner , repository , linkedIssueNumber ) . ConfigureAwait ( false ) ;
503+ linkedIssues . Add ( _mapper . Map < Issue > ( linkedIssue ) ) ;
504+ }
472505 }
473506
474- // We found an event indicating that an issue was linked and we determined that it is more recent than any of the "un-link" events
475- else
476- {
477- var linkedIssueNumber = mostRecentConnectedEvent . GetJsonElement ( "subject.number" ) . GetInt32 ( ) ;
478- var issue = await _gitHubClient . Issue . Get ( owner , repository , linkedIssueNumber ) . ConfigureAwait ( false ) ;
479- return _mapper . Map < Issue > ( issue ) ;
480- }
507+ return linkedIssues ;
481508 }
482509
483510 private async Task ExecuteAsync ( Func < Task > action )
0 commit comments