'use strict'; import { Objects } from '../../system'; import { Event, EventEmitter, ExtensionContext, workspace } from 'vscode'; import { BitbucketService } from './bitbucket'; import { BitbucketServerService } from './bitbucket-server'; import { CustomRemoteType, IConfig, IRemotesConfig } from '../../configuration'; import { ExtensionKey } from '../../constants'; import { GitHubService } from './github'; import { GitLabService } from './gitlab'; import { Logger } from '../../logger'; import { RemoteProvider } from './provider'; import { VisualStudioService } from './visualStudio'; export { RemoteProvider }; const defaultProviderMap = new Map RemoteProvider>([ ['bitbucket.org', (domain: string, path: string) => new BitbucketService(domain, path)], ['github.com', (domain: string, path: string) => new GitHubService(domain, path)], ['gitlab.com', (domain: string, path: string) => new GitLabService(domain, path)], ['visualstudio.com', (domain: string, path: string) => new VisualStudioService(domain, path)] ]); export class RemoteProviderFactory { private static _providerMap: Map RemoteProvider>; private static _remotesCfg: IRemotesConfig[]; private static _onDidChange = new EventEmitter(); public static get onDidChange(): Event { return this._onDidChange.event; } static configure(context: ExtensionContext) { context.subscriptions.push(workspace.onDidChangeConfiguration(() => this.onConfigurationChanged())); this.onConfigurationChanged(true); } static getRemoteProvider(domain: string, path: string): RemoteProvider | undefined { try { let key = domain.toLowerCase(); if (key.endsWith('visualstudio.com')) { key = 'visualstudio.com'; } const creator = this._providerMap.get(key); if (creator === undefined) return undefined; return creator(domain, path); } catch (ex) { Logger.error(ex, 'RemoteProviderFactory'); return undefined; } } private static onConfigurationChanged(silent: boolean = false) { const cfg = workspace.getConfiguration().get(ExtensionKey); if (cfg === undefined) return; if (!Objects.areEquivalent(cfg.remotes, this._remotesCfg)) { this._providerMap = new Map(defaultProviderMap); this._remotesCfg = cfg.remotes; if (this._remotesCfg != null && this._remotesCfg.length > 0) { for (const svc of this._remotesCfg) { const provider = this.getCustomProvider(svc.type); if (provider === undefined) continue; this._providerMap.set(svc.domain.toLowerCase(), provider); } if (!silent) { this._onDidChange.fire(); } } } } private static getCustomProvider(type: CustomRemoteType) { switch (type) { case CustomRemoteType.Bitbucket: return (domain: string, path: string) => new BitbucketService(domain, path, true); case CustomRemoteType.BitbucketServer: return (domain: string, path: string) => new BitbucketServerService(domain, path, true); case CustomRemoteType.GitHub: return (domain: string, path: string) => new GitHubService(domain, path, true); case CustomRemoteType.GitLab: return (domain: string, path: string) => new GitLabService(domain, path, true); } return undefined; } }