diff --git a/preview-src/index.css b/preview-src/index.css
index 96e832d26d..6f49a2e13f 100644
--- a/preview-src/index.css
+++ b/preview-src/index.css
@@ -178,7 +178,8 @@ body .comment-container .review-comment-header {
body .comment-container .review-comment-header > span,
body .comment-container .review-comment-header > a,
-body .commit .commit-message > a {
+body .commit .commit-message > a,
+body .merged .merged-message > a {
margin-right: 4px;
}
@@ -355,12 +356,13 @@ body .overview-title .button-group button {
fill: var(--vscode-foreground);
}
-.comment-container.commit {
+.comment-container.commit,
+.comment-container.merged {
padding-left: 16px;
box-sizing: border-box
}
-.commit, .review {
+.commit, .review, .merged {
display: flex;
width: 100%;
border: none;
@@ -373,24 +375,28 @@ body .overview-title .button-group button {
padding: 4px 0;
}
-.commit .commit-message {
+.commit .commit-message,
+.merged .merged-message {
display: flex;
align-items: center;
line-height: 18px;
overflow: hidden;
}
-.commit .commit-message .avatar-container {
+.commit .commit-message .avatar-container,
+.merged .merged-message .avatar-container {
margin-right: 4px;
flex-shrink: 0;
}
-.commit .avatar-container .avatar {
+.commit .avatar-container .avatar,
+.merged .avatar-container .avatar {
width: 18px;
height: 18px;
}
-.commit .commit-message .message {
+.commit .commit-message .message,
+.merged .merged-message .message {
overflow: inherit;
text-overflow: ellipsis;
white-space: nowrap;
@@ -400,6 +406,19 @@ body .overview-title .button-group button {
margin-left: auto;
}
+.merged .merged-message .message,
+.merged .inline-sha {
+ margin: 0 4px 0 0;
+}
+
+.merged svg {
+ width: 14px;
+ height: auto;
+ margin-right: 8px;
+ flex-shrink: 0;
+ fill: var(--vscode-foreground);
+}
+
.details {
display: flex;
flex-direction: column;
diff --git a/preview-src/pullRequestOverviewRenderer.ts b/preview-src/pullRequestOverviewRenderer.ts
index 520141300c..0c8bf7beb3 100644
--- a/preview-src/pullRequestOverviewRenderer.ts
+++ b/preview-src/pullRequestOverviewRenderer.ts
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { dateFromNow } from '../src/common/utils';
-import { TimelineEvent, CommitEvent, ReviewEvent, CommentEvent, isCommentEvent, isReviewEvent, isCommitEvent } from '../src/common/timelineEvent';
+import { TimelineEvent, CommitEvent, ReviewEvent, CommentEvent, isCommentEvent, isReviewEvent, isCommitEvent, isMergedEvent, MergedEvent } from '../src/common/timelineEvent';
import { PullRequestStateEnum } from '../src/github/interface';
import md from './mdRenderer';
import { MessageHandler } from './message';
@@ -12,6 +12,7 @@ import { getState, updateState, PullRequest } from './cache';
import { Comment } from '../src/common/comment';
const commitIconSvg = require('../resources/icons/commit_icon.svg');
+const mergeIconSvg = require('../resources/icons/merge_icon.svg');
const editIcon = require('../resources/icons/edit.svg');
const deleteIcon = require('../resources/icons/delete.svg');
const checkIcon = require('../resources/icons/check.svg');
@@ -689,6 +690,50 @@ export function renderCommit(timelineEvent: CommitEvent): HTMLElement {
return commentContainer;
}
+export function renderMergedEvent(timelineEvent: MergedEvent): HTMLElement {
+ const shaShort = timelineEvent.sha.substring(0, 7);
+
+ const mergedMessageContainer: HTMLDivElement = document.createElement('div');
+ mergedMessageContainer.classList.add('comment-container', 'merged');
+ const mergedMessage: HTMLDivElement = document.createElement('div');
+ mergedMessage.className = 'merged-message';
+ mergedMessage.insertAdjacentHTML('beforeend', mergeIconSvg);
+
+ const userIcon = renderUserIcon(timelineEvent.user.url, timelineEvent.user.avatarUrl);
+ mergedMessage.appendChild(userIcon);
+
+ const login: HTMLAnchorElement = document.createElement('a');
+ login.className = 'author';
+ login.href = timelineEvent.user.url;
+ login.textContent = timelineEvent.user.login!;
+ mergedMessage.appendChild(login);
+
+ const message: HTMLSpanElement = document.createElement('span');
+ message.className = 'message';
+ message.textContent = 'merged commit';
+ mergedMessage.appendChild(message);
+
+ const sha: HTMLAnchorElement = document.createElement('a');
+ sha.className = 'inline-sha';
+ sha.href = timelineEvent.commitUrl;
+ sha.textContent = shaShort;
+ mergedMessage.appendChild(sha);
+
+ const ref: HTMLSpanElement = document.createElement('span');
+ ref.className = 'message';
+ ref.textContent = `into ${timelineEvent.mergeRef}`;
+ mergedMessage.appendChild(ref);
+
+ const timestamp: HTMLAnchorElement = document.createElement('a');
+ timestamp.className = 'timestamp';
+ timestamp.href = timelineEvent.url;
+ timestamp.textContent = dateFromNow(timelineEvent.createdAt);
+ mergedMessage.appendChild(timestamp);
+
+ mergedMessageContainer.appendChild(mergedMessage);
+ return mergedMessageContainer;
+}
+
function getDiffChangeClass(type: DiffChangeType) {
switch (type) {
case DiffChangeType.Add:
@@ -756,6 +801,15 @@ class ReviewNode {
userLogin.href = this._review.user.url;
userLogin.textContent = this._review.user.login;
+ commentHeader.appendChild(userIcon);
+ commentHeader.appendChild(userLogin);
+
+ if (this._review.authorAssociation && this._review.authorAssociation !== 'NONE') {
+ const authorAssociation: HTMLSpanElement = document.createElement('span');
+ authorAssociation.textContent = `(${this._review.authorAssociation.toLocaleLowerCase()})`;
+ commentHeader.appendChild(authorAssociation);
+ }
+
const reviewState = document.createElement('span');
switch (this._review.state.toLowerCase()) {
case 'approved':
@@ -781,8 +835,6 @@ class ReviewNode {
timestamp.classList.add('pending');
}
- commentHeader.appendChild(userIcon);
- commentHeader.appendChild(userLogin);
commentHeader.appendChild(reviewState);
commentHeader.appendChild(timestamp);
@@ -798,7 +850,7 @@ class ReviewNode {
const reviewBody: HTMLDivElement = document.createElement('div');
reviewBody.className = 'review-body';
if (this._review.body) {
- reviewBody.innerHTML = md.render(emoji.emojify(this._review.body));
+ reviewBody.innerHTML = this._review.bodyHTML ? this._review.bodyHTML : md.render(emoji.emojify(this._review.body));
reviewCommentContainer.appendChild(reviewBody);
}
@@ -942,6 +994,10 @@ export function renderTimelineEvent(timelineEvent: TimelineEvent, messageHandler
return renderComment(timelineEvent, messageHandler);
}
+ if (isMergedEvent(timelineEvent)) {
+ return renderMergedEvent(timelineEvent);
+ }
+
return undefined;
}
diff --git a/resources/icons/merge_icon.svg b/resources/icons/merge_icon.svg
new file mode 100644
index 0000000000..8af4eead39
--- /dev/null
+++ b/resources/icons/merge_icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/common/timelineEvent.ts b/src/common/timelineEvent.ts
index 66b3fd7db2..ddd2c6ae2f 100644
--- a/src/common/timelineEvent.ts
+++ b/src/common/timelineEvent.ts
@@ -38,19 +38,21 @@ export interface CommentEvent {
}
export interface ReviewEvent {
- event: string;
+ event: EventType;
comments: Comment[];
submittedAt: string;
body: string;
+ bodyHTML?: string;
htmlUrl: string;
user: IAccount;
+ authorAssociation: string;
state: string;
id: number;
}
export interface CommitEvent {
author: IAccount;
- event: string;
+ event: EventType;
sha: string;
url: string;
htmlUrl: string;
@@ -58,16 +60,41 @@ export interface CommitEvent {
bodyHTML?: string;
}
-export type TimelineEvent = CommitEvent | ReviewEvent | CommentEvent;
+export interface MergedEvent {
+ graphNodeId: string;
+ user: IAccount;
+ createdAt: string;
+ mergeRef: string;
+ sha: string;
+ commitUrl: string;
+ event: EventType;
+ url: string;
+}
+
+export interface AssignEvent {
+ event: EventType;
+ user: IAccount;
+ actor: IAccount;
+}
+
+export type TimelineEvent = CommitEvent | ReviewEvent | CommentEvent | MergedEvent | AssignEvent;
export function isReviewEvent(event: TimelineEvent): event is ReviewEvent {
- return Number(event.event) === EventType.Reviewed;
+ return event.event === EventType.Reviewed;
}
export function isCommitEvent(event: TimelineEvent): event is CommitEvent {
- return Number(event.event) === EventType.Committed;
+ return event.event === EventType.Committed;
}
export function isCommentEvent(event: TimelineEvent): event is CommentEvent {
- return Number(event.event) === EventType.Commented;
+ return event.event === EventType.Commented;
+}
+
+export function isMergedEvent(event: TimelineEvent): event is MergedEvent {
+ return event.event === EventType.Merged;
}
+
+export function isAssignEvent(event: TimelineEvent): event is AssignEvent {
+ return event.event === EventType.Assigned;
+}
\ No newline at end of file
diff --git a/src/github/githubRepository.ts b/src/github/githubRepository.ts
index 333820c3b4..324fec5301 100644
--- a/src/github/githubRepository.ts
+++ b/src/github/githubRepository.ts
@@ -13,8 +13,8 @@ import { CredentialStore, GitHub } from './credentials';
import { AuthenticationError } from '../common/authentication';
import { QueryOptions, MutationOptions, ApolloQueryResult, NetworkStatus } from 'apollo-boost';
import { PRDocumentCommentProvider, PRDocumentCommentProviderGraphQL } from '../view/prDocumentCommentProvider';
-import { convertRESTPullRequestToRawPullRequest } from './utils';
-import { MentionableUsersResponse } from './graphql';
+import { convertRESTPullRequestToRawPullRequest, parseGraphQLPullRequest } from './utils';
+import { PullRequestResponse, MentionableUsersResponse } from './graphql';
const queries = require('./queries.gql');
export const PULL_REQUEST_PAGE_SIZE = 20;
@@ -279,22 +279,47 @@ export class GitHubRepository implements IGitHubRepository, vscode.Disposable {
async getPullRequest(id: number): Promise {
try {
Logger.debug(`Fetch pull request ${id} - enter`, GitHubRepository.ID);
- const { octokit, remote } = await this.ensure();
- let { data } = await octokit.pullRequests.get({
+ const { octokit, query, remote } = await this.ensure();
+ let prsResult = await octokit.pullRequests.get({
owner: remote.owner,
repo: remote.repositoryName,
number: id
});
Logger.debug(`Fetch pull request ${id} - done`, GitHubRepository.ID);
- if (!data.head.repo) {
+ if (!prsResult.data.head.repo) {
Logger.appendLine('The remote branch for this PR was already deleted.', GitHubRepository.ID);
return;
}
- let item = convertRESTPullRequestToRawPullRequest(data);
+ if (this.supportsGraphQl()) {
+ const { data } = await query({
+ query: queries.PullRequest,
+ variables: {
+ owner: remote.owner,
+ name: remote.repositoryName,
+ number: id
+ }
+ });
- return new PullRequestModel(this, remote, item);
+ Logger.debug(`Fetch pull request ${id} - done`, GitHubRepository.ID);
+ return new PullRequestModel(this, remote, parseGraphQLPullRequest(data));
+ } else {
+ let { data } = await octokit.pullRequests.get({
+ owner: remote.owner,
+ repo: remote.repositoryName,
+ number: id
+ });
+ Logger.debug(`Fetch pull request ${id} - done`, GitHubRepository.ID);
+
+ if (!data.head.repo) {
+ Logger.appendLine('The remote branch for this PR was already deleted.', GitHubRepository.ID);
+ return;
+ }
+
+ let item = convertRESTPullRequestToRawPullRequest(data);
+ return new PullRequestModel(this, remote, item);
+ }
} catch (e) {
Logger.appendLine(`GithubRepository> Unable to fetch PR: ${e}`);
return;
diff --git a/src/github/graphql.ts b/src/github/graphql.ts
index 9fb0174314..27e5b94bb6 100644
--- a/src/github/graphql.ts
+++ b/src/github/graphql.ts
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
export interface MergedEvent {
+ __typename: string;
id: string;
actor: {
login: string;
@@ -14,9 +15,15 @@ export interface MergedEvent {
mergeRef: {
name: string;
};
+ commit: {
+ oid: string;
+ commitUrl: string;
+ };
+ url: string;
}
export interface IssueComment {
+ __typename: string;
id: string;
databaseId: number;
authorAssocation: string;
@@ -27,6 +34,7 @@ export interface IssueComment {
};
url: string;
body: string;
+ bodyHTML: string;
updatedAt: string;
createdAt: string;
viewerCanUpdate: boolean;
@@ -35,6 +43,7 @@ export interface IssueComment {
}
export interface ReviewComment {
+ __typename: string;
id: string;
databaseId: number;
url: string;
@@ -46,6 +55,7 @@ export interface ReviewComment {
path: string;
originalPosition: number;
body: string;
+ bodyHTML: string;
diffHunk: string;
position: number;
state: string;
@@ -67,6 +77,7 @@ export interface ReviewComment {
}
export interface Commit {
+ __typename: string;
id: string;
author: {
user: {
@@ -85,6 +96,7 @@ export interface Commit {
}
export interface AssignedEvent {
+ __typename: string;
actor: {
login: string;
avatarUrl: string;
@@ -98,9 +110,11 @@ export interface AssignedEvent {
}
export interface Review {
+ __typename: string;
id: string;
databaseId: number;
- authorAssocation: string;
+ authorAssociation: string;
+ url: string;
author: {
login: string;
avatarUrl: string;
@@ -108,6 +122,7 @@ export interface Review {
};
state: string;
body: string;
+ bodyHTML?: string;
submittedAt: string;
updatedAt: string;
createdAt: string;
@@ -201,4 +216,47 @@ export interface DeleteReviewResponse {
}
}
};
+}
+
+export interface PullRequestResponse {
+ repository: {
+ pullRequest: {
+ number: number;
+ url: string;
+ state: string;
+ body: string;
+ bodyHTML: string;
+ title: string;
+ author: {
+ login: string;
+ url: string;
+ avatarUrl: string;
+ }
+ createdAt: string;
+ updatedAt: string;
+ headRef?: {
+ name: string;
+ repository: {
+ nameWithOwner: string;
+ url: string;
+ }
+ target: {
+ oid: string;
+ }
+ }
+ baseRef?: {
+ name: string;
+ repository: {
+ nameWithOwner: string;
+ url: string;
+ }
+ target: {
+ oid: string
+ }
+ }
+ merged: boolean;
+ mergeable: boolean;
+ id: string;
+ }
+ };
}
\ No newline at end of file
diff --git a/src/github/interface.ts b/src/github/interface.ts
index 2e42070eea..46d58ded26 100644
--- a/src/github/interface.ts
+++ b/src/github/interface.ts
@@ -58,14 +58,15 @@ export interface PullRequest {
number: number;
state: string;
body: string;
+ bodyHTML?: string;
title: string;
assignee?: IAccount;
createdAt: string;
updatedAt: string;
- head: IGitHubRef;
- base: IGitHubRef;
+ head?: IGitHubRef;
+ base?: IGitHubRef;
user: IAccount;
- labels: ILabel[];
+ labels?: ILabel[];
merged: boolean;
mergeable?: boolean;
nodeId: string;
diff --git a/src/github/pullRequestModel.ts b/src/github/pullRequestModel.ts
index 0c6d6c5343..8fb6d3e391 100644
--- a/src/github/pullRequestModel.ts
+++ b/src/github/pullRequestModel.ts
@@ -72,9 +72,10 @@ export class PullRequestModel {
update(prItem: PullRequest): void {
this.prNumber = prItem.number;
this.title = prItem.title;
+ this.bodyHTML = prItem.bodyHTML;
this.html_url = prItem.url;
this.author = prItem.user;
- this.labels = prItem.labels.map(label => label.name);
+ this.labels = (prItem.labels || []).map(label => label.name);
if (prItem.state === 'open') {
this.state = PullRequestStateEnum.Open;
@@ -89,8 +90,8 @@ export class PullRequestModel {
this.createdAt = prItem.createdAt;
this.updatedAt = prItem.updatedAt ? prItem.updatedAt : this.createdAt;
- this.head = new GitHubRef(prItem.head.ref, prItem.head.label, prItem.head.sha, prItem.head.repo.cloneUrl);
- this.base = new GitHubRef(prItem.base.ref, prItem.base.label, prItem.base.sha, prItem.base.repo.cloneUrl);
+ this.head = new GitHubRef(prItem.head!.ref, prItem.head!.label, prItem.head!.sha, prItem.head!.repo.cloneUrl);
+ this.base = new GitHubRef(prItem.base!.ref, prItem.base!.label, prItem.base!.sha, prItem.base!.repo.cloneUrl);
}
equals(other: PullRequestModel | undefined): boolean {
diff --git a/src/github/queries.gql b/src/github/queries.gql
index 34357c7ccf..8f3e949873 100644
--- a/src/github/queries.gql
+++ b/src/github/queries.gql
@@ -14,6 +14,11 @@ fragment Merged on MergedEvent {
mergeRef {
name
}
+ commit {
+ oid
+ commitUrl
+ }
+ url
}
fragment Comment on IssueComment {
@@ -27,6 +32,7 @@ fragment Comment on IssueComment {
}
url
body
+ bodyHTML
updatedAt
createdAt
viewerCanUpdate
@@ -77,6 +83,7 @@ fragment Review on PullRequestReview {
}
state
body
+ bodyHTML
submittedAt
updatedAt
createdAt
@@ -85,7 +92,6 @@ fragment Review on PullRequestReview {
query TimelineEvents($owner: String!, $name: String!, $number: Int!, $last: Int = 100) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
- bodyHTML
timeline(last: $last) {
edges {
node {
@@ -151,6 +157,49 @@ query PullRequestComments($owner:String!, $name:String!, $number:Int!, $first:In
}
}
+query PullRequest($owner: String!, $name: String!, $number: Int!) {
+ repository(owner: $owner, name: $name) {
+ pullRequest(number: $number) {
+ number
+ url
+ state
+ body
+ bodyHTML
+ title
+ author {
+ login
+ url
+ avatarUrl
+ }
+ createdAt
+ updatedAt
+ headRef {
+ name
+ repository {
+ nameWithOwner
+ url
+ }
+ target {
+ oid
+ }
+ }
+ baseRef {
+ name
+ repository {
+ nameWithOwner
+ url
+ }
+ target {
+ oid
+ }
+ }
+ merged
+ mergeable
+ id
+ }
+ }
+}
+
mutation AddComment($input: AddPullRequestReviewCommentInput!) {
addPullRequestReviewComment(input: $input) {
comment {
diff --git a/src/github/utils.ts b/src/github/utils.ts
index adab321995..2302bd6c27 100644
--- a/src/github/utils.ts
+++ b/src/github/utils.ts
@@ -8,8 +8,8 @@ import * as Octokit from '../common/octokit';
import { IAccount, PullRequest } from './interface';
import { Comment } from '../common/comment';
import { parseDiffHunk, DiffHunk } from '../common/diffHunk';
-import { EventType, TimelineEvent, isCommitEvent, isReviewEvent, isCommentEvent } from '../common/timelineEvent';
-import { ReviewComment } from './graphql';
+import * as Common from '../common/timelineEvent';
+import * as GraphQL from './graphql';
export function convertRESTUserToAccount(user: Octokit.PullRequestsGetAllResponseItemUser): IAccount {
return {
@@ -126,26 +126,26 @@ export function convertPullRequestsGetCommentsResponseItemToComment(comment: Oct
export function convertGraphQLEventType(text: string) {
switch (text) {
case 'Commit':
- return EventType.Committed;
+ return Common.EventType.Committed;
case 'LabeledEvent':
- return EventType.Labeled;
+ return Common.EventType.Labeled;
case 'MilestonedEvent':
- return EventType.Milestoned;
+ return Common.EventType.Milestoned;
case 'AssignedEvent':
- return EventType.Assigned;
+ return Common.EventType.Assigned;
case 'IssueComment':
- return EventType.Commented;
+ return Common.EventType.Commented;
case 'PullRequestReview':
- return EventType.Reviewed;
+ return Common.EventType.Reviewed;
case 'MergedEvent':
- return EventType.Merged;
+ return Common.EventType.Merged;
default:
- return EventType.Other;
+ return Common.EventType.Other;
}
}
-export function parseGraphQLComment(comment: ReviewComment): Comment {
+export function parseGraphQLComment(comment: GraphQL.ReviewComment): Comment {
const c: Comment = {
id: comment.databaseId,
url: comment.url,
@@ -173,50 +173,129 @@ export function parseGraphQLComment(comment: ReviewComment): Comment {
return c;
}
-export function parseGraphQLTimelineEvents(events: any[]): TimelineEvent[] {
+export function parseGraphQLPullRequest(pullRequest: GraphQL.PullRequestResponse): PullRequest {
+ const graphQLPullRequest = pullRequest.repository.pullRequest;
+ return {
+ url: graphQLPullRequest.url,
+ number: graphQLPullRequest.number,
+ state: graphQLPullRequest.state,
+ body: graphQLPullRequest.body,
+ bodyHTML: graphQLPullRequest.bodyHTML,
+ title: graphQLPullRequest.title,
+ createdAt: graphQLPullRequest.createdAt,
+ updatedAt: graphQLPullRequest.updatedAt,
+ head: graphQLPullRequest.headRef ? {
+ label: graphQLPullRequest.headRef.name,
+ ref: graphQLPullRequest.headRef.repository.nameWithOwner,
+ sha: graphQLPullRequest.headRef.target.oid,
+ repo: {
+ cloneUrl: graphQLPullRequest.headRef.repository.url
+ }
+ } : undefined,
+ base: graphQLPullRequest.baseRef ? {
+ label: graphQLPullRequest.baseRef.name,
+ ref: graphQLPullRequest.baseRef.repository.nameWithOwner,
+ sha: graphQLPullRequest.baseRef.target.oid,
+ repo: {
+ cloneUrl: graphQLPullRequest.baseRef.repository.url
+ }
+ } : undefined,
+ user: graphQLPullRequest.author,
+ merged: graphQLPullRequest.merged,
+ mergeable: graphQLPullRequest.mergeable,
+ nodeId: graphQLPullRequest.id,
+ labels: []
+ };
+}
+
+export function parseGraphQLTimelineEvents(events: (GraphQL.MergedEvent | GraphQL.Review | GraphQL.IssueComment | GraphQL.Commit | GraphQL.AssignedEvent)[]): Common.TimelineEvent[] {
+ let ret: Common.TimelineEvent[] = [];
events.forEach(event => {
let type = convertGraphQLEventType(event.__typename);
- event.event = type;
-
- if (event.event === EventType.Commented) {
- event.canEdit = event.viewerCanUpdate;
- event.canDelete = event.viewerCanDelete;
- event.user = event.author;
- event.id = event.databaseId;
- event.htmlUrl = event.url;
- }
- if (event.event === EventType.Reviewed) {
- event.user = event.author;
- event.canEdit = event.viewerCanUpdate;
- event.canDelete = event.viewerCanDelete;
- event.id = event.databaseId;
- event.htmlUrl = event.url;
- event.submittedAt = event.submittedAt;
- }
-
- if (event.event === EventType.Committed) {
- event.sha = event.oid;
- event.author = event.author.user || { login: event.committer.name, avatarUrl: event.committer.avatarUrl };
- event.htmlUrl = event.url;
+ switch (type) {
+ case Common.EventType.Commented:
+ let commentEvent = event as GraphQL.IssueComment;
+ ret.push({
+ htmlUrl: commentEvent.url,
+ body: commentEvent.body,
+ bodyHTML: commentEvent.bodyHTML,
+ user: commentEvent.author,
+ event: type,
+ canEdit: commentEvent.viewerCanUpdate,
+ canDelete: commentEvent.viewerCanDelete,
+ id: commentEvent.databaseId,
+ createdAt: commentEvent.createdAt
+ } as Common.CommentEvent);
+ return;
+ case Common.EventType.Reviewed:
+ let reviewEvent = event as GraphQL.Review;
+ ret.push({
+ event: type,
+ comments: [],
+ submittedAt: reviewEvent.submittedAt,
+ body: reviewEvent.body,
+ bodyHTML: reviewEvent.bodyHTML,
+ htmlUrl: reviewEvent.url,
+ user: reviewEvent.author,
+ authorAssociation: reviewEvent.authorAssociation,
+ state: reviewEvent.state,
+ id: reviewEvent.databaseId,
+ } as Common.ReviewEvent);
+ return;
+ case Common.EventType.Committed:
+ let commitEv = event as GraphQL.Commit;
+ ret.push({
+ event: type,
+ sha: commitEv.oid,
+ author: commitEv.author.user || { login: commitEv.committer.name, avatarUrl: commitEv.committer.avatarUrl },
+ htmlUrl: commitEv.url,
+ message: commitEv.message
+ } as Common.CommitEvent);
+ return;
+ case Common.EventType.Merged:
+ let mergeEv = event as GraphQL.MergedEvent;
+
+ ret.push({
+ event: type,
+ user: mergeEv.actor,
+ createdAt: mergeEv.createdAt,
+ mergeRef: mergeEv.mergeRef.name,
+ sha: mergeEv.commit.oid,
+ commitUrl: mergeEv.commit.commitUrl,
+ url: mergeEv.url,
+ graphNodeId: mergeEv.id
+ } as Common.MergedEvent);
+ return;
+ case Common.EventType.Assigned:
+ let assignEv = event as GraphQL.AssignedEvent;
+
+ ret.push({
+ event: type,
+ user: assignEv.user,
+ actor: assignEv.actor
+ } as Common.AssignEvent);
+ return;
+ default:
+ break;
}
});
- return events;
+ return ret;
}
-export function convertRESTTimelineEvents(events: any[]): TimelineEvent[] {
+export function convertRESTTimelineEvents(events: any[]): Common.TimelineEvent[] {
events.forEach(event => {
- if (event.event === EventType.Commented) {
+ if (event.event === Common.EventType.Commented) {
}
- if (event.event === EventType.Reviewed) {
+ if (event.event === Common.EventType.Reviewed) {
event.submittedAt = event.submitted_at;
event.htmlUrl = event.html_url;
}
- if (event.event === EventType.Committed) {
+ if (event.event === Common.EventType.Committed) {
event.htmlUrl = event.html_url;
}
});
@@ -224,25 +303,25 @@ export function convertRESTTimelineEvents(events: any[]): TimelineEvent[] {
return events;
}
-export function getRelatedUsersFromTimelineEvents(timelineEvents: TimelineEvent[]): { login: string; name: string; }[] {
+export function getRelatedUsersFromTimelineEvents(timelineEvents: Common.TimelineEvent[]): { login: string; name: string; }[] {
let ret: { login: string; name: string; }[] = [];
timelineEvents.forEach(event => {
- if (isCommitEvent(event)) {
+ if (Common.isCommitEvent(event)) {
ret.push({
login: event.author.login,
name: event.author.name || ''
});
}
- if (isReviewEvent(event)) {
+ if (Common.isReviewEvent(event)) {
ret.push({
login: event.user.login,
name: event.user.login
});
}
- if (isCommentEvent(event)) {
+ if (Common.isCommentEvent(event)) {
ret.push({
login: event.user.login,
name: event.user.login