From 59ad3ecb36c1475844983043aa61ca93d7ff336f Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 8 May 2018 17:40:37 -0700 Subject: [PATCH] no git extension api hack --- extensions/git-extended/package.json | 15 +++-- extensions/git-extended/src/extension.ts | 32 +++++------ .../git-extended/src/prView/prProvider.ts | 6 +- .../src/review/fileChangesProvider.ts | 55 +++++++++++++++++++ .../{reviewMode.ts => reviewManager.ts} | 39 ++++++------- extensions/git/.vscode/launch.json | 28 ---------- extensions/git/package.json | 2 +- extensions/git/src/api.ts | 14 +---- 8 files changed, 104 insertions(+), 87 deletions(-) create mode 100644 extensions/git-extended/src/review/fileChangesProvider.ts rename extensions/git-extended/src/review/{reviewMode.ts => reviewManager.ts} (95%) delete mode 100644 extensions/git/.vscode/launch.json diff --git a/extensions/git-extended/package.json b/extensions/git-extended/package.json index d24d91e09a6..f1226aa656d 100644 --- a/extensions/git-extended/package.json +++ b/extensions/git-extended/package.json @@ -47,10 +47,17 @@ } }, "views": { - "scm": [{ - "id": "pr", - "name": "GitHub Pull Requests" - }] + "scm": [ + { + "id": "pr", + "name": "GitHub Pull Requests" + }, + { + "id": "prStatus", + "name": "Changes From Pull Request", + "when": "git:ispr" + } + ] }, "commands": [{ "command": "pr.refreshList", diff --git a/extensions/git-extended/src/extension.ts b/extensions/git-extended/src/extension.ts index c7b45fb4874..5a4028147c3 100644 --- a/extensions/git-extended/src/extension.ts +++ b/extensions/git-extended/src/extension.ts @@ -9,7 +9,7 @@ import { PRProvider } from './prView/prProvider'; import { Repository } from './common/models/repository'; import { Configuration } from './configuration'; import { Resource } from './common/resources'; -import { ReviewMode } from './review/reviewMode'; +import { ReviewManager } from './review/reviewManager'; import { CredentialStore } from './credentials'; import { PullRequestService } from './services/pullRequestService'; @@ -36,22 +36,22 @@ export async function activate(context: vscode.ExtensionContext) { }) ); - let gitExt = vscode.extensions.getExtension('vscode.git'); - let importedGitApi = gitExt.exports; - let repos = await importedGitApi.getRepositories(); - let repo; + // let gitExt = vscode.extensions.getExtension('vscode.git'); + // let importedGitApi = gitExt.exports; + // let repos = await importedGitApi.getRepositories(); + // let repo; - if (!repos || !repos.length) { - let waitForRepo = new Promise((resolve, reject) => { - importedGitApi.onDidOpenRepository(repository => { - resolve(repository); - }); - }); + // if (!repos || !repos.length) { + // let waitForRepo = new Promise((resolve, reject) => { + // importedGitApi.onDidOpenRepository(repository => { + // resolve(repository); + // }); + // }); - repo = await waitForRepo; - } else { - repo = repos[0]; - } + // repo = await waitForRepo; + // } else { + // repo = repos[0]; + // } const repository = new Repository(rootPath, context.workspaceState); let repositoryInitialized = false; @@ -63,7 +63,7 @@ export async function activate(context: vscode.ExtensionContext) { let credentialStore = new CredentialStore(configuration); await repository.connectGitHub(credentialStore); let pullRequestService = new PullRequestService(); - let reviewMode = new ReviewMode(repository, pullRequestService, context.workspaceState, repo); + let reviewMode = new ReviewManager(context, repository, pullRequestService, context.workspaceState); await (new PRProvider(context, configuration, reviewMode)).activate(repository); }); } diff --git a/extensions/git-extended/src/prView/prProvider.ts b/extensions/git-extended/src/prView/prProvider.ts index a5453e698c7..0f8eaef0aae 100644 --- a/extensions/git-extended/src/prView/prProvider.ts +++ b/extensions/git-extended/src/prView/prProvider.ts @@ -13,7 +13,7 @@ import { Configuration } from '../configuration'; import { parseComments } from '../common/comment'; import { PRGroupTreeItem, FileChangeTreeItem } from '../common/treeItems'; import { Resource } from '../common/resources'; -import { ReviewMode } from '../review/reviewMode'; +import { ReviewManager } from '../review/reviewManager'; import { toPRUri } from '../common/uri'; import * as fs from 'fs'; import { PullRequestModel, PRType } from '../common/models/pullRequestModel'; @@ -22,13 +22,13 @@ export class PRProvider implements vscode.TreeDataProvider(); readonly onDidChangeTreeData = this._onDidChangeTreeData.event; private _onDidChange = new vscode.EventEmitter(); get onDidChange(): vscode.Event { return this._onDidChange.event; } - constructor(context: vscode.ExtensionContext, configuration: Configuration, reviewMode: ReviewMode) { + constructor(context: vscode.ExtensionContext, configuration: Configuration, reviewMode: ReviewManager) { this.context = context; this.configuration = configuration; this.reviewMode = reviewMode; diff --git a/extensions/git-extended/src/review/fileChangesProvider.ts b/extensions/git-extended/src/review/fileChangesProvider.ts new file mode 100644 index 00000000000..0d85c3a4edf --- /dev/null +++ b/extensions/git-extended/src/review/fileChangesProvider.ts @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { FileChangeTreeItem } from '../common/treeItems'; +import { Resource } from '../common/resources'; + +export class FileChangesProvider extends vscode.Disposable implements vscode.TreeDataProvider { + private _onDidChangeTreeData = new vscode.EventEmitter(); + readonly onDidChangeTreeData = this._onDidChangeTreeData.event; + + private _localFileChanges: FileChangeTreeItem[] = []; + constructor(private context: vscode.ExtensionContext) { + super(() => this.dispose()); + this.context.subscriptions.push(vscode.window.registerTreeDataProvider('prStatus', this)); + } + + async showPullRequestFileChanges(fileChanges: FileChangeTreeItem[]) { + await vscode.commands.executeCommand( + 'setContext', + 'git:ispr', + true + ); + this._localFileChanges = fileChanges; + this._onDidChangeTreeData.fire(); + } + + async hide() { + await vscode.commands.executeCommand( + 'setContext', + 'git:ispr', + false + ); + } + + getTreeItem(element: FileChangeTreeItem): vscode.TreeItem | Thenable { + if (element.comments && element.comments.length) { + element.iconPath = Resource.icons.light.Comment; + } else { + element.iconPath = Resource.getFileStatusUri(element); + } + element.resourceUri = element.filePath; + return element; + } + + getChildren(element?: FileChangeTreeItem): vscode.ProviderResult { + if (!element) { + return this._localFileChanges; + } else { + return []; + } + } +} \ No newline at end of file diff --git a/extensions/git-extended/src/review/reviewMode.ts b/extensions/git-extended/src/review/reviewManager.ts similarity index 95% rename from extensions/git-extended/src/review/reviewMode.ts rename to extensions/git-extended/src/review/reviewManager.ts index 9fc8dce16ca..66a9175ab4f 100644 --- a/extensions/git-extended/src/review/reviewMode.ts +++ b/extensions/git-extended/src/review/reviewManager.ts @@ -15,6 +15,7 @@ import { PullRequestModel } from '../common/models/pullRequestModel'; import { toGitUri } from '../common/uri'; import { GitChangeType } from '../common/models/file'; import { PullRequestService } from '../services/pullRequestService'; +import { FileChangesProvider } from './fileChangesProvider'; const REVIEW_STATE = 'git-extended.state'; @@ -26,7 +27,7 @@ export interface ReviewState { base: any; } -export class ReviewMode implements vscode.DecorationProvider { +export class ReviewManager implements vscode.DecorationProvider { private _documentCommentProvider: vscode.Disposable; private _workspaceCommentProvider: vscode.Disposable; private _command: vscode.Disposable; @@ -41,11 +42,22 @@ export class ReviewMode implements vscode.DecorationProvider { private _lastCommitSha: string; private _onDidChangeCommentThreads = new vscode.EventEmitter(); + + private _prFileChangesProvider: FileChangesProvider | undefined; + get prFileChangesProvider() { + if (this._prFileChangesProvider === undefined) { + this._prFileChangesProvider = new FileChangesProvider(this._context); + this._disposables.push(this._prFileChangesProvider); + } + + return this._prFileChangesProvider; + } + constructor( + private _context: vscode.ExtensionContext, private _repository: Repository, private _pullRequestService: PullRequestService, - private _workspaceState: vscode.Memento, - private _gitRepo: any + private _workspaceState: vscode.Memento ) { this._documentCommentProvider = null; this._workspaceCommentProvider = null; @@ -111,22 +123,7 @@ export class ReviewMode implements vscode.DecorationProvider { } await this.getPullRequestData(pr); - - let prChangeResources: vscode.SourceControlResourceState[] = this._localFileChanges.map(fileChange => ({ - resourceUri: fileChange.filePath, - command: { - title: 'show diff', - command: 'vscode.diff', - arguments: [ - fileChange.parentFilePath, - fileChange.filePath, - fileChange.fileName - ] - }, - decorations: { - letter: fileChange.letter - } - })); + await this.prFileChangesProvider.showPullRequestFileChanges(this._localFileChanges); this._command = vscode.commands.registerCommand(this._prNumber + '-post', async (uri: vscode.Uri, range: vscode.Range, thread: vscode.CommentThread, text: string) => { try { @@ -174,10 +171,6 @@ export class ReviewMode implements vscode.DecorationProvider { this._onDidChangeDecorations.fire(); this.registerCommentProvider(); - - let prGroup: vscode.SourceControlResourceGroup = this._gitRepo.sourceControl.createResourceGroup('pr', 'Changes from PR'); - this._resourceGroups.push(prGroup); - prGroup.resourceStates = prChangeResources; } private async updateComments(): Promise { diff --git a/extensions/git/.vscode/launch.json b/extensions/git/.vscode/launch.json deleted file mode 100644 index afe3c97a5f9..00000000000 --- a/extensions/git/.vscode/launch.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Launch Program", - "program": "${workspaceFolder}/out/main" - }, - { - "name": "Launch Extension", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "/Users/penlv/code/vscode/scripts/code.sh", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "trace": true, - "protocol": "inspector", - "stopOnEntry": false, - "sourceMaps": true, - "outFiles": ["${workspaceFolder}/out/**/*.js"] - } - ] -} \ No newline at end of file diff --git a/extensions/git/package.json b/extensions/git/package.json index 394a494d684..f6d86f0a91b 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -5,7 +5,7 @@ "publisher": "vscode", "version": "1.0.0", "engines": { - "vscode": "^1.13.0" + "vscode": "^1.5.0" }, "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "enableProposedApi": true, diff --git a/extensions/git/src/api.ts b/extensions/git/src/api.ts index c5b59cda486..6832fda9531 100644 --- a/extensions/git/src/api.ts +++ b/extensions/git/src/api.ts @@ -7,7 +7,7 @@ import { Model } from './model'; import { Repository as ModelRepository } from './repository'; -import { Uri, SourceControlInputBox, SourceControl, EventEmitter, Event } from 'vscode'; +import { Uri, SourceControlInputBox } from 'vscode'; export interface InputBox { value: string; @@ -28,12 +28,10 @@ export class RepositoryImpl implements Repository { readonly rootUri: Uri; readonly inputBox: InputBox; - readonly sourceControl: SourceControl; constructor(repository: ModelRepository) { this.rootUri = Uri.file(repository.root); this.inputBox = new InputBoxImpl(repository.inputBox); - this.sourceControl = repository.sourceControl; } } @@ -43,16 +41,8 @@ export interface API { } export class APIImpl implements API { - private _onDidOpenRepository = new EventEmitter(); - readonly onDidOpenRepository: Event = this._onDidOpenRepository.event; - constructor(private modelPromise: Promise) { - modelPromise.then(model => { - model.onDidOpenRepository(repository => { - this._onDidOpenRepository.fire(new RepositoryImpl(repository)); - }); - }); - } + constructor(private modelPromise: Promise) { } async getGitPath(): Promise { const model = await this.modelPromise;