Files
lazysecrets/cmd/lazysecrets/update.go
T
keb 89d49ed1fe
CI / Checks (pull_request) Successful in 41s
PR title / Conventional title (pull_request) Successful in 1s
fix: unambiguous repo key names, clearer config and key names, and a newer lazysecrets's files no longer stop an older one
2026-10-13 22:42:15 +02:00

81 lines
2.2 KiB
Go

package main
import (
"context"
"errors"
"fmt"
"strings"
"time"
"git.kebcloud.no/keb/lazysecrets/internal/config"
"git.kebcloud.no/keb/lazysecrets/internal/ui/app"
"git.kebcloud.no/keb/lazysecrets/internal/update"
)
// updater is the app's way to find and install releases, replacing the
// binary that's running, from the servers (config releases) or the
// default ones.
func updater(servers []string) *app.Updater {
c := &update.Client{Servers: servers}
return &app.Updater{
Latest: c.Latest,
Install: func(ctx context.Context, r update.Release) error {
exe, err := update.Executable()
if err != nil {
return err
}
return c.Install(ctx, r, exe)
},
}
}
// updateCmd is lazysecrets update [--check]: the newer release's
// changelog, then (unless --check) install it.
func updateCmd(configPath string, args []string) error {
check := len(args) == 1 && args[0] == "--check"
if len(args) > 0 && !check {
return errors.New("usage: lazysecrets update [--check]")
}
cfg, err := config.LoadAll(strings.Split(configPath, ","))
if err != nil {
return err
}
current := versionString()
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
c := &update.Client{Servers: cfg.Updates.Sources}
r, err := c.Latest(ctx)
if err != nil {
return fmt.Errorf("looking for a newer lazysecrets: %w", err)
}
if !update.Newer(current, r.Tag) {
if !update.Newer(current, "v999.0.0") {
return fmt.Errorf("this is a development build (%s); the latest release is %s: install it with install.sh, or go install …@%s", current, r.Tag, r.Tag)
}
fmt.Printf("lazysecrets %s is the latest (%s)\n", current, r.Tag)
return nil
}
fmt.Printf("lazysecrets %s is out (you have %s):\n\n%s\n\n", r.Tag, current, indent(r.Notes(current)))
if check {
fmt.Println("lazysecrets update installs it.")
return nil
}
exe, err := update.Executable()
if err != nil {
return err
}
fmt.Printf("Updating %s…\n", exe)
if err := c.Install(ctx, r, exe); err != nil {
return err
}
fmt.Printf("Updated to %s.\n", r.Tag)
return nil
}
func indent(s string) string {
if s == "" {
return " (no changelog)"
}
return " " + strings.ReplaceAll(s, "\n", "\n ")
}