Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
364 changes: 364 additions & 0 deletions git.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,364 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { Uri, Event, Disposable, ProviderResult, Command } from 'vscode'
export { ProviderResult } from 'vscode'

export interface Git {
readonly path: string
}

export interface InputBox {
value: string
}

export const enum ForcePushMode {
Force,
ForceWithLease,
}

export const enum RefType {
Head,
RemoteHead,
Tag,
}

export interface Ref {
readonly type: RefType
readonly name?: string
readonly commit?: string
readonly remote?: string
}

export interface UpstreamRef {
readonly remote: string
readonly name: string
}

export interface Branch extends Ref {
readonly upstream?: UpstreamRef
readonly ahead?: number
readonly behind?: number
}

export interface Commit {
readonly hash: string
readonly message: string
readonly parents: string[]
readonly authorDate?: Date
readonly authorName?: string
readonly authorEmail?: string
readonly commitDate?: Date
}

export interface Submodule {
readonly name: string
readonly path: string
readonly url: string
}

export interface Remote {
readonly name: string
readonly fetchUrl?: string
readonly pushUrl?: string
readonly isReadOnly: boolean
}

export const enum Status {
INDEX_MODIFIED,
INDEX_ADDED,
INDEX_DELETED,
INDEX_RENAMED,
INDEX_COPIED,

MODIFIED,
DELETED,
UNTRACKED,
IGNORED,
INTENT_TO_ADD,

ADDED_BY_US,
ADDED_BY_THEM,
DELETED_BY_US,
DELETED_BY_THEM,
BOTH_ADDED,
BOTH_DELETED,
BOTH_MODIFIED,
}

export interface Change {
/**
* Returns either `originalUri` or `renameUri`, depending
* on whether this change is a rename change. When
* in doubt always use `uri` over the other two alternatives.
*/
readonly uri: Uri
readonly originalUri: Uri
readonly renameUri: Uri | undefined
readonly status: Status
}

export interface RepositoryState {
readonly HEAD: Branch | undefined
readonly refs: Ref[]
readonly remotes: Remote[]
readonly submodules: Submodule[]
readonly rebaseCommit: Commit | undefined

readonly mergeChanges: Change[]
readonly indexChanges: Change[]
readonly workingTreeChanges: Change[]

readonly onDidChange: Event<void>
}

export interface RepositoryUIState {
readonly selected: boolean
readonly onDidChange: Event<void>
}

/**
* Log options.
*/
export interface LogOptions {
/** Max number of log entries to retrieve. If not specified, the default is 32. */
readonly maxEntries?: number
readonly path?: string
}

export interface CommitOptions {
all?: boolean | 'tracked'
amend?: boolean
signoff?: boolean
signCommit?: boolean
empty?: boolean
noVerify?: boolean
requireUserConfig?: boolean
useEditor?: boolean
verbose?: boolean
postCommitCommand?: string
}

export interface FetchOptions {
remote?: string
ref?: string
all?: boolean
prune?: boolean
depth?: number
}

export interface BranchQuery {
readonly remote?: boolean
readonly pattern?: string
readonly count?: number
readonly contains?: string
}

export interface Repository {
readonly rootUri: Uri
readonly inputBox: InputBox
readonly state: RepositoryState
readonly ui: RepositoryUIState

getConfigs(): Promise<{ key: string; value: string }[]>
getConfig(key: string): Promise<string>
setConfig(key: string, value: string): Promise<string>
getGlobalConfig(key: string): Promise<string>

getObjectDetails(
treeish: string,
path: string
): Promise<{ mode: string; object: string; size: number }>
detectObjectType(
object: string
): Promise<{ mimetype: string; encoding?: string }>
buffer(ref: string, path: string): Promise<Buffer>
show(ref: string, path: string): Promise<string>
getCommit(ref: string): Promise<Commit>

add(paths: string[]): Promise<void>
revert(paths: string[]): Promise<void>
clean(paths: string[]): Promise<void>

apply(patch: string, reverse?: boolean): Promise<void>
diff(cached?: boolean): Promise<string>
diffWithHEAD(): Promise<Change[]>
diffWithHEAD(path: string): Promise<string>
diffWith(ref: string): Promise<Change[]>
diffWith(ref: string, path: string): Promise<string>
diffIndexWithHEAD(): Promise<Change[]>
diffIndexWithHEAD(path: string): Promise<string>
diffIndexWith(ref: string): Promise<Change[]>
diffIndexWith(ref: string, path: string): Promise<string>
diffBlobs(object1: string, object2: string): Promise<string>
diffBetween(ref1: string, ref2: string): Promise<Change[]>
diffBetween(ref1: string, ref2: string, path: string): Promise<string>

hashObject(data: string): Promise<string>

createBranch(name: string, checkout: boolean, ref?: string): Promise<void>
deleteBranch(name: string, force?: boolean): Promise<void>
getBranch(name: string): Promise<Branch>
getBranches(query: BranchQuery): Promise<Ref[]>
setBranchUpstream(name: string, upstream: string): Promise<void>

getMergeBase(ref1: string, ref2: string): Promise<string>

tag(name: string, upstream: string): Promise<void>
deleteTag(name: string): Promise<void>

status(): Promise<void>
checkout(treeish: string): Promise<void>

addRemote(name: string, url: string): Promise<void>
removeRemote(name: string): Promise<void>
renameRemote(name: string, newName: string): Promise<void>

fetch(options?: FetchOptions): Promise<void>
fetch(remote?: string, ref?: string, depth?: number): Promise<void>
pull(unshallow?: boolean): Promise<void>
push(
remoteName?: string,
branchName?: string,
setUpstream?: boolean,
force?: ForcePushMode
): Promise<void>

blame(path: string): Promise<string>
log(options?: LogOptions): Promise<Commit[]>

commit(message: string, opts?: CommitOptions): Promise<void>
}

