1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-01-10 03:47:03 +02:00
goreleaser/internal/git/config.go

53 lines
1.4 KiB
Go
Raw Normal View History

package git
import (
"errors"
"fmt"
"net/url"
"strings"
2017-03-23 02:01:29 +02:00
"github.com/goreleaser/goreleaser/pkg/config"
)
// ExtractRepoFromConfig gets the repo name from the Git config.
func ExtractRepoFromConfig() (result config.Repo, err error) {
if !IsRepo() {
return result, errors.New("current folder is not a git repository")
}
out, err := Run("config", "--get", "remote.origin.url")
if err != nil {
return result, fmt.Errorf("repository doesn't have an `origin` remote")
}
return ExtractRepoFromURL(out)
}
func ExtractRepoFromURL(rawurl string) (config.Repo, error) {
// removes the .git suffix and any new lines
s := strings.TrimSuffix(strings.TrimSpace(rawurl), ".git")
// if the URL contains a :, indicating a SSH config,
// remove all chars until it, including itself
// on HTTP and HTTPS URLs it will remove the http(s): prefix,
// which is ok. On SSH URLs the whole user@server will be removed,
// which is required.
s = s[strings.LastIndex(s, ":")+1:]
// now we can parse it with net/url
u, err := url.Parse(s)
if err != nil {
return config.Repo{}, err
}
// split the parsed url path by /, the last two parts should be the owner and name
ss := strings.Split(strings.TrimPrefix(u.Path, "/"), "/")
// if less than 2 parts, its likely not a valid repository
if len(ss) < 2 {
return config.Repo{}, fmt.Errorf("unsupported repository URL: %s", rawurl)
}
2017-03-23 02:01:29 +02:00
return config.Repo{
Owner: ss[len(ss)-2],
Name: ss[len(ss)-1],
}, nil
}