tarakan-client/cmd/tarakan/register.go
Maxfield Luke 58b29a7f84
Some checks failed
CI and releases / Test and vet (push) Failing after 1s
CI and releases / Build release binaries (push) Has been skipped
CI and releases / Publish GitHub release (push) Has been skipped
Initial commit on Forgejo
Fresh repository history for elektrine/tarakan-client hosted at
https://git.elektrine.com/elektrine/tarakan-client.
2026-07-29 04:56:36 -04:00

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
}