Files
lazysecrets/cmd/lazysecrets/update.go
T
kebandClaude Opus 5.5 b3c1911ba5
CI / Checks (pull_request) Successful in 26s
PR title / Conventional title (pull_request) Successful in 2s
feat: releases from GitHub first, then git.kebcloud.no; releases sets others
Updates and install.sh try the GitHub mirror, then git.kebcloud.no,
each with a short timeout, and download from the first server with the
release, checked against its checksums.txt. The releases config option
(and LAZYSECRETS_RELEASES for install.sh) lists other servers. The
release workflow copies each release to GitHub when GH_RELEASE_TOKEN is
set. The status pane's issues link points to GitHub.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 14:01:51 +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.Releases}
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()))
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 ")
}