diff --git a/extensions/git/src/api/api1.ts b/extensions/git/src/api/api1.ts index 783fdf857ad..c6d7312604e 100644 --- a/extensions/git/src/api/api1.ts +++ b/extensions/git/src/api/api1.ts @@ -5,7 +5,7 @@ import { Model } from '../model'; import { Repository as BaseRepository, Resource } from '../repository'; -import { InputBox, Git, API, Repository, Remote, RepositoryState, Branch, Ref, Submodule, Commit, Change, RepositoryUIState } from './git'; +import { InputBox, Git, API, Repository, Remote, RepositoryState, Branch, Ref, Submodule, Commit, Change, RepositoryUIState, Status } from './git'; import { Event, SourceControlInputBox, Uri, SourceControl } from 'vscode'; import { mapEvent } from '../util'; @@ -17,7 +17,23 @@ class ApiInputBox implements InputBox { export class ApiChange implements Change { - constructor(_resource: Resource) { } + constructor(private readonly resource: Resource) { } + + public get resourceUri(): Uri { + return this.resource.resourceUri; + } + + public get status(): Status { + return this.resource.type; + } + + public get original(): Uri { + return this.resource.original; + } + + public get renameResourceUri(): Uri | undefined { + return this.resource.renameResourceUri; + } } export class ApiRepositoryState implements RepositoryState { @@ -79,6 +95,14 @@ export class ApiRepository implements Repository { return this._repository.getObjectDetails(treeish, path); } + detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string }> { + return this._repository.detectObjectType(object); + } + + buffer(ref: string, filePath: string): Promise { + return this._repository.buffer(ref, filePath); + } + diffWithHEAD(path: string): Promise { return this._repository.diffWithHEAD(path); } @@ -150,6 +174,10 @@ export class ApiRepository implements Repository { pull(): Promise { return this._repository.pull(); } + + clean(filePaths: string[]) { + return this._repository.clean(filePaths.map(p => Uri.file(p))); + } } export class ApiGit implements Git { diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts index 988b6eca7a6..96771ece10e 100644 --- a/extensions/git/src/api/git.d.ts +++ b/extensions/git/src/api/git.d.ts @@ -56,8 +56,32 @@ export interface Remote { readonly isReadOnly: boolean; } +export const enum Status { + INDEX_MODIFIED, + INDEX_ADDED, + INDEX_DELETED, + INDEX_RENAMED, + INDEX_COPIED, + + MODIFIED, + DELETED, + UNTRACKED, + IGNORED, + + ADDED_BY_US, + ADDED_BY_THEM, + DELETED_BY_US, + DELETED_BY_THEM, + BOTH_ADDED, + BOTH_DELETED, + BOTH_MODIFIED +} + export interface Change { - // TODO + readonly resourceUri: Uri; + readonly status: Status; + readonly original: Uri; + readonly renameResourceUri: Uri | undefined; } export interface RepositoryState { @@ -93,6 +117,8 @@ export interface Repository { show(ref: string, path: string): Promise; getCommit(ref: string): Promise; getObjectDetails(treeish: string, path: string): Promise<{ mode: string, object: string, size: number }>; + detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string }>; + buffer(ref: string, filePath: string): Promise; diffWithHEAD(path: string): Promise; diffWith(ref: string, path: string): Promise; @@ -118,6 +144,8 @@ export interface Repository { fetch(remote?: string, ref?: string): Promise; pull(): Promise; + + clean(filePaths: string[]): Promise; } export interface API { diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 9c838715840..10d296f5e89 100755 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -5,7 +5,7 @@ import { Uri, commands, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn, ProgressLocation, TextEditor, MessageOptions, WorkspaceFolder } from 'vscode'; import { Git, CommitOptions, Stash, ForcePushMode } from './git'; -import { Repository, Resource, Status, ResourceGroupType } from './repository'; +import { Repository, Resource, ResourceGroupType } from './repository'; import { Model } from './model'; import { toGitUri, fromGitUri } from './uri'; import { grep, isDescendant, pathEquals } from './util'; @@ -15,7 +15,7 @@ import { lstat, Stats } from 'fs'; import * as os from 'os'; import TelemetryReporter from 'vscode-extension-telemetry'; import * as nls from 'vscode-nls'; -import { Ref, RefType, Branch, GitErrorCodes } from './api/git'; +import { Ref, RefType, Branch, GitErrorCodes, Status } from './api/git'; const localize = nls.loadMessageBundle(); diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index dcfbf569ec9..0c27365bc51 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -5,11 +5,11 @@ import { window, workspace, Uri, Disposable, Event, EventEmitter, DecorationData, DecorationProvider, ThemeColor } from 'vscode'; import * as path from 'path'; -import { Repository, GitResourceGroup, Status } from './repository'; +import { Repository, GitResourceGroup } from './repository'; import { Model } from './model'; import { debounce } from './decorators'; import { filterEvent, dispose, anyEvent, fireEvent } from './util'; -import { GitErrorCodes } from './api/git'; +import { GitErrorCodes, Status } from './api/git'; type Callback = { resolve: (status: boolean) => void, reject: (err: any) => void }; diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 003a6ba2ea7..12b79a3298d 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -13,7 +13,7 @@ import * as path from 'path'; import * as nls from 'vscode-nls'; import * as fs from 'fs'; import { StatusBarCommands } from './statusbar'; -import { Branch, Ref, Remote, RefType, GitErrorCodes } from './api/git'; +import { Branch, Ref, Remote, RefType, GitErrorCodes, Status } from './api/git'; const timeout = (millis: number) => new Promise(c => setTimeout(c, millis)); @@ -29,27 +29,6 @@ export const enum RepositoryState { Disposed } -export const enum Status { - INDEX_MODIFIED, - INDEX_ADDED, - INDEX_DELETED, - INDEX_RENAMED, - INDEX_COPIED, - - MODIFIED, - DELETED, - UNTRACKED, - IGNORED, - - ADDED_BY_US, - ADDED_BY_THEM, - DELETED_BY_US, - DELETED_BY_THEM, - BOTH_ADDED, - BOTH_DELETED, - BOTH_MODIFIED -} - export const enum ResourceGroupType { Merge, Index, @@ -104,7 +83,7 @@ export class Resource implements SourceControlResourceState { } }; - private getIconPath(theme: string): Uri { + private getIconPath(theme: string): Uri | undefined { switch (this.type) { case Status.INDEX_MODIFIED: return Resource.Icons[theme].Modified; case Status.MODIFIED: return Resource.Icons[theme].Modified; @@ -122,6 +101,7 @@ export class Resource implements SourceControlResourceState { case Status.DELETED_BY_US: return Resource.Icons[theme].Conflict; case Status.BOTH_ADDED: return Resource.Icons[theme].Conflict; case Status.BOTH_MODIFIED: return Resource.Icons[theme].Conflict; + default: return; } } @@ -180,7 +160,7 @@ export class Resource implements SourceControlResourceState { return { strikeThrough, faded, tooltip, light, dark, letter, color, source: 'git.resource' /*todo@joh*/ }; } - get letter(): string { + get letter(): string | undefined { switch (this.type) { case Status.INDEX_MODIFIED: case Status.MODIFIED: @@ -207,10 +187,12 @@ export class Resource implements SourceControlResourceState { case Status.BOTH_ADDED: case Status.BOTH_MODIFIED: return 'C'; + default: + return; } } - get color(): ThemeColor { + get color(): ThemeColor | undefined { switch (this.type) { case Status.INDEX_MODIFIED: case Status.MODIFIED: @@ -234,6 +216,8 @@ export class Resource implements SourceControlResourceState { case Status.BOTH_ADDED: case Status.BOTH_MODIFIED: return new ThemeColor('gitDecoration.conflictingResourceForeground'); + default: + return; } }