export interface RemoteSource {
readonly name: string
readonly description?: string
readonly url: string | string[]
}

export interface RemoteSourceProvider {
readonly name: string
readonly icon?: string // codicon name
readonly supportsQuery?: boolean
getRemoteSources(query?: string): ProviderResult<RemoteSource[]>
getBranches?(url: string): ProviderResult<string[]>
publishRepository?(repository: Repository): Promise<void>
}

export interface RemoteSourcePublisher {
readonly name: string
readonly icon?: string // codicon name
publishRepository(repository: Repository): Promise<void>
}

export interface Credentials {
readonly username: string
readonly password: string
}

export interface CredentialsProvider {
getCredentials(host: Uri): ProviderResult<Credentials>
}

export type CommitCommand = Command & { description?: string }

export interface PostCommitCommandsProvider {
getCommands(repository: Repository): CommitCommand[]
}

export interface PushErrorHandler {
handlePushError(
repository: Repository,
remote: Remote,
refspec: string,
error: Error & { gitErrorCode: GitErrorCodes }
): Promise<boolean>
}

export type APIState = 'uninitialized' | 'initialized'

export interface PublishEvent {
repository: Repository
branch?: string
}

export interface API {
readonly state: APIState
readonly onDidChangeState: Event<APIState>
readonly onDidPublish: Event<PublishEvent>
readonly git: Git
readonly repositories: Repository[]
readonly onDidOpenRepository: Event<Repository>
readonly onDidCloseRepository: Event<Repository>

toGitUri(uri: Uri, ref: string): Uri
getRepository(uri: Uri): Repository | null
init(root: Uri): Promise<Repository | null>
openRepository(root: Uri): Promise<Repository | null>

registerRemoteSourcePublisher(publisher: RemoteSourcePublisher): Disposable
registerRemoteSourceProvider(provider: RemoteSourceProvider): Disposable
registerCredentialsProvider(provider: CredentialsProvider): Disposable
registerPostCommitCommandsProvider(
provider: PostCommitCommandsProvider
): Disposable
registerPushErrorHandler(handler: PushErrorHandler): Disposable
}

export interface GitExtension {
readonly enabled: boolean
readonly onDidChangeEnablement: Event<boolean>

/**
* Returns a specific API version.
*
* Throws error if git extension is disabled. You can listen to the
* [GitExtension.onDidChangeEnablement](#GitExtension.onDidChangeEnablement) event
* to know when the extension becomes enabled/disabled.
*
* @param version Version number.
* @returns API instance
*/
getAPI(version: 1): API
}

export const enum GitErrorCodes {
BadConfigFile = 'BadConfigFile',
AuthenticationFailed = 'AuthenticationFailed',
NoUserNameConfigured = 'NoUserNameConfigured',
NoUserEmailConfigured = 'NoUserEmailConfigured',
NoRemoteRepositorySpecified = 'NoRemoteRepositorySpecified',
NotAGitRepository = 'NotAGitRepository',
NotAtRepositoryRoot = 'NotAtRepositoryRoot',
Conflict = 'Conflict',
StashConflict = 'StashConflict',
UnmergedChanges = 'UnmergedChanges',
PushRejected = 'PushRejected',
RemoteConnectionError = 'RemoteConnectionError',
DirtyWorkTree = 'DirtyWorkTree',
CantOpenResource = 'CantOpenResource',
GitNotFound = 'GitNotFound',
CantCreatePipe = 'CantCreatePipe',
PermissionDenied = 'PermissionDenied',
CantAccessRemote = 'CantAccessRemote',
RepositoryNotFound = 'RepositoryNotFound',
RepositoryIsLocked = 'RepositoryIsLocked',
BranchNotFullyMerged = 'BranchNotFullyMerged',
NoRemoteReference = 'NoRemoteReference',
InvalidBranchName = 'InvalidBranchName',
BranchAlreadyExists = 'BranchAlreadyExists',
NoLocalChanges = 'NoLocalChanges',
NoStashFound = 'NoStashFound',
LocalChangesOverwritten = 'LocalChangesOverwritten',
NoUpstreamBranch = 'NoUpstreamBranch',
IsInSubmodule = 'IsInSubmodule',
WrongCase = 'WrongCase',
CantLockRef = 'CantLockRef',
CantRebaseMultipleBranches = 'CantRebaseMultipleBranches',
PatchDoesNotApply = 'PatchDoesNotApply',
NoPathFound = 'NoPathFound',
UnknownPath = 'UnknownPath',
EmptyCommitMessage = 'EmptyCommitMessage',
}
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
"@babel/plugin-transform-runtime"
]
},
"extensionDependencies": [
"vscode.git"
],
Comment on lines +37 to +39
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While this isn't strictly necessary, I like calling out explicitly that we're using the native Git extension.

"main": "./out/extension.js",
"contributes": {
"customEditors": [
Expand Down
6 changes: 1 addition & 5 deletions src/flatConfigEditor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -422,12 +422,8 @@ export class FlatConfigEditor implements vscode.CustomTextEditorProvider {
return new Promise(async (resolve, reject) => {
try {
const gitClient = new VSCodeGit()
await gitClient.activateExtension()
await gitClient.waitForRepo(3)

// Next, let's grab the repo name.
await gitClient.waitForRepo()
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We only ever call waitForRepo here... As such, I removed the "# of times" argument from the function and co-located it in the function implementation itself.

const { name, owner } = gitClient.repoDetails

resolve({ name, owner })
} catch (e) {
reject('Couldnt activate git')
Expand Down
Loading