gickup/whatever/whatever.go
Andreas Wachter 3d125133ef
implement filters for github (#137)
* implement filters for github

* add filter to exclude archived repositories

* add filter for gitea/forgejo

* gogs filter option

* fix error log

* include gitlab filters

* fix logging

* parse duration

* filters for onedev and sourcehut

* adapted conf.example.yml
2023-02-20 16:05:01 +01:00

106 lines
2.5 KiB
Go

package whatever
import (
"os"
"path"
"strings"
"github.com/cooperspencer/gickup/types"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/config"
"github.com/go-git/go-git/v5/plumbing/transport"
"github.com/go-git/go-git/v5/plumbing/transport/http"
"github.com/go-git/go-git/v5/plumbing/transport/ssh"
"github.com/rs/zerolog/log"
)
// Get TODO.
func Get(conf *types.Conf) ([]types.Repo, bool) {
ran := false
repos := []types.Repo{}
if len(conf.Source.Any) > 0 {
ran = true
log.Info().
Str("stage", "whatever").
Msgf("adding repos")
for _, repo := range conf.Source.Any {
if repo.URL == "" {
log.Error().
Str("stage", "whatever").
Msg("no url configured")
}
var auth transport.AuthMethod
hoster := "local"
if _, err := os.Stat(repo.URL); os.IsNotExist(err) {
hoster = types.GetHost(repo.URL)
if strings.HasPrefix(repo.URL, "http://") || strings.HasPrefix(repo.URL, "https://") {
if repo.Token != "" {
auth = &http.BasicAuth{
Username: "xyz",
Password: repo.Token,
}
} else if repo.Username != "" && repo.Password != "" {
auth = &http.BasicAuth{
Username: repo.Username,
Password: repo.Password,
}
}
} else {
var err error
if repo.SSHKey == "" {
home := os.Getenv("HOME")
repo.SSHKey = path.Join(home, ".ssh", "id_rsa")
}
auth, err = ssh.NewPublicKeysFromFile("git", repo.SSHKey, "")
if err != nil {
log.Error().
Str("stage", "whatever").
Msg(err.Error())
continue
}
}
}
rem := git.NewRemote(nil, &config.RemoteConfig{Name: "origin", URLs: []string{repo.URL}})
data, err := rem.List(&git.ListOptions{Auth: auth})
if err != nil {
log.Error().
Str("stage", "whatever").
Msg(err.Error())
continue
}
main := ""
for _, d := range data {
if d.Hash().IsZero() {
main = d.Target().Short()
break
}
}
separator := "/"
if hoster == "local" {
separator = string(os.PathSeparator)
}
name := repo.URL[strings.LastIndex(repo.URL, separator)+1:]
if strings.HasSuffix(name, ".git") {
name = name[:strings.LastIndex(name, ".git")]
}
repos = append(repos, types.Repo{
Name: name,
URL: repo.URL,
SSHURL: repo.URL,
Token: repo.GetToken(),
Defaultbranch: main,
Origin: repo,
Owner: "git",
Hoster: hoster,
})
}
}
return repos, ran
}