Skip to content

Commit

Permalink
Update SCM Plugin API from the latest vscode
Browse files Browse the repository at this point in the history
Signed-off-by: Igor Vinokur <[email protected]>
  • Loading branch information
vinokurig committed Feb 10, 2021
1 parent f1d4690 commit d16c3f1
Show file tree
Hide file tree
Showing 12 changed files with 1,216 additions and 493 deletions.
7 changes: 4 additions & 3 deletions packages/git/src/browser/git-commit-message-validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import { injectable } from 'inversify';
import { MaybePromise } from '@theia/core/lib/common/types';
import { ScmInputIssueType } from '@theia/scm/lib/browser/scm-input';

@injectable()
export class GitCommitMessageValidator {
Expand All @@ -42,14 +43,14 @@ export class GitCommitMessageValidator {
protected isLineValid(line: string, index: number): GitCommitMessageValidator.Result | undefined {
if (index === 1 && line.length !== 0) {
return {
status: 'warning',
status: ScmInputIssueType.Warning,
message: 'The second line should be empty to separate the commit message from the body'
};
}
const diff = line.length - this.maxCharsPerLine();
if (diff > 0) {
return {
status: 'warning',
status: ScmInputIssueType.Warning,
message: `${diff} characters over ${this.maxCharsPerLine()} in current line`
};
}
Expand All @@ -67,7 +68,7 @@ export namespace GitCommitMessageValidator {
/**
* Type for the validation result with a status and a corresponding message.
*/
export type Result = Readonly<{ message: string, status: 'info' | 'success' | 'warning' | 'error' }>;
export type Result = Readonly<{ message: string, status: ScmInputIssueType }>;

export namespace Result {

Expand Down
28 changes: 21 additions & 7 deletions packages/git/src/browser/git-contribution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,22 @@
********************************************************************************/
import { inject, injectable } from 'inversify';
import URI from '@theia/core/lib/common/uri';
import { Command, CommandContribution, CommandRegistry, DisposableCollection, MenuContribution, MenuModelRegistry, Mutable, MenuAction } from '@theia/core';
import {
Command,
CommandContribution,
CommandRegistry,
DisposableCollection,
MenuAction,
MenuContribution,
MenuModelRegistry,
Mutable
} from '@theia/core';
import { DiffUris, Widget } from '@theia/core/lib/browser';
import { TabBarToolbarContribution, TabBarToolbarRegistry, TabBarToolbarItem } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
import {
TabBarToolbarContribution,
TabBarToolbarItem,
TabBarToolbarRegistry
} from '@theia/core/lib/browser/shell/tab-bar-toolbar';
import { EditorContextMenu, EditorManager, EditorOpenerOptions, EditorWidget } from '@theia/editor/lib/browser';
import { Git, GitFileChange, GitFileStatus } from '../common';
import { GitRepositoryTracker } from './git-repository-tracker';
Expand All @@ -28,11 +41,12 @@ import { GitRepositoryProvider } from './git-repository-provider';
import { GitErrorHandler } from '../browser/git-error-handler';
import { ScmWidget } from '@theia/scm/lib/browser/scm-widget';
import { ScmTreeWidget } from '@theia/scm/lib/browser/scm-tree-widget';
import { ScmResource, ScmCommand } from '@theia/scm/lib/browser/scm-provider';
import { ScmCommand, ScmResource } from '@theia/scm/lib/browser/scm-provider';
import { ProgressService } from '@theia/core/lib/common/progress-service';
import { GitPreferences } from './git-preferences';
import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution';
import { ColorRegistry } from '@theia/core/lib/browser/color-registry';
import { ScmInputIssueType } from '@theia/scm/lib/browser/scm-input';

export namespace GIT_COMMANDS {
export const CLONE = {
Expand Down Expand Up @@ -487,7 +501,7 @@ export class GitContribution implements CommandContribution, MenuContribution, T
const lastCommit = await scmRepository.provider.amendSupport.getLastCommit();
if (lastCommit === undefined) {
scmRepository.input.issue = {
type: 'error',
type: ScmInputIssueType.Error,
message: 'No previous commit to amend'
};
scmRepository.input.focus();
Expand Down Expand Up @@ -727,15 +741,15 @@ export class GitContribution implements CommandContribution, MenuContribution, T
const message = options.message || scmRepository.input.value;
if (!message.trim()) {
scmRepository.input.issue = {
type: 'error',
type: ScmInputIssueType.Error,
message: 'Please provide a commit message'
};
scmRepository.input.focus();
return;
}
if (!scmRepository.provider.stagedChanges.length) {
scmRepository.input.issue = {
type: 'error',
type: ScmInputIssueType.Error,
message: 'No changes added to commit'
};
scmRepository.input.focus();
Expand Down Expand Up @@ -776,7 +790,7 @@ export class GitContribution implements CommandContribution, MenuContribution, T
scmRepository.input.focus();
} catch (e) {
scmRepository.input.issue = {
type: 'warning',
type: ScmInputIssueType.Warning,
message: 'Make sure you configure your \'user.name\' and \'user.email\' in git.'
};
}
Expand Down
65 changes: 65 additions & 0 deletions packages/plugin-ext/src/common/arrays.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,68 @@ export function isNonEmptyArray<T>(obj: T[] | readonly T[] | undefined | null):
export function flatten<T>(arr: T[][]): T[] {
return (<T[]>[]).concat(...arr);
}

/**
* Diffs two *sorted* arrays and computes the splices which apply the diff.
*/
export function sortedDiff<T>(before: ReadonlyArray<T>, after: ReadonlyArray<T>, compare: (a: T, b: T) => number): Splice<T>[] {
const result: MutableSplice<T>[] = [];

function pushSplice(start: number, deleteCount: number, toInsert: T[]): void {
if (deleteCount === 0 && toInsert.length === 0) {
return;
}

const latest = result[result.length - 1];

if (latest && latest.start + latest.deleteCount === start) {
latest.deleteCount += deleteCount;
latest.toInsert.push(...toInsert);
} else {
result.push({ start, deleteCount, toInsert });
}
}

let beforeIdx = 0;
let afterIdx = 0;

while (true) {
if (beforeIdx === before.length) {
pushSplice(beforeIdx, 0, after.slice(afterIdx));
break;
}
if (afterIdx === after.length) {
pushSplice(beforeIdx, before.length - beforeIdx, []);
break;
}

const beforeElement = before[beforeIdx];
const afterElement = after[afterIdx];
const n = compare(beforeElement, afterElement);
if (n === 0) {
// equal
beforeIdx += 1;
afterIdx += 1;
} else if (n < 0) {
// beforeElement is smaller -> before element removed
pushSplice(beforeIdx, 1, []);
beforeIdx += 1;
} else if (n > 0) {
// beforeElement is greater -> after element added
pushSplice(beforeIdx, 0, [afterElement]);
afterIdx += 1;
}
}

return result;
}

interface MutableSplice<T> extends Splice<T> {
deleteCount: number;
}

export interface Splice<T> {
readonly start: number;
readonly deleteCount: number;
readonly toInsert: T[];
}
53 changes: 42 additions & 11 deletions packages/plugin-ext/src/common/plugin-api-rpc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -688,10 +688,11 @@ export namespace ScmCommandArg {
export interface ScmExt {
createSourceControl(plugin: Plugin, id: string, label: string, rootUri?: theia.Uri): theia.SourceControl;
getLastInputBox(plugin: Plugin): theia.SourceControlInputBox | undefined;
$updateInputBox(sourceControlHandle: number, message: string): Promise<void>;
$onInputBoxValueChange(sourceControlHandle: number, message: string): Promise<void>;
$executeResourceCommand(sourceControlHandle: number, groupHandle: number, resourceHandle: number): Promise<void>;
$provideOriginalResource(sourceControlHandle: number, uri: string, token: CancellationToken): Promise<UriComponents | undefined>;
$setSourceControlSelection(sourceControlHandle: number, selected: boolean): Promise<void>;
$validateInput(sourceControlHandle: number, value: string, cursorPosition: number): Promise<[string, number] | undefined>;
$setSelectedSourceControl(selectedSourceControlHandle: number | undefined): Promise<void>;
$provideOriginalResource(sourceControlHandle: number, uri: string, token: theia.CancellationToken): Promise<UriComponents | undefined>;
}

export namespace TimelineCommandArg {
Expand Down Expand Up @@ -760,18 +761,19 @@ export interface DecorationData {
}

export interface ScmMain {
$registerSourceControl(sourceControlHandle: number, id: string, label: string, rootUri?: string): Promise<void>
$registerSourceControl(sourceControlHandle: number, id: string, label: string, rootUri?: UriComponents): Promise<void>;
$updateSourceControl(sourceControlHandle: number, features: SourceControlProviderFeatures): Promise<void>;
$unregisterSourceControl(sourceControlHandle: number): Promise<void>;

$registerGroup(sourceControlHandle: number, groupHandle: number, id: string, label: string): Promise<void>;
$updateGroup(sourceControlHandle: number, groupHandle: number, features: SourceControlGroupFeatures): Promise<void>;
$updateGroupLabel(sourceControlHandle: number, groupHandle: number, label: string): Promise<void>;
$updateResourceState(sourceControlHandle: number, groupHandle: number, resources: SourceControlResourceState[]): Promise<void>;
$unregisterGroup(sourceControlHandle: number, groupHandle: number): Promise<void>;
$registerGroups(sourceControlHandle: number, groups: ScmRawResourceGroup[], splices: ScmRawResourceSplices[]): void;
$updateGroup(sourceControlHandle: number, groupHandle: number, features: SourceControlGroupFeatures): void;
$updateGroupLabel(sourceControlHandle: number, groupHandle: number, label: string): void;
$unregisterGroup(sourceControlHandle: number, groupHandle: number): void;

$setInputBoxValue(sourceControlHandle: number, value: string): Promise<void>;
$setInputBoxPlaceholder(sourceControlHandle: number, placeholder: string): Promise<void>;
$spliceResourceStates(sourceControlHandle: number, splices: ScmRawResourceSplices[]): void;

$setInputBoxValue(sourceControlHandle: number, value: string): void;
$setInputBoxPlaceholder(sourceControlHandle: number, placeholder: string): void;
}

export interface SourceControlProviderFeatures {
Expand All @@ -786,6 +788,35 @@ export interface SourceControlGroupFeatures {
hideWhenEmpty: boolean | undefined;
}

export interface ScmRawResource {
handle: number,
sourceUri: UriComponents,
icons: UriComponents[],
tooltip: string,
strikeThrough: boolean,
faded: boolean,
contextValue: string,
command: Command | undefined
}

export interface ScmRawResourceGroup {
handle: number,
id: string,
label: string,
features: SourceControlGroupFeatures
}

export interface ScmRawResourceSplice {
start: number,
deleteCount: number,
rawResources: ScmRawResource[]
}

export interface ScmRawResourceSplices {
handle: number,
splices: ScmRawResourceSplice[]
}

export interface SourceControlResourceState {
readonly handle: number
/**
Expand Down
Loading

0 comments on commit d16c3f1

Please sign in to comment.