mirror of
https://gitea.com/gitea/tea.git
synced 2026-02-22 06:13:32 +01:00
Reviewed-on: https://gitea.com/gitea/tea/pulls/873 Co-authored-by: techknowlogick <techknowlogick@gitea.com> Co-committed-by: techknowlogick <techknowlogick@gitea.com>
59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package context
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"code.gitea.io/tea/modules/config"
|
|
"code.gitea.io/tea/modules/debug"
|
|
"code.gitea.io/tea/modules/git"
|
|
)
|
|
|
|
// MatchLogins matches the given remoteURL against the provided logins and returns
|
|
// the first matching login
|
|
// remoteURL could be like:
|
|
//
|
|
// https://gitea.com/owner/repo.git
|
|
// http://gitea.com/owner/repo.git
|
|
// ssh://gitea.com/owner/repo.git
|
|
// git@gitea.com:owner/repo.git
|
|
func MatchLogins(remoteURL string, logins []config.Login) (*config.Login, string, error) {
|
|
for _, l := range logins {
|
|
debug.Printf("Matching remote URL '%s' against %v login", remoteURL, l)
|
|
sshHost := l.GetSSHHost()
|
|
atIdx := strings.Index(remoteURL, "@")
|
|
colonIdx := strings.Index(remoteURL, ":")
|
|
if atIdx > 0 && colonIdx > atIdx {
|
|
domain := remoteURL[atIdx+1 : colonIdx]
|
|
if domain == sshHost {
|
|
return &l, strings.TrimSuffix(remoteURL[colonIdx+1:], ".git"), nil
|
|
}
|
|
} else {
|
|
p, err := git.ParseURL(remoteURL)
|
|
if err != nil {
|
|
return nil, "", fmt.Errorf("git remote URL parse failed: %s", err.Error())
|
|
}
|
|
|
|
switch {
|
|
case strings.EqualFold(p.Scheme, "http") || strings.EqualFold(p.Scheme, "https"):
|
|
if strings.HasPrefix(remoteURL, l.URL) {
|
|
ps := strings.Split(p.Path, "/")
|
|
path := strings.Join(ps[len(ps)-2:], "/")
|
|
return &l, strings.TrimSuffix(path, ".git"), nil
|
|
}
|
|
case strings.EqualFold(p.Scheme, "ssh"):
|
|
if sshHost == p.Host || sshHost == p.Hostname() {
|
|
return &l, strings.TrimLeft(p.Path, "/"), nil
|
|
}
|
|
default:
|
|
// unknown scheme
|
|
return nil, "", fmt.Errorf("git remote URL parse failed: %s", "unknown scheme "+p.Scheme)
|
|
}
|
|
}
|
|
}
|
|
return nil, "", errNotAGiteaRepo
|
|
}
|