vanity/flags/flags.go

237 lines
5.4 KiB
Go

package flags
import (
"errors"
"fmt"
"net/url"
"regexp"
"strings"
"time"
"go.jolheiser.com/vanity/api"
"github.com/urfave/cli/v2"
"go.jolheiser.com/beaver"
)
var (
configPath string
baseURL string
include cli.StringSlice
exclude cli.StringSlice
override cli.StringSlice
Port int
Domain string
Service string
BaseURL *url.URL
Namespace string
Token string
Include []*regexp.Regexp
Exclude []*regexp.Regexp
Private bool
Fork bool
Mirror bool
Archive bool
Override = make(map[string]string)
Interval time.Duration
Manual bool
Topics bool
Debug bool
ConfigPackages []*api.Package
)
var Flags = []cli.Flag{
&cli.StringFlag{
Name: "config",
Usage: "Path to a config file",
EnvVars: []string{"VANITY_CONFIG"},
Destination: &configPath,
},
&cli.IntFlag{
Name: "port",
Usage: "Port to run the vanity server on",
Value: 7777,
EnvVars: []string{"VANITY_PORT"},
Destination: &Port,
},
&cli.StringFlag{
Name: "domain",
Usage: "Vanity domain, e.g. go.domain.tld",
EnvVars: []string{"VANITY_DOMAIN"},
Required: true,
Destination: &Domain,
},
&cli.StringFlag{
Name: "service",
Usage: "Service type (Gitea, GitHub, GitLab)",
Value: "gitea",
EnvVars: []string{"VANITY_SERVICE"},
Destination: &Service,
},
&cli.StringFlag{
Name: "base-url",
Usage: "Base URL to service",
EnvVars: []string{"VANITY_BASE_URL"},
Destination: &baseURL,
},
&cli.StringFlag{
Name: "namespace",
Usage: "Owner namespace",
EnvVars: []string{"VANITY_NAMESPACE"},
Destination: &Namespace,
},
&cli.StringFlag{
Name: "token",
Usage: "Access token",
EnvVars: []string{"VANITY_TOKEN"},
Destination: &Token,
},
&cli.StringSliceFlag{
Name: "include",
Usage: "Repository names to include (regex)",
EnvVars: []string{"VANITY_INCLUDE"},
Destination: &include,
},
&cli.StringSliceFlag{
Name: "exclude",
Usage: "Repository names to exclude (regex)",
EnvVars: []string{"VANITY_EXCLUDE"},
Destination: &exclude,
},
&cli.BoolFlag{
Name: "private",
Usage: "Include private repositories",
EnvVars: []string{"VANITY_PRIVATE"},
Destination: &Private,
},
&cli.BoolFlag{
Name: "fork",
Usage: "Include forked repositories",
EnvVars: []string{"VANITY_FORK"},
Destination: &Fork,
},
&cli.BoolFlag{
Name: "mirror",
Usage: "Include mirrored repositories",
EnvVars: []string{"VANITY_MIRROR"},
Destination: &Mirror,
},
&cli.BoolFlag{
Name: "archive",
Usage: "Include archived repositories",
EnvVars: []string{"VANITY_ARCHIVE"},
Destination: &Archive,
},
&cli.StringSliceFlag{
Name: "override",
Usage: "Repository name to override (NAME=OVERRIDE)",
EnvVars: []string{"VANITY_OVERRIDE"},
Destination: &override,
},
&cli.DurationFlag{
Name: "interval",
Usage: "Interval between updating repositories",
Value: time.Minute * 15,
EnvVars: []string{"VANITY_INTERVAL"},
Destination: &Interval,
},
&cli.BoolFlag{
Name: "manual",
Usage: "Disable cron and only update with endpoint",
EnvVars: []string{"VANITY_MANUAL"},
Destination: &Manual,
},
&cli.BoolFlag{
Name: "topics",
Usage: "Group projects by topic by default",
EnvVars: []string{"VANITY_TOPICS"},
Destination: &Topics,
},
&cli.BoolFlag{
Name: "debug",
Usage: "Debug logging",
EnvVars: []string{"VANITY_DEBUG"},
Destination: &Debug,
},
}
func Before(ctx *cli.Context) error {
setConfig(ctx)
var defaultURL string
var configOnly bool
switch strings.ToLower(Service) {
case "gitea":
defaultURL = "https://gitea.com"
case "github":
defaultURL = "https://github.com"
case "gitlab":
defaultURL = "https://gitlab.com"
case "off":
configOnly = true
beaver.Infof("Running in config-only mode")
defaultURL = "https://domain.tld"
default:
return errors.New("unrecognized service type")
}
if baseURL == "" {
baseURL = defaultURL
}
var err error
BaseURL, err = url.Parse(baseURL)
if err != nil {
return err
}
if !configOnly {
errs := make([]string, 0, 2)
if Namespace == "" {
errs = append(errs, "namespace")
}
if Token == "" {
errs = append(errs, "token")
}
if len(errs) > 0 {
return fmt.Errorf("%s is required with a service", strings.Join(errs, ", "))
}
}
Include = make([]*regexp.Regexp, len(include.Value()))
for idx, i := range include.Value() {
Include[idx] = regexp.MustCompile(i)
}
Exclude = make([]*regexp.Regexp, len(exclude.Value()))
for idx, e := range exclude.Value() {
Exclude[idx] = regexp.MustCompile(e)
}
if Manual {
beaver.Info("Running in manual mode")
}
if Debug {
beaver.Console.Level = beaver.DEBUG
}
beaver.Debugf("Port: %d", Port)
beaver.Debugf("Domain: %s", Domain)
beaver.Debugf("Service: %s", Service)
beaver.Debugf("Base URL: %s", baseURL)
beaver.Debugf("Namespace: %s", Namespace)
beaver.Debugf("Include: %s", include.Value())
beaver.Debugf("Exclude: %s", exclude.Value())
beaver.Debugf("Private: %t", Private)
beaver.Debugf("Fork: %t", Fork)
beaver.Debugf("Mirror: %t", Mirror)
beaver.Debugf("Archive: %t", Archive)
beaver.Debugf("Override: %s", override.Value())
beaver.Debugf("Interval: %s", Interval)
beaver.Debugf("Manual: %t", Manual)
return nil
}