diff --git a/src/git/remotes/bitbucket.ts b/src/git/remotes/bitbucket.ts new file mode 100644 index 0000000..b880ba2 --- /dev/null +++ b/src/git/remotes/bitbucket.ts @@ -0,0 +1,27 @@ +'use strict'; +import { RemoteProvider } from './provider'; + +export class BitbucketService extends RemoteProvider { + + constructor(public domain: string, public path: string) { + super(domain, path); + } + + get name() { + return 'Bitbucket'; + } + + protected getUrlForBranch(branch: string): string { + return `${this.baseUrl}/commits/branch/${branch}`; + } + + protected getUrlForCommit(sha: string): string { + return `${this.baseUrl}/commits/${sha}`; + } + + protected getUrlForFile(fileName: string, branch?: string, sha?: string): string { + if (sha) return `${this.baseUrl}/src/${sha}/${fileName}`; + if (branch) return `${this.baseUrl}/src/${branch}/${fileName}`; + return `${this.baseUrl}?path=${fileName}`; + } +} \ No newline at end of file diff --git a/src/git/remotes/factory.ts b/src/git/remotes/factory.ts index 818269d..0f2ef36 100644 --- a/src/git/remotes/factory.ts +++ b/src/git/remotes/factory.ts @@ -1,12 +1,18 @@ 'use strict'; import { RemoteProvider } from './provider'; +import { BitbucketService } from './bitbucket'; import { GitHubService } from './github'; +import { GitLabService } from './gitlab'; +import { VisualStudioService } from './visualStudio'; import { Logger } from '../../logger'; export { RemoteProvider }; const providerMap = new Map RemoteProvider>([ - ['github.com', (domain: string, path: string) => new GitHubService(domain, path)] + ['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)] ]); const UrlRegex = /^(?:git:\/\/(.*?)\/|https:\/\/(.*?)\/|http:\/\/(.*?)\/|git@(.*):\/\/|ssh:\/\/git@(.*?)\/)(.*)$/; @@ -19,7 +25,11 @@ export class RemoteProviderFactory { const domain = match[1] || match[2] || match[3] || match[4] || match[5]; const path = match[6].replace(/\.git/, ''); - const creator = providerMap.get(domain); + const key = domain.toLowerCase().endsWith('visualstudio.com') + ? 'visualstudio.com' + : domain; + + const creator = providerMap.get(key.toLowerCase()); if (!creator) return undefined; return creator(domain, path); diff --git a/src/git/remotes/github.ts b/src/git/remotes/github.ts index 4f73eb3..6c7e99b 100644 --- a/src/git/remotes/github.ts +++ b/src/git/remotes/github.ts @@ -12,7 +12,7 @@ export class GitHubService extends RemoteProvider { } protected getUrlForBranch(branch: string): string { - return `${this.baseUrl}/tree/${branch}`; + return `${this.baseUrl}/commits/${branch}`; } protected getUrlForCommit(sha: string): string { diff --git a/src/git/remotes/gitlab.ts b/src/git/remotes/gitlab.ts new file mode 100644 index 0000000..dc8d5ab --- /dev/null +++ b/src/git/remotes/gitlab.ts @@ -0,0 +1,13 @@ +'use strict'; +import { GitHubService } from './github'; + +export class GitLabService extends GitHubService { + + constructor(public domain: string, public path: string) { + super(domain, path); + } + + get name() { + return 'GitLab'; + } +} \ No newline at end of file diff --git a/src/git/remotes/visualStudio.ts b/src/git/remotes/visualStudio.ts new file mode 100644 index 0000000..baecbbb --- /dev/null +++ b/src/git/remotes/visualStudio.ts @@ -0,0 +1,27 @@ +'use strict'; +import { RemoteProvider } from './provider'; + +export class VisualStudioService extends RemoteProvider { + + constructor(public domain: string, public path: string) { + super(domain, path); + } + + get name() { + return 'Visual Studio Team Services'; + } + + protected getUrlForBranch(branch: string): string { + return `${this.baseUrl}/?version=GB${branch}&_a=history`; + } + + protected getUrlForCommit(sha: string): string { + return `${this.baseUrl}/commit/${sha}`; + } + + protected getUrlForFile(fileName: string, branch?: string, sha?: string): string { + if (sha) return `${this.baseUrl}/commit/${sha}/?_a=contents&path=%2F${fileName}`; + if (branch) return `${this.baseUrl}/?path=%2F${fileName}&version=GB${branch}&_a=contents`; + return `${this.baseUrl}?path=%2F${fileName}`; + } +} \ No newline at end of file