diff --git a/src/annotations/lineAnnotationController.ts b/src/annotations/lineAnnotationController.ts index 8c9e40e..a606c96 100644 --- a/src/annotations/lineAnnotationController.ts +++ b/src/annotations/lineAnnotationController.ts @@ -152,7 +152,7 @@ export class LineAnnotationController implements Disposable { ) { if (lines.length === 0) return undefined; - const remote = await Container.git.getRemoteWithApiProvider(repoPath); + const remote = await Container.git.getRichRemoteProvider(repoPath); if (remote?.provider == null) return undefined; const refs = new Set(); diff --git a/src/avatars.ts b/src/avatars.ts index d34439d..795837c 100644 --- a/src/avatars.ts +++ b/src/avatars.ts @@ -180,11 +180,11 @@ async function getAvatarUriFromRemoteProvider( try { let account; // if (typeof repoPathOrCommit === 'string') { - // const remote = await Container.git.getRemoteWithApiProvider(repoPathOrCommit); + // const remote = await Container.git.getRichRemoteProvider(repoPathOrCommit); // account = await remote?.provider.getAccountForEmail(email, { avatarSize: size }); // } else { if (typeof repoPathOrCommit !== 'string') { - const remote = await Container.git.getRemoteWithApiProvider(repoPathOrCommit.repoPath); + const remote = await Container.git.getRichRemoteProvider(repoPathOrCommit.repoPath); account = await remote?.provider.getAccountForCommit(repoPathOrCommit.ref, { avatarSize: size }); } if (account == null) { diff --git a/src/commands/openPullRequestOnRemote.ts b/src/commands/openPullRequestOnRemote.ts index fa99a3f..a9a22da 100644 --- a/src/commands/openPullRequestOnRemote.ts +++ b/src/commands/openPullRequestOnRemote.ts @@ -50,7 +50,7 @@ export class OpenPullRequestOnRemoteCommand extends Command { if (args?.pr == null) { if (args?.repoPath == null || args?.ref == null) return; - const remote = await Container.git.getRemoteWithApiProvider(args.repoPath); + const remote = await Container.git.getRichRemoteProvider(args.repoPath); if (remote?.provider == null) return; const pr = await Container.git.getPullRequestForCommit(args.ref, remote.provider); diff --git a/src/git/gitService.ts b/src/git/gitService.ts index c79f940..d67bd1e 100644 --- a/src/git/gitService.ts +++ b/src/git/gitService.ts @@ -76,7 +76,7 @@ import { GitUri } from './gitUri'; import { LogCorrelationContext, Logger } from '../logger'; import { Messages } from '../messages'; import { GitReflogParser, GitShortLogParser } from './parsers/parsers'; -import { RemoteProvider, RemoteProviderFactory, RemoteProviders, RemoteProviderWithApi } from './remotes/factory'; +import { RemoteProvider, RemoteProviderFactory, RemoteProviders, RichRemoteProvider } from './remotes/factory'; import { fsExists, isWindows } from './shell'; import { Arrays, @@ -129,7 +129,7 @@ export class GitService implements Disposable { private _repositoriesLoadingPromise: Promise | undefined; private readonly _branchesCache = new Map(); - private readonly _remotesWithApiProviderCache = new Map | null>(); + private readonly _remotesWithApiProviderCache = new Map | null>(); private readonly _tagsCache = new Map(); private readonly _trackedCache = new Map>(); private readonly _userMapCache = new Map(); @@ -2667,18 +2667,18 @@ export class GitService implements Disposable { ): Promise; async getPullRequestForBranch( branch: string, - provider: RemoteProviderWithApi, + provider: RichRemoteProvider, options?: { avatarSize?: number; include?: PullRequestState[]; limit?: number; timeout?: number }, ): Promise; @gate() @debug({ args: { - 1: (remoteOrProvider: GitRemote | RemoteProviderWithApi) => remoteOrProvider.name, + 1: (remoteOrProvider: GitRemote | RichRemoteProvider) => remoteOrProvider.name, }, }) async getPullRequestForBranch( branch: string, - remoteOrProvider: GitRemote | RemoteProviderWithApi, + remoteOrProvider: GitRemote | RichRemoteProvider, { timeout, ...options @@ -2719,18 +2719,18 @@ export class GitService implements Disposable { ): Promise; async getPullRequestForCommit( ref: string, - provider: RemoteProviderWithApi, + provider: RichRemoteProvider, options?: { timeout?: number }, ): Promise; @gate() @debug({ args: { - 1: (remoteOrProvider: GitRemote | RemoteProviderWithApi) => remoteOrProvider.name, + 1: (remoteOrProvider: GitRemote | RichRemoteProvider) => remoteOrProvider.name, }, }) async getPullRequestForCommit( ref: string, - remoteOrProvider: GitRemote | RemoteProviderWithApi, + remoteOrProvider: GitRemote | RichRemoteProvider, { timeout }: { timeout?: number } = {}, ): Promise { if (GitRevision.isUncommitted(ref)) return undefined; @@ -2819,25 +2819,25 @@ export class GitService implements Disposable { }; } - async getRemoteWithApiProvider( + async getRichRemoteProvider( repoPath: string | undefined, options?: { includeDisconnected?: boolean }, - ): Promise | undefined>; - async getRemoteWithApiProvider( + ): Promise | undefined>; + async getRichRemoteProvider( remotes: GitRemote[], options?: { includeDisconnected?: boolean }, - ): Promise | undefined>; - @gate( + ): Promise | undefined>; + @gate( (remotesOrRepoPath, options) => `${typeof remotesOrRepoPath === 'string' ? remotesOrRepoPath : remotesOrRepoPath[0]?.repoPath}:${ options?.includeDisconnected ?? false }`, ) @log({ args: { 0: () => false } }) - async getRemoteWithApiProvider( + async getRichRemoteProvider( remotesOrRepoPath: GitRemote[] | string | undefined, { includeDisconnected }: { includeDisconnected?: boolean } = {}, - ): Promise | undefined> { + ): Promise | undefined> { if (remotesOrRepoPath == null) return undefined; const cacheKey = `${includeDisconnected ? 'disconnected|' : ''}${ @@ -2891,9 +2891,9 @@ export class GitService implements Disposable { } if (cacheKey != null) { - this._remotesWithApiProviderCache.set(cacheKey, remote as GitRemote); + this._remotesWithApiProviderCache.set(cacheKey, remote as GitRemote); } - return remote as GitRemote; + return remote as GitRemote; } @log() diff --git a/src/git/models/commit.ts b/src/git/models/commit.ts index 4fb053f..93f36c8 100644 --- a/src/git/models/commit.ts +++ b/src/git/models/commit.ts @@ -144,7 +144,7 @@ export abstract class GitCommit implements GitRevisionReference { @memoize() async getAssociatedPullRequest(): Promise { - const remote = await Container.git.getRemoteWithApiProvider(this.repoPath); + const remote = await Container.git.getRichRemoteProvider(this.repoPath); if (remote?.provider == null) return undefined; return Container.git.getPullRequestForCommit(this.ref, remote); diff --git a/src/git/models/remote.ts b/src/git/models/remote.ts index f6a0df8..3c27a03 100644 --- a/src/git/models/remote.ts +++ b/src/git/models/remote.ts @@ -1,16 +1,14 @@ 'use strict'; import { WorkspaceState } from '../../constants'; import { Container } from '../../container'; -import { RemoteProvider, RemoteProviderWithApi } from '../remotes/factory'; +import { RemoteProvider, RichRemoteProvider } from '../remotes/factory'; export enum GitRemoteType { Fetch = 'fetch', Push = 'push', } -export class GitRemote< - TProvider extends RemoteProvider | undefined = RemoteProvider | RemoteProviderWithApi | undefined -> { +export class GitRemote { static getHighlanderProviders(remotes: GitRemote[]) { if (remotes.length === 0) return undefined; diff --git a/src/git/models/repository.ts b/src/git/models/repository.ts index 610ac0e..caa344d 100644 --- a/src/git/models/repository.ts +++ b/src/git/models/repository.ts @@ -22,7 +22,7 @@ import { GitUri } from '../gitUri'; import { Logger } from '../../logger'; import { Messages } from '../../messages'; import { GitBranchReference, GitReference, GitTagReference } from './models'; -import { RemoteProviderFactory, RemoteProviders, RemoteProviderWithApi } from '../remotes/factory'; +import { RemoteProviderFactory, RemoteProviders, RichRemoteProvider } from '../remotes/factory'; import { Arrays, debug, Functions, gate, Iterables, log, logName } from '../../system'; import { runGitCommandInTerminal } from '../../terminal'; @@ -463,7 +463,7 @@ export class Repository implements Disposable { this._remotesDisposable = Disposable.from( ...Iterables.filterMap(await remotes, r => { - if (!(r.provider instanceof RemoteProviderWithApi)) return undefined; + if (!RichRemoteProvider.is(r.provider)) return undefined; return r.provider.onDidChange(() => this.fireChange(RepositoryChange.Remotes)); }), @@ -492,7 +492,7 @@ export class Repository implements Disposable { async hasConnectedRemotes(): Promise { const remotes = await this.getRemotes(); - const remote = await Container.git.getRemoteWithApiProvider(remotes); + const remote = await Container.git.getRichRemoteProvider(remotes); return remote?.provider != null; } diff --git a/src/git/remotes/factory.ts b/src/git/remotes/factory.ts index efd5d4d..3fc6332 100644 --- a/src/git/remotes/factory.ts +++ b/src/git/remotes/factory.ts @@ -7,9 +7,9 @@ import { CustomRemote } from './custom'; import { GitHubRemote } from './github'; import { GitLabRemote } from './gitlab'; import { Logger } from '../../logger'; -import { RemoteProvider, RemoteProviderWithApi } from './provider'; +import { RemoteProvider, RichRemoteProvider } from './provider'; -export { RemoteProvider, RemoteProviderWithApi }; +export { RemoteProvider, RichRemoteProvider }; export type RemoteProviders = [string | RegExp, (domain: string, path: string) => RemoteProvider][]; const defaultProviders: RemoteProviders = [ diff --git a/src/git/remotes/github.ts b/src/git/remotes/github.ts index 15967c9..2920c1a 100644 --- a/src/git/remotes/github.ts +++ b/src/git/remotes/github.ts @@ -5,7 +5,7 @@ import { AutolinkReference } from '../../config'; import { Container } from '../../container'; import { GitHubPullRequest } from '../../github/github'; import { Account, GitRevision, IssueOrPullRequest, PullRequest, PullRequestState, Repository } from '../models/models'; -import { RemoteProviderWithApi } from './provider'; +import { RichRemoteProvider } from './provider'; const issueEnricher3rdParyRegex = /\b(\w+\\?-?\w+(?!\\?-)\/\w+\\?-?\w+(?!\\?-))\\?#([0-9]+)\b/g; const fileRegex = /^\/([^/]+)\/([^/]+?)\/blob(.+)$/i; @@ -13,7 +13,7 @@ const rangeRegex = /^L(\d+)(?:-L(\d+))?$/; const authProvider = Object.freeze({ id: 'github', scopes: ['repo'] }); -export class GitHubRemote extends RemoteProviderWithApi { +export class GitHubRemote extends RichRemoteProvider { protected get authProvider() { return authProvider; } diff --git a/src/git/remotes/provider.ts b/src/git/remotes/provider.ts index 0c74903..4a46fba 100644 --- a/src/git/remotes/provider.ts +++ b/src/git/remotes/provider.ts @@ -88,6 +88,7 @@ export function getNameFromRemoteResource(resource: RemoteResource) { } export abstract class RemoteProvider { + readonly type: 'simple' | 'rich' = 'simple'; protected _name: string | undefined; constructor( @@ -135,8 +136,8 @@ export abstract class RemoteProvider { } } - hasApi(): this is RemoteProviderWithApi { - return RemoteProviderWithApi.is(this); + hasApi(): this is RichRemoteProvider { + return RichRemoteProvider.is(this); } abstract getLocalInfoFromRemoteUri( @@ -247,9 +248,11 @@ export class ClientError extends Error { // TODO@eamodio revisit how once authenticated, all remotes are always connected, even after a restart -export abstract class RemoteProviderWithApi extends RemoteProvider { - static is(provider: RemoteProvider | undefined): provider is RemoteProviderWithApi { - return provider instanceof RemoteProviderWithApi; +export abstract class RichRemoteProvider extends RemoteProvider { + readonly type: 'simple' | 'rich' = 'rich'; + + static is(provider: RemoteProvider | undefined): provider is RichRemoteProvider { + return provider?.type === 'rich'; } private readonly _onDidChange = new EventEmitter(); @@ -337,7 +340,7 @@ export abstract class RemoteProviderWithApi extends RemoteProvider { } @gate() - @debug({ + @debug({ exit: connected => `returned ${connected}`, }) async isConnected(): Promise { diff --git a/src/hovers/hovers.ts b/src/hovers/hovers.ts index c695d64..5ae6db7 100644 --- a/src/hovers/hovers.ts +++ b/src/hovers/hovers.ts @@ -243,7 +243,7 @@ export namespace Hovers { return undefined; } - const remote = await Container.git.getRemoteWithApiProvider(remotes); + const remote = await Container.git.getRichRemoteProvider(remotes); if (remote?.provider == null) { Logger.debug(cc, `completed ${GlyphChars.Dot} ${Strings.getDurationMilliseconds(start)} ms`); @@ -322,7 +322,7 @@ export namespace Hovers { return undefined; } - const remote = await Container.git.getRemoteWithApiProvider(remotes, { includeDisconnected: true }); + const remote = await Container.git.getRichRemoteProvider(remotes, { includeDisconnected: true }); if (remote?.provider == null) { Logger.debug(cc, `completed ${GlyphChars.Dot} ${Strings.getDurationMilliseconds(start)} ms`); diff --git a/src/statusbar/statusBarController.ts b/src/statusbar/statusBarController.ts index 909a793..fcb5520 100644 --- a/src/statusbar/statusBarController.ts +++ b/src/statusbar/statusBarController.ts @@ -217,7 +217,7 @@ export class StatusBarController implements Disposable { } private async getPullRequest(commit: GitBlameCommit, { timeout }: { timeout?: number } = {}) { - const remote = await Container.git.getRemoteWithApiProvider(commit.repoPath); + const remote = await Container.git.getRichRemoteProvider(commit.repoPath); if (remote?.provider == null) return undefined; const { provider } = remote;