mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-09-10 07:36:27 -04:00
Adds a keybinding (default: 'y') in the branches panel to copy the branch's URL on the hosting service to the clipboard. Each supported hosting service has a dedicated URL template: - GitHub: /tree/<branch> - GitLab: /-/tree/<branch> - Bitbucket: /branch/<branch> - Azure DevOps: ?version=GB<branch> - Bitbucket Server: /browse?at=<branch> - Gitea/Codeberg: /src/branch/<branch> Closes #1959
147 lines
5.9 KiB
Go
147 lines
5.9 KiB
Go
package hosting_service
|
|
|
|
import "regexp"
|
|
|
|
// if you want to make a custom regex for a given service feel free to test it out
|
|
// at https://regex101.com using the flavor Golang
|
|
var defaultUrlRegexps = []*regexp.Regexp{
|
|
regexp.MustCompile(`^(?:https?|ssh)://[^/]+/(?P<owner>.*)/(?P<repo>.*?)(?:\.git)?$`),
|
|
regexp.MustCompile(`^(.*?@)?.*:/*(?P<owner>.*)/(?P<repo>.*?)(?:\.git)?$`),
|
|
}
|
|
|
|
var (
|
|
defaultRepoURLTemplate = "https://{{.webDomain}}/{{.owner}}/{{.repo}}"
|
|
defaultRepoNameTemplate = "{{.owner}}/{{.repo}}"
|
|
)
|
|
|
|
// we've got less type safety using go templates but this lends itself better to
|
|
// users adding custom service definitions in their config
|
|
var githubServiceDef = ServiceDefinition{
|
|
provider: "github",
|
|
pullRequestURLIntoDefaultBranch: "/compare/{{.From}}?expand=1",
|
|
pullRequestURLIntoTargetBranch: "/compare/{{.To}}...{{.From}}?expand=1",
|
|
commitURL: "/commit/{{.CommitHash}}",
|
|
branchURL: "/tree/{{.BranchName}}",
|
|
urlRegexps: defaultUrlRegexps,
|
|
repoURLTemplate: defaultRepoURLTemplate,
|
|
repoNameTemplate: defaultRepoNameTemplate,
|
|
}
|
|
|
|
var bitbucketServiceDef = ServiceDefinition{
|
|
provider: "bitbucket",
|
|
pullRequestURLIntoDefaultBranch: "/pull-requests/new?source={{.From}}&t=1",
|
|
pullRequestURLIntoTargetBranch: "/pull-requests/new?source={{.From}}&dest={{.To}}&t=1",
|
|
commitURL: "/commits/{{.CommitHash}}",
|
|
branchURL: "/branch/{{.BranchName}}",
|
|
urlRegexps: []*regexp.Regexp{
|
|
regexp.MustCompile(`^(?:https?|ssh)://.*/(?P<owner>.*)/(?P<repo>.*?)(?:\.git)?$`),
|
|
regexp.MustCompile(`^.*@.*:/*(?P<owner>.*)/(?P<repo>.*?)(?:\.git)?$`),
|
|
},
|
|
repoURLTemplate: defaultRepoURLTemplate,
|
|
repoNameTemplate: defaultRepoNameTemplate,
|
|
}
|
|
|
|
var gitLabServiceDef = ServiceDefinition{
|
|
provider: "gitlab",
|
|
pullRequestURLIntoDefaultBranch: "/-/merge_requests/new?merge_request%5Bsource_branch%5D={{.From}}",
|
|
pullRequestURLIntoTargetBranch: "/-/merge_requests/new?merge_request%5Bsource_branch%5D={{.From}}&merge_request%5Btarget_branch%5D={{.To}}",
|
|
commitURL: "/-/commit/{{.CommitHash}}",
|
|
branchURL: "/-/tree/{{.BranchName}}",
|
|
urlRegexps: defaultUrlRegexps,
|
|
repoURLTemplate: defaultRepoURLTemplate,
|
|
repoNameTemplate: defaultRepoNameTemplate,
|
|
}
|
|
|
|
var azdoServiceDef = ServiceDefinition{
|
|
provider: "azuredevops",
|
|
pullRequestURLIntoDefaultBranch: "/pullrequestcreate?sourceRef={{.From}}",
|
|
pullRequestURLIntoTargetBranch: "/pullrequestcreate?sourceRef={{.From}}&targetRef={{.To}}",
|
|
commitURL: "/commit/{{.CommitHash}}",
|
|
branchURL: "?version=GB{{.BranchName}}",
|
|
urlRegexps: []*regexp.Regexp{
|
|
regexp.MustCompile(`^.+@vs-ssh\.visualstudio\.com[:/](?:v3/)?(?P<org>[^/]+)/(?P<project>[^/]+)/(?P<repo>[^/]+?)(?:\.git)?$`),
|
|
regexp.MustCompile(`^git@ssh.dev.azure.com.*/(?P<org>.*)/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`),
|
|
regexp.MustCompile(`^https://.*@dev.azure.com/(?P<org>.*?)/(?P<project>.*?)/_git/(?P<repo>.*?)(?:\.git)?$`),
|
|
regexp.MustCompile(`^https://.*/(?P<org>.*?)/(?P<project>.*?)/_git/(?P<repo>.*?)(?:\.git)?$`),
|
|
},
|
|
repoURLTemplate: "https://{{.webDomain}}/{{.org}}/{{.project}}/_git/{{.repo}}",
|
|
repoNameTemplate: "{{.org}}/{{.project}}/{{.repo}}",
|
|
}
|
|
|
|
var bitbucketServerServiceDef = ServiceDefinition{
|
|
provider: "bitbucketServer",
|
|
pullRequestURLIntoDefaultBranch: "/pull-requests?create&sourceBranch={{.From}}",
|
|
pullRequestURLIntoTargetBranch: "/pull-requests?create&targetBranch={{.To}}&sourceBranch={{.From}}",
|
|
commitURL: "/commits/{{.CommitHash}}",
|
|
branchURL: "/browse?at={{.BranchName}}",
|
|
urlRegexps: []*regexp.Regexp{
|
|
regexp.MustCompile(`^ssh://git@.*/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`),
|
|
regexp.MustCompile(`^https://.*/scm/(?P<project>.*)/(?P<repo>.*?)(?:\.git)?$`),
|
|
},
|
|
repoURLTemplate: "https://{{.webDomain}}/projects/{{.project}}/repos/{{.repo}}",
|
|
repoNameTemplate: "{{.project}}/{{.repo}}",
|
|
}
|
|
|
|
var giteaServiceDef = ServiceDefinition{
|
|
provider: "gitea",
|
|
pullRequestURLIntoDefaultBranch: "/compare/{{.From}}",
|
|
pullRequestURLIntoTargetBranch: "/compare/{{.To}}...{{.From}}",
|
|
commitURL: "/commit/{{.CommitHash}}",
|
|
branchURL: "/src/branch/{{.BranchName}}",
|
|
urlRegexps: defaultUrlRegexps,
|
|
repoURLTemplate: defaultRepoURLTemplate,
|
|
}
|
|
|
|
var codebergServiceDef = ServiceDefinition{
|
|
provider: "codeberg",
|
|
pullRequestURLIntoDefaultBranch: "/compare/{{.From}}",
|
|
pullRequestURLIntoTargetBranch: "/compare/{{.To}}...{{.From}}",
|
|
commitURL: "/commit/{{.CommitHash}}",
|
|
branchURL: "/src/branch/{{.BranchName}}",
|
|
urlRegexps: defaultUrlRegexps,
|
|
repoURLTemplate: defaultRepoURLTemplate,
|
|
}
|
|
|
|
var serviceDefinitions = []ServiceDefinition{
|
|
githubServiceDef,
|
|
bitbucketServiceDef,
|
|
gitLabServiceDef,
|
|
azdoServiceDef,
|
|
bitbucketServerServiceDef,
|
|
giteaServiceDef,
|
|
codebergServiceDef,
|
|
}
|
|
|
|
var defaultServiceDomains = []ServiceDomain{
|
|
{
|
|
serviceDefinition: githubServiceDef,
|
|
gitDomain: "github.com",
|
|
webDomain: "github.com",
|
|
},
|
|
{
|
|
serviceDefinition: bitbucketServiceDef,
|
|
gitDomain: "bitbucket.org",
|
|
webDomain: "bitbucket.org",
|
|
},
|
|
{
|
|
serviceDefinition: gitLabServiceDef,
|
|
gitDomain: "gitlab.com",
|
|
webDomain: "gitlab.com",
|
|
},
|
|
{
|
|
serviceDefinition: azdoServiceDef,
|
|
gitDomain: "dev.azure.com",
|
|
webDomain: "dev.azure.com",
|
|
},
|
|
{
|
|
serviceDefinition: giteaServiceDef,
|
|
gitDomain: "try.gitea.io",
|
|
webDomain: "try.gitea.io",
|
|
},
|
|
{
|
|
serviceDefinition: codebergServiceDef,
|
|
gitDomain: "codeberg.org",
|
|
webDomain: "codeberg.org",
|
|
},
|
|
}
|