Fresh repository history for elektrine/tarakan-client hosted at https://git.elektrine.com/elektrine/tarakan-client.
94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/atomine-elektrine/tarakan-client/internal/api"
|
|
)
|
|
|
|
func runRegister(ctx context.Context, arguments []string, stdout, stderr io.Writer, cfg api.Config) int {
|
|
flags := flag.NewFlagSet("register", flag.ContinueOnError)
|
|
flags.SetOutput(stderr)
|
|
var fromFile string
|
|
var sleepMS int
|
|
var urlFlag, hostFlag, tokenFlag string
|
|
flags.StringVar(&fromFile, "file", "", "register every owner/name line in this file")
|
|
flags.IntVar(&sleepMS, "sleep-ms", 250, "delay between registrations (rate-limit friendly)")
|
|
addAPIFlags(flags, &urlFlag, &hostFlag, &tokenFlag)
|
|
flags.Usage = func() {
|
|
fmt.Fprintln(stderr, "Usage: tarakan register owner/name [owner/name ...]")
|
|
fmt.Fprintln(stderr, " tarakan register --file repos.txt")
|
|
fmt.Fprintln(stderr, "Register public GitHub repositories with Tarakan (idempotent).")
|
|
flags.PrintDefaults()
|
|
}
|
|
if err := flags.Parse(arguments); err != nil {
|
|
return 2
|
|
}
|
|
var err error
|
|
cfg, err = mergeFlagConfig(cfg, urlFlag, hostFlag, tokenFlag)
|
|
if err != nil {
|
|
fmt.Fprintln(stderr, err)
|
|
return 2
|
|
}
|
|
|
|
targets := flags.Args()
|
|
if fromFile != "" {
|
|
raw, readErr := os.ReadFile(fromFile)
|
|
if readErr != nil {
|
|
fmt.Fprintf(stderr, "read %s: %v\n", fromFile, readErr)
|
|
return 1
|
|
}
|
|
for _, line := range strings.Split(string(raw), "\n") {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" || strings.HasPrefix(line, "#") {
|
|
continue
|
|
}
|
|
targets = append(targets, line)
|
|
}
|
|
}
|
|
if len(targets) == 0 {
|
|
flags.Usage()
|
|
return 2
|
|
}
|
|
|
|
client, err := cfg.Client()
|
|
if err != nil {
|
|
fmt.Fprintln(stderr, err)
|
|
return 1
|
|
}
|
|
|
|
ok, fail := 0, 0
|
|
for i, target := range targets {
|
|
if i > 0 && sleepMS > 0 {
|
|
select {
|
|
case <-ctx.Done():
|
|
fmt.Fprintln(stderr, ctx.Err())
|
|
return 1
|
|
case <-time.After(time.Duration(sleepMS) * time.Millisecond):
|
|
}
|
|
}
|
|
repo, regErr := client.RegisterRepository(ctx, target)
|
|
if regErr != nil {
|
|
fail++
|
|
fmt.Fprintf(stderr, "err %s → %v\n", target, regErr)
|
|
continue
|
|
}
|
|
ok++
|
|
slug := repo.Slug()
|
|
if slug == "" {
|
|
slug = target
|
|
}
|
|
fmt.Fprintf(stdout, "ok %s status=%s %s\n", slug, repo.Status, repo.RecordURL)
|
|
}
|
|
fmt.Fprintf(stderr, "done: %d registered, %d failed\n", ok, fail)
|
|
if fail > 0 {
|
|
return 1
|
|
}
|
|
return 0
|
|
}
|