hi: add list-versions subcommand
Prints the tailscale versions integration tests use, with optional filter and format flags. Source of truth stays in hscontrol/capver; CI shells out to this instead of duplicating the version list in YAML. Examples: hi list-versions hi list-versions --set=must --exclude=head hi list-versions --set=all --format=json
This commit is contained in:
parent
58a85b68b3
commit
79562b9782
89
cmd/hi/listversions.go
Normal file
89
cmd/hi/listversions.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/creachadair/command"
|
||||||
|
"github.com/juanfont/headscale/hscontrol/capver"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
errUnknownSet = errors.New("unknown --set value (want must|all)")
|
||||||
|
errUnknownFormat = errors.New("unknown --format value (want space|newline|json)")
|
||||||
|
)
|
||||||
|
|
||||||
|
// ListVersionsConfig holds flags for the list-versions subcommand.
|
||||||
|
type ListVersionsConfig struct {
|
||||||
|
Set string `flag:"set,default=must,Version set: must|all"`
|
||||||
|
Exclude string `flag:"exclude,Comma-separated versions to exclude (e.g. head,unstable)"`
|
||||||
|
Format string `flag:"format,default=space,Output format: space|newline|json"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var listVersionsConfig ListVersionsConfig
|
||||||
|
|
||||||
|
// listVersions prints the Tailscale versions used by integration tests
|
||||||
|
// in a format CI can shell out to. Mirrors integration/scenario.go
|
||||||
|
// AllVersions and MustTestVersions: "head" and "unstable" are bare
|
||||||
|
// tags, releases get a "v" prefix so each entry can be appended to
|
||||||
|
// "ghcr.io/tailscale/tailscale:" directly.
|
||||||
|
func listVersions(env *command.Env) error {
|
||||||
|
release := capver.TailscaleLatestMajorMinor(capver.SupportedMajorMinorVersions, true)
|
||||||
|
all := append([]string{"head", "unstable"}, release...)
|
||||||
|
must := append(append([]string{}, all[0:4]...), all[len(all)-2:]...)
|
||||||
|
|
||||||
|
var versions []string
|
||||||
|
|
||||||
|
switch listVersionsConfig.Set {
|
||||||
|
case "must":
|
||||||
|
versions = must
|
||||||
|
case "all":
|
||||||
|
versions = all
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("%w: %q", errUnknownSet, listVersionsConfig.Set)
|
||||||
|
}
|
||||||
|
|
||||||
|
excluded := make(map[string]bool)
|
||||||
|
|
||||||
|
if listVersionsConfig.Exclude != "" {
|
||||||
|
for v := range strings.SplitSeq(listVersionsConfig.Exclude, ",") {
|
||||||
|
excluded[strings.TrimSpace(v)] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out := make([]string, 0, len(versions))
|
||||||
|
|
||||||
|
for _, v := range versions {
|
||||||
|
if excluded[v] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if v != "head" && v != "unstable" {
|
||||||
|
v = "v" + v
|
||||||
|
}
|
||||||
|
|
||||||
|
out = append(out, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch listVersionsConfig.Format {
|
||||||
|
case "space":
|
||||||
|
fmt.Println(strings.Join(out, " "))
|
||||||
|
case "newline":
|
||||||
|
for _, v := range out {
|
||||||
|
fmt.Println(v)
|
||||||
|
}
|
||||||
|
case "json":
|
||||||
|
b, err := json.Marshal(out)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(string(b))
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("%w: %q", errUnknownFormat, listVersionsConfig.Format)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -29,6 +29,13 @@ func main() {
|
|||||||
return runDoctorCheck(env.Context())
|
return runDoctorCheck(env.Context())
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "list-versions",
|
||||||
|
Help: "Print Tailscale versions used by integration tests",
|
||||||
|
Usage: "list-versions [flags]",
|
||||||
|
SetFlags: command.Flags(flax.MustBind, &listVersionsConfig),
|
||||||
|
Run: listVersions,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "clean",
|
Name: "clean",
|
||||||
Help: "Clean Docker resources",
|
Help: "Clean Docker resources",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user