Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package lazyworktree for openSUSE:Factory checked in at 2026-06-23 17:42:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lazyworktree (Old) and /work/SRC/openSUSE:Factory/.lazyworktree.new.1956 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lazyworktree" Tue Jun 23 17:42:44 2026 rev:6 rq:1361329 version:1.47.0 Changes: -------- --- /work/SRC/openSUSE:Factory/lazyworktree/lazyworktree.changes 2026-06-05 15:04:14.586097059 +0200 +++ /work/SRC/openSUSE:Factory/.lazyworktree.new.1956/lazyworktree.changes 2026-06-23 17:45:30.400004748 +0200 @@ -1,0 +2,66 @@ +Tue Jun 23 10:44:15 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.47.0: + This release introduces inline status chips for CI checks, + dedicated PR status badges within the Info pane, and improved + container execution logic for custom commands. Additionally, it + features structural code refactoring, streamlined documentation, + and various dependency upgrades to enhance overall stability. + * Features + - Inline CI Status: Replaced the heavy powerline-style CI + summary pill with a lightweight, inline status chip next to + the CI Checks heading. + - PR Status Badges: Added colored state badges (Open, Merged, + Closed, Draft) directly to the Info pane for improved + visibility of pull/merge request status. + - Claude Skill for Docs Review: Introduced an AI-assisted + workspace skill (docs-drift-review) to systematically analyze + repository documentation for implementation drift, stale + examples, or clarity issues. + * Bug Fixes + - Container Commands Shell Wrapping: Multi-word container + commands are now wrapped in a shell execution (sh -c) to + prevent execution failures in container runtimes, and + environment variables are properly expanded before execution. + - Custom Commands Discovery: Fixed an issue where + container-only custom commands were omitted from the command + palette. + - Custom Theme Handling: Ensured custom themes load properly on + startup and dynamically reconcile with delta syntax theme + arguments during CLI overrides. + - CLI Override Scoping: Fixed a bug where unspecified + configuration string fields were reset to default values + during CLI theme overrides. + * Performance Improvements + - Badge Rendering Optimization: Extracted remote host icon + mapping tables to the package level to eliminate redundant + memory allocations, and deferred style calculations until + after validation to prevent unnecessary processing. + * Maintenance + - Code Refactoring: Grouped scattered Model state fields into + dedicated sub-structs (loadingState, detailsState, + pendingOpState) to improve long-term codebase + maintainability. + - Configuration Default Changes: Adjusted the default + refresh_interval to 10 seconds, disabled ci_auto_refresh by + default, mapped the manual refresh key to r, and introduced + the LAZYWORKTREE_DESCRIPTION variable for notes scripts. + - Documentation Refinement: Streamlined the user guide and + README by removing redundant "Refer to this page when" + callouts and simplifying phrasings. + - Test & Lint Improvements: Simplified linting targets, + resolved test-suite lint warnings, and disabled GPG commit + signing in machine test environments to prevent test + failures. + - Weekly Maintenance: Completed weekly codebase maintenance and + test coverage alignments (Pull Requests #66, #67, #68). + * Dependencies + - Upgraded charm.land/bubbletea/v2 to v2.0.7 (Pull Request #66) + - Upgraded charm.land/lipgloss/v2 to v2.0.4 (Pull Request #67) + - Upgraded github.com/urfave/cli/v3 to v3.10.0 (Pull Request + #67) + - Upgraded golang.org/x/term to v0.44.0 (Pull Request #67) + - Upgraded github.com/charmbracelet/ultraviolet to newer + maintenance snapshots (Pull Requests #66, #67, #68) + +------------------------------------------------------------------- Old: ---- lazyworktree-1.46.1.obscpio New: ---- lazyworktree-1.47.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lazyworktree.spec ++++++ --- /var/tmp/diff_new_pack.YKYqs9/_old 2026-06-23 17:45:32.476077099 +0200 +++ /var/tmp/diff_new_pack.YKYqs9/_new 2026-06-23 17:45:32.492077656 +0200 @@ -17,7 +17,7 @@ Name: lazyworktree -Version: 1.46.1 +Version: 1.47.0 Release: 0 Summary: Easy Git worktree management for the terminal License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.YKYqs9/_old 2026-06-23 17:45:32.784087833 +0200 +++ /var/tmp/diff_new_pack.YKYqs9/_new 2026-06-23 17:45:32.832089506 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/chmouel/lazyworktree.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">refs/tags/v1.46.1</param> + <param name="revision">refs/tags/v1.47.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.YKYqs9/_old 2026-06-23 17:45:33.060097452 +0200 +++ /var/tmp/diff_new_pack.YKYqs9/_new 2026-06-23 17:45:33.104098984 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/chmouel/lazyworktree.git</param> - <param name="changesrevision">a2da729a71b74bebe72cd97d33be87d9381c174f</param></service></servicedata> + <param name="changesrevision">0812fe830e72aa6023b8e3804ef776e6e0beaeae</param></service></servicedata> (No newline at EOF) ++++++ lazyworktree-1.46.1.obscpio -> lazyworktree-1.47.0.obscpio ++++++ ++++ 6597 lines of diff (skipped) ++++++ lazyworktree.obsinfo ++++++ --- /var/tmp/diff_new_pack.YKYqs9/_old 2026-06-23 17:45:35.656187923 +0200 +++ /var/tmp/diff_new_pack.YKYqs9/_new 2026-06-23 17:45:35.692189178 +0200 @@ -1,5 +1,5 @@ name: lazyworktree -version: 1.46.1 -mtime: 1780467759 -commit: a2da729a71b74bebe72cd97d33be87d9381c174f +version: 1.47.0 +mtime: 1782207196 +commit: 0812fe830e72aa6023b8e3804ef776e6e0beaeae ++++++ vendor.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/charm.land/bubbletea/v2/README.md new/vendor/charm.land/bubbletea/v2/README.md --- old/vendor/charm.land/bubbletea/v2/README.md 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/charm.land/bubbletea/v2/README.md 2026-06-23 11:33:16.000000000 +0200 @@ -397,6 +397,6 @@ Part of [Charm](https://charm.sh). -<a href="https://charm.sh/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-banner-next.jpg" width="400"></a> +<a href="https://charm.sh/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-banner-softy.jpg" width="400"></a> Charm热爱开源 • Charm loves open source • نحنُ نحب المصادر المفتوحة diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/charm.land/bubbletea/v2/Taskfile.yaml new/vendor/charm.land/bubbletea/v2/Taskfile.yaml --- old/vendor/charm.land/bubbletea/v2/Taskfile.yaml 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/charm.land/bubbletea/v2/Taskfile.yaml 2026-06-23 11:33:16.000000000 +0200 @@ -1,6 +1,6 @@ # https://taskfile.dev -version: '3' +version: "3" tasks: lint: @@ -11,4 +11,28 @@ test: desc: Run tests cmds: - - go test ./... {{.CLI_ARGS}} + - go test -race -count 4 -cpu 1,4 ./... {{.CLI_ARGS}} + + release: + desc: Create and push a new tag following semver + vars: + NEXT: + sh: svu next --always || go run github.com/caarlos0/svu/v3@latest next --always + prompt: "This will release {{.NEXT}}. Continue?" + preconditions: + - sh: '[ $(git symbolic-ref --short HEAD) = "main" ]' + msg: Not on main branch + - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]" + msg: "Git is dirty" + - sh: 'gh run list --workflow build.yml --commit $(git rev-parse HEAD) --status success --json conclusion -q ".[0].conclusion" | grep -q success' + msg: "Test build for this commit failed or not present" + cmds: + - task: fetch-tags + - git commit --allow-empty -m "{{.NEXT}}" + - git tag --annotate --sign -m "{{.NEXT}}" {{.NEXT}} {{.CLI_ARGS}} + - echo "Pushing {{.NEXT}}..." + - git push origin main --follow-tags + + fetch-tags: + cmds: + - git fetch --tags diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/charm.land/bubbletea/v2/cursed_renderer.go new/vendor/charm.land/bubbletea/v2/cursed_renderer.go --- old/vendor/charm.land/bubbletea/v2/cursed_renderer.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/charm.land/bubbletea/v2/cursed_renderer.go 2026-06-23 11:33:16.000000000 +0200 @@ -764,8 +764,14 @@ // onMouse implements renderer. func (s *cursedRenderer) onMouse(m MouseMsg) Cmd { - if s.lastView != nil && s.lastView.OnMouse != nil { - return s.lastView.OnMouse(m) + var onMouse func(MouseMsg) Cmd + s.mu.Lock() + if s.lastView != nil { + onMouse = s.lastView.OnMouse + } + s.mu.Unlock() + if onMouse != nil { + return onMouse(m) } return nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/charm.land/bubbletea/v2/tea.go new/vendor/charm.land/bubbletea/v2/tea.go --- old/vendor/charm.land/bubbletea/v2/tea.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/charm.land/bubbletea/v2/tea.go 2026-06-23 11:33:16.000000000 +0200 @@ -1347,8 +1347,10 @@ if err := p.initTerminal(); err != nil { return err } - if err := p.initInputReader(false); err != nil { - return err + if p.input != nil { + if err := p.initInputReader(false); err != nil { + return err + } } p.startRenderer() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/charm.land/lipgloss/v2/.golangci.yml new/vendor/charm.land/lipgloss/v2/.golangci.yml --- old/vendor/charm.land/lipgloss/v2/.golangci.yml 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/charm.land/lipgloss/v2/.golangci.yml 2026-06-23 11:33:16.000000000 +0200 @@ -30,6 +30,9 @@ - text: '(slog|log)\.\w+' linters: - noctx + - text: "naming" + linters: + - revive generated: lax presets: - common-false-positives diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/charm.land/lipgloss/v2/position.go new/vendor/charm.land/lipgloss/v2/position.go --- old/vendor/charm.land/lipgloss/v2/position.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/charm.land/lipgloss/v2/position.go 2026-06-23 11:33:16.000000000 +0200 @@ -39,7 +39,7 @@ // PlaceHorizontal places a string or text block horizontally in an unstyled // block of a given width. If the given width is shorter than the max width of -// the string (measured by its longest line) this will be a noop. +// the string (measured by its longest line) this will be a noöp. func PlaceHorizontal(width int, pos Position, str string, opts ...WhitespaceOption) string { lines, contentWidth := getLines(str) gap := width - contentWidth @@ -86,7 +86,7 @@ // PlaceVertical places a string or text block vertically in an unstyled block // of a given height. If the given height is shorter than the height of the -// string (measured by its newlines) then this will be a noop. +// string (measured by its newlines) then this will be a noöp. func PlaceVertical(height int, pos Position, str string, opts ...WhitespaceOption) string { contentHeight := strings.Count(str, "\n") + 1 gap := height - contentHeight diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/charm.land/lipgloss/v2/wrap.go new/vendor/charm.land/lipgloss/v2/wrap.go --- old/vendor/charm.land/lipgloss/v2/wrap.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/charm.land/lipgloss/v2/wrap.go 2026-06-23 11:33:16.000000000 +0200 @@ -63,6 +63,12 @@ // Write writes to the buffer. func (w *WrapWriter) Write(p []byte) (int, error) { + if w.p == nil { + // The writer has been closed and its parser returned to the pool. + // Writing after close can happen during out-of-order teardown of + // nested writer chains; treat it as a no-op rather than panicking. + return len(p), nil + } for i := range p { b := p[i] w.p.Advance(b) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/charmbracelet/ultraviolet/decoder.go new/vendor/github.com/charmbracelet/ultraviolet/decoder.go --- old/vendor/github.com/charmbracelet/ultraviolet/decoder.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/charmbracelet/ultraviolet/decoder.go 2026-06-23 11:33:16.000000000 +0200 @@ -1530,7 +1530,6 @@ func parseKittyKeyboardExt(params ansi.Params, k KeyPressEvent) Event { // Handle Kitty keyboard protocol if len(params) > 2 && // We have at least 3 parameters - params[0].Param(1) == 1 && // The first parameter is 1 (defaults to 1) params[1].HasMore() { // The second parameter is a subparameter (separated by a ":") switch params[2].Param(1) { // The third parameter is the event type (defaults to 1) case 2: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/autocomplete/bash_autocomplete new/vendor/github.com/urfave/cli/v3/autocomplete/bash_autocomplete --- old/vendor/github.com/urfave/cli/v3/autocomplete/bash_autocomplete 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/autocomplete/bash_autocomplete 2026-06-23 11:33:16.000000000 +0200 @@ -66,7 +66,7 @@ local description="" if [[ "${line}" == *:* ]]; then - token="${line%%:*}" + token="${line%%%%:*}" description="${line#*:}" fi @@ -104,4 +104,4 @@ fi } -complete -o bashdefault -o default -o nospace -F __%[1]s_bash_autocomplete %[1]s +complete -o bashdefault -o default -F __%[1]s_bash_autocomplete %[1]s diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/autocomplete/fish_autocomplete new/vendor/github.com/urfave/cli/v3/autocomplete/fish_autocomplete --- old/vendor/github.com/urfave/cli/v3/autocomplete/fish_autocomplete 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/autocomplete/fish_autocomplete 2026-06-23 11:33:16.000000000 +0200 @@ -6,7 +6,11 @@ # Extract the last arg (partial input) set -l lastArg (commandline -ct) - set -l results ($args[1] $args[2..-1] $lastArg --generate-shell-completion 2> /dev/null) + if string match -q -- "-*" $lastArg + set results ($args[1] $args[2..-1] $lastArg --generate-shell-completion 2> /dev/null) + else + set results ($args[1] $args[2..-1] --generate-shell-completion 2> /dev/null) + end # Remove trailing empty lines for line in $results[-1..1] @@ -32,4 +36,4 @@ # Clear existing completions for %[1]s complete -c %[1]s -e # Register completion function -complete -c %[1]s -f -a '(__%[1]s_perform_completion)' \ No newline at end of file +complete -c %[1]s -f -a '(__%[1]s_perform_completion)' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/command.go new/vendor/github.com/urfave/cli/v3/command.go --- old/vendor/github.com/urfave/cli/v3/command.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/command.go 2026-06-23 11:33:16.000000000 +0200 @@ -161,21 +161,12 @@ globaHelpFlagAdded bool // whether global version flag was added globaVersionFlagAdded bool + // generated root version flag + versionFlag Flag // whether this is a completion command isCompletionCommand bool -} - -// FullName returns the full name of the command. -// For commands with parents this ensures that the parent commands -// are part of the command path. -func (cmd *Command) FullName() string { - namePath := []string{} - - if cmd.parent != nil { - namePath = append(namePath, cmd.parent.FullName()) - } - - return strings.Join(append(namePath, cmd.Name), " ") + // whether this is the built-in help command + builtInHelp bool } func (cmd *Command) Command(name string) *Command { @@ -303,6 +294,9 @@ // VisiblePersistentFlags returns a slice of [LocalFlag] with Persistent=true and Hidden=false. func (cmd *Command) VisiblePersistentFlags() []Flag { + if cmd.isCompletionCommand { + return nil + } var flags []Flag for _, fl := range cmd.Root().Flags { pfl, ok := fl.(LocalFlag) @@ -370,6 +364,22 @@ return nil } +func (cmd *Command) hasPersistentFlagOnAncestor(fl Flag) bool { + for pCmd := cmd.parent; pCmd != nil; pCmd = pCmd.parent { + for _, pFl := range pCmd.allFlags() { + if pFl != fl { + continue + } + + pfl, ok := pFl.(LocalFlag) + if ok && !pfl.IsLocal() { + return true + } + } + } + return false +} + func (cmd *Command) lookupFlag(name string) Flag { for _, pCmd := range cmd.Lineage() { if f := pCmd.lFlag(name); f != nil { @@ -411,7 +421,7 @@ // The help and completion commands are allowed to run without // enforcement of required flags, since they do not invoke user // actions that depend on those flag values. - if cmd.Name == helpName || cmd.isCompletionCommand { + if cmd.builtInHelp || cmd.isCompletionCommand { return nil } for pCmd := cmd; pCmd != nil; pCmd = pCmd.parent { @@ -556,6 +566,39 @@ return lineage } +// FullName returns the full name of the command. +// Includes parent commands separated by space. +func (cmd *Command) FullName() string { + return strings.Join(cmd.Path(), " ") +} + +// Path returns the path of command names from the root to cmd, inclusive. +// Each element is a Command.Name. Path traverses upward via parent pointers +// similar to Lineage. FullName() is equivalent to strings.Join(cmd.Path(), " "). +func (cmd *Command) Path() []string { + if cmd.parent != nil { + return append(cmd.parent.Path(), cmd.Name) + } + return []string{cmd.Name} +} + +// Walk visits cmd and every descendant. If fn returns a non-nil error, the +// walk terminates and the error is returned to the caller. +func (cmd *Command) Walk(fn func(*Command) error) error { + if fn == nil { + return nil + } + if err := fn(cmd); err != nil { + return err + } + for _, sub := range cmd.Commands { + if err := sub.Walk(fn); err != nil { + return err + } + } + return nil +} + // Count returns the num of occurrences of this flag func (cmd *Command) Count(name string) int { if cf, ok := cmd.lookupFlag(name).(Countable); ok { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/command_run.go new/vendor/github.com/urfave/cli/v3/command_run.go --- old/vendor/github.com/urfave/cli/v3/command_run.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/command_run.go 2026-06-23 11:33:16.000000000 +0200 @@ -9,6 +9,8 @@ "unicode" ) +type helpShownKey struct{} + func (cmd *Command) parseArgsFromStdin() ([]string, error) { type state int const ( @@ -141,13 +143,10 @@ var rargs Args = &stringSliceArgs{v: osArgs} var args Args = &stringSliceArgs{rargs.Tail()} - if cmd.isCompletionCommand { - tracef("completion command detected, skipping pre-parse (cmd=%[1]q)", cmd.Name) - cmd.parsedArgs = args - return ctx, cmd.Action(ctx, cmd) - } - for _, f := range cmd.allFlags() { + if cmd.hasPersistentFlagOnAncestor(f) { + continue + } if err := f.PreParse(); err != nil { return ctx, err } @@ -164,7 +163,12 @@ tracef("using post-parse arguments %[1]q (cmd=%[2]q)", args, cmd.Name) - if checkCompletions(ctx, cmd) { + if shouldRunCompletion(cmd) { + var beforeErr error + if ctx, beforeErr = runBefore(ctx, commandChain(cmd)); beforeErr != nil { + return ctx, beforeErr + } + runCompletion(ctx, cmd) return ctx, nil } @@ -173,6 +177,15 @@ deferErr = err cmd.isInError = true + if cmd.checkHelp() { + ctx = context.WithValue(ctx, helpShownKey{}, true) + if cmd.parent == nil { + _ = ShowRootCommandHelp(cmd) + } else { + _ = ShowSubcommandHelp(cmd) + } + return ctx, nil + } if cmd.OnUsageError != nil { err = cmd.OnUsageError(ctx, cmd, err, cmd.parent != nil) err = cmd.handleExitCoder(ctx, err) @@ -191,10 +204,8 @@ tracef("SILENTLY IGNORING ERROR running ShowRootCommandHelp %[1]v (cmd=%[2]q)", err, cmd.Name) } } else { - tracef("running ShowCommandHelp with %[1]q", cmd.Name) - if err := ShowCommandHelp(ctx, cmd, cmd.Name); err != nil { - tracef("SILENTLY IGNORING ERROR running ShowCommandHelp with %[1]q %[2]v", cmd.Name, err) - } + tracef("running ShowSubcommandHelp for %[1]q", cmd.Name) + _ = ShowSubcommandHelp(cmd) } } @@ -202,6 +213,7 @@ } if cmd.checkHelp() { + ctx = context.WithValue(ctx, helpShownKey{}, true) return ctx, helpCommandAction(ctx, cmd) } else { tracef("no help is wanted (cmd=%[1]q)", cmd.Name) @@ -226,6 +238,9 @@ if cmd.After != nil && !cmd.Root().shellCompletion { defer func() { + if ctx.Value(helpShownKey{}) != nil { + return + } if err := cmd.After(ctx, cmd); err != nil { err = cmd.handleExitCoder(ctx, err) @@ -246,7 +261,14 @@ if cmd.OnUsageError != nil { err = cmd.OnUsageError(ctx, cmd, err, cmd.parent != nil) } else { - _ = ShowSubcommandHelp(cmd) + fmt.Fprintf(cmd.Root().ErrWriter, "Incorrect Usage: %s\n\n", err.Error()) + if cmd.parent == nil { + _ = ShowRootCommandHelp(cmd) + } else { + if err := ShowCommandHelp(ctx, cmd.parent, cmd.Name); err != nil { + _ = ShowSubcommandHelp(cmd) + } + } } return ctx, err } @@ -268,13 +290,12 @@ subCmd = cmd.Command(name) if subCmd == nil { hasDefault := cmd.DefaultCommand != "" - isFlagName := slices.Contains(cmd.FlagNames(), name) if hasDefault { tracef("using default command=%[1]q (cmd=%[2]q)", cmd.DefaultCommand, cmd.Name) } - if isFlagName || hasDefault { + if hasDefault { argsWithDefault := cmd.argsWithDefaultCommand(cmd.parsedArgs) tracef("using default command args=%[1]q (cmd=%[2]q)", argsWithDefault, cmd.Name) subCmd = cmd.Command(argsWithDefault.First()) @@ -304,23 +325,12 @@ // perform the command action. // // First, resolve the chain of nested commands up to the parent. - var cmdChain []*Command - for p := cmd; p != nil; p = p.parent { - cmdChain = append(cmdChain, p) - } - slices.Reverse(cmdChain) + cmdChain := commandChain(cmd) // Run Before actions in order. - for _, cmd := range cmdChain { - if cmd.Before == nil { - continue - } - if bctx, err := cmd.Before(ctx, cmd); err != nil { - deferErr = cmd.handleExitCoder(ctx, err) - return ctx, deferErr - } else if bctx != nil { - ctx = bctx - } + if ctx, err = runBefore(ctx, cmdChain); err != nil { + deferErr = err + return ctx, deferErr } // Run flag actions in order. @@ -338,7 +348,14 @@ if cmd.OnUsageError != nil { err = cmd.OnUsageError(ctx, cmd, err, cmd.parent != nil) } else { - _ = ShowSubcommandHelp(cmd) + fmt.Fprintf(cmd.Root().ErrWriter, "Incorrect Usage: %s\n\n", err.Error()) + if cmd.parent == nil { + _ = ShowRootCommandHelp(cmd) + } else { + if err := ShowCommandHelp(ctx, cmd.parent, cmd.Name); err != nil { + _ = ShowSubcommandHelp(cmd) + } + } } return ctx, err } @@ -370,3 +387,26 @@ tracef("returning deferErr (cmd=%[1]q) %[2]q", cmd.Name, deferErr) return ctx, deferErr } + +func commandChain(cmd *Command) []*Command { + var cmdChain []*Command + for p := cmd; p != nil; p = p.parent { + cmdChain = append(cmdChain, p) + } + slices.Reverse(cmdChain) + return cmdChain +} + +func runBefore(ctx context.Context, cmdChain []*Command) (context.Context, error) { + for _, cmd := range cmdChain { + if cmd.Before == nil { + continue + } + if bctx, err := cmd.Before(ctx, cmd); err != nil { + return ctx, cmd.handleExitCoder(ctx, err) + } else if bctx != nil { + ctx = bctx + } + } + return ctx, nil +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/command_setup.go new/vendor/github.com/urfave/cli/v3/command_setup.go --- old/vendor/github.com/urfave/cli/v3/command_setup.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/command_setup.go 2026-06-23 11:33:16.000000000 +0200 @@ -46,18 +46,33 @@ } if cmd.Reader == nil { - tracef("setting default Reader as os.Stdin (cmd=%[1]q)", cmd.Name) - cmd.Reader = os.Stdin + if cmd.parent != nil && cmd.parent.Reader != nil { + tracef("inheriting Reader from parent (cmd=%[1]q)", cmd.Name) + cmd.Reader = cmd.parent.Reader + } else { + tracef("setting default Reader as os.Stdin (cmd=%[1]q)", cmd.Name) + cmd.Reader = os.Stdin + } } if cmd.Writer == nil { - tracef("setting default Writer as os.Stdout (cmd=%[1]q)", cmd.Name) - cmd.Writer = os.Stdout + if cmd.parent != nil && cmd.parent.Writer != nil { + tracef("inheriting Writer from parent (cmd=%[1]q)", cmd.Name) + cmd.Writer = cmd.parent.Writer + } else { + tracef("setting default Writer as os.Stdout (cmd=%[1]q)", cmd.Name) + cmd.Writer = os.Stdout + } } if cmd.ErrWriter == nil { - tracef("setting default ErrWriter as os.Stderr (cmd=%[1]q)", cmd.Name) - cmd.ErrWriter = os.Stderr + if cmd.parent != nil && cmd.parent.ErrWriter != nil { + tracef("inheriting ErrWriter from parent (cmd=%[1]q)", cmd.Name) + cmd.ErrWriter = cmd.parent.ErrWriter + } else { + tracef("setting default ErrWriter as os.Stderr (cmd=%[1]q)", cmd.Name) + cmd.ErrWriter = os.Stderr + } } if cmd.AllowExtFlags { @@ -89,8 +104,11 @@ localVersionFlag = VersionFlag } - cmd.appendFlag(localVersionFlag) - cmd.globaVersionFlagAdded = true + if !flagNamesInUse(cmd.allFlags(), localVersionFlag.Names()) { + cmd.appendFlag(localVersionFlag) + cmd.versionFlag = localVersionFlag + cmd.globaVersionFlagAdded = true + } } } @@ -147,11 +165,13 @@ func (cmd *Command) setupCommandGraph() { tracef("setting up command graph (cmd=%[1]q)", cmd.Name) - for _, subCmd := range cmd.Commands { - subCmd.parent = cmd - subCmd.setupSubcommand() - subCmd.setupCommandGraph() - } + _ = cmd.Walk(func(sub *Command) error { + for _, subCmd := range sub.Commands { + subCmd.parent = sub + subCmd.setupSubcommand() + } + return nil + }) } func (cmd *Command) setupSubcommand() { @@ -178,6 +198,20 @@ cmd.flagCategories = newFlagCategoriesFromFlags(cmd.allFlags()) } +func flagNamesInUse(flags []Flag, names []string) bool { + for _, name := range names { + for _, fl := range flags { + for _, flagName := range fl.Names() { + if flagName == name { + return true + } + } + } + } + + return false +} + func (cmd *Command) hideHelp() bool { tracef("hide help (cmd=%[1]q)", cmd.Name) for c := cmd; c != nil; c = c.parent { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/completion.go new/vendor/github.com/urfave/cli/v3/completion.go --- old/vendor/github.com/urfave/cli/v3/completion.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/completion.go 2026-06-23 11:33:16.000000000 +0200 @@ -4,7 +4,6 @@ "context" "embed" "fmt" - "sort" "strings" ) @@ -58,45 +57,36 @@ ` func buildCompletionCommand(appName string) *Command { - return &Command{ - Name: completionCommandName, - Hidden: true, - Usage: "Output shell completion script for bash, zsh, fish, or Powershell", - Description: strings.ReplaceAll(completionDescription, "$COMMAND", appName), - Action: func(ctx context.Context, cmd *Command) error { - return printShellCompletion(ctx, cmd, appName) - }, + cmd := &Command{ + Name: completionCommandName, + Hidden: true, + Usage: "Output shell completion script for bash, zsh, fish, or Powershell", + Description: strings.ReplaceAll(completionDescription, "$COMMAND", appName), isCompletionCommand: true, } -} - -func printShellCompletion(_ context.Context, cmd *Command, appName string) error { - var shells []string - for k := range shellCompletions { - shells = append(shells, k) - } - - sort.Strings(shells) - - if cmd.Args().Len() == 0 { - return Exit(fmt.Sprintf("no shell provided for completion command. available shells are %+v", shells), 1) - } - s := cmd.Args().First() - renderCompletion, ok := shellCompletions[s] - if !ok { - return Exit(fmt.Sprintf("unknown shell %s, available shells are %+v", s, shells), 1) + for shell, render := range shellCompletions { + cmd.Commands = append(cmd.Commands, buildShellCompletionSubcommand(shell, render, appName)) } - completionScript, err := renderCompletion(cmd, appName) - if err != nil { - return Exit(err, 1) - } + return cmd +} - _, err = cmd.Writer.Write([]byte(completionScript)) - if err != nil { - return Exit(err, 1) +func buildShellCompletionSubcommand(shell string, render renderCompletion, appName string) *Command { + return &Command{ + Name: shell, + Usage: fmt.Sprintf("Output %s completion script", shell), + isCompletionCommand: true, + Action: func(ctx context.Context, cmd *Command) error { + completionScript, err := render(cmd, appName) + if err != nil { + return Exit(err, 1) + } + _, err = cmd.Root().Writer.Write([]byte(completionScript)) + if err != nil { + return Exit(err, 1) + } + return nil + }, } - - return nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/flag.go new/vendor/github.com/urfave/cli/v3/flag.go --- old/vendor/github.com/urfave/cli/v3/flag.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/flag.go 2026-06-23 11:33:16.000000000 +0200 @@ -151,6 +151,23 @@ IsMultiValueFlag() bool } +// SchemaTyper is an optional interface for flags that can report their +// JSON Schema type for programmatic introspection. +type SchemaTyper interface { + // SchemaType returns the JSON Schema type name for the value this + // flag accepts: "boolean", "integer", "number", "string", "array", + // "object". Returns "" if the flag does not map cleanly. + SchemaType() string +} + +// SchemaItemsTyper is an optional interface for multi-value flags that +// can report the JSON Schema type of their elements. +type SchemaItemsTyper interface { + // SchemaItemsType returns the JSON Schema type of elements for + // array-type flags. Returns "" for single-value or object flags. + SchemaItemsType() string +} + // Countable is an interface to enable detection of flag values which support // repetitive flags type Countable interface { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/flag_bool_with_inverse.go new/vendor/github.com/urfave/cli/v3/flag_bool_with_inverse.go --- old/vendor/github.com/urfave/cli/v3/flag_bool_with_inverse.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/flag_bool_with_inverse.go 2026-06-23 11:33:16.000000000 +0200 @@ -116,7 +116,7 @@ func (bif *BoolWithInverseFlag) Set(name, val string) error { if bif.count > 0 && bif.OnlyOnce { - return fmt.Errorf("cant duplicate this flag") + return fmt.Errorf("can't duplicate this flag") } bif.hasBeenSet = true @@ -207,7 +207,7 @@ return fmt.Sprintf("%s%s", names, out[i:]) } -// IsBoolFlag returns whether the flag doesnt need to accept args +// IsBoolFlag returns whether the flag doesn't need to accept args func (bif *BoolWithInverseFlag) IsBoolFlag() bool { return true } @@ -263,3 +263,11 @@ func (bif *BoolWithInverseFlag) TypeName() string { return "bool" } + +func (bif *BoolWithInverseFlag) SchemaType() string { + return "boolean" +} + +func (bif *BoolWithInverseFlag) SchemaItemsType() string { + return "" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/flag_ext.go new/vendor/github.com/urfave/cli/v3/flag_ext.go --- old/vendor/github.com/urfave/cli/v3/flag_ext.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/flag_ext.go 2026-06-23 11:33:16.000000000 +0200 @@ -1,6 +1,9 @@ package cli -import "flag" +import ( + "flag" + "time" +) type extFlag struct { f *flag.Flag @@ -61,3 +64,26 @@ func (e *extFlag) GetEnvVars() []string { return nil } + +func (e *extFlag) SchemaType() string { + switch e.Get().(type) { + case bool: + return "boolean" + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + return "integer" + case float32, float64: + return "number" + case string: + return "string" + case time.Duration: + return "duration" + case time.Time: + return "date-time" + default: + return "" + } +} + +func (e *extFlag) SchemaItemsType() string { + return "" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/flag_impl.go new/vendor/github.com/urfave/cli/v3/flag_impl.go --- old/vendor/github.com/urfave/cli/v3/flag_impl.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/flag_impl.go 2026-06-23 11:33:16.000000000 +0200 @@ -6,6 +6,7 @@ "fmt" "reflect" "strings" + "time" ) // Value represents a value as used by cli. @@ -193,7 +194,7 @@ } if f.count == 1 && f.OnlyOnce { - return fmt.Errorf("cant duplicate this flag") + return fmt.Errorf("can't duplicate this flag") } f.count++ @@ -285,6 +286,51 @@ return nil } +// SchemaType returns the JSON Schema type for the flag's value type. +func (f *FlagBase[T, C, V]) SchemaType() string { + var zero T + switch any(zero).(type) { + case bool: + return "boolean" + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + return "integer" + case float32, float64: + return "number" + case string: + return "string" + case time.Duration: + return "duration" + case time.Time: + return "date-time" + case []string, []int, []int8, []int16, []int32, []int64, + []uint, []uint8, []uint16, []uint32, []uint64, + []float32, []float64: + return "array" + case map[string]string: + return "object" + default: + return "" + } +} + +// SchemaItemsType returns the JSON Schema element type for slice flags. +func (f *FlagBase[T, C, V]) SchemaItemsType() string { + var zero T + t := reflect.TypeOf(zero) + if t.Kind() == reflect.Slice { + switch t.Elem().Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return "integer" + case reflect.Float32, reflect.Float64: + return "number" + case reflect.String: + return "string" + } + } + return "" +} + // IsMultiValueFlag returns true if the value type T can take multiple // values from cmd line. This is true for slice and map type flags func (f *FlagBase[T, C, VC]) IsMultiValueFlag() bool { @@ -301,7 +347,7 @@ return f.Local } -// IsBoolFlag returns whether the flag doesnt need to accept args +// IsBoolFlag returns whether the flag doesn't need to accept args func (f *FlagBase[T, C, VC]) IsBoolFlag() bool { bf, ok := f.value.(boolFlag) return ok && bf.IsBoolFlag() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/godoc-current.txt new/vendor/github.com/urfave/cli/v3/godoc-current.txt --- old/vendor/github.com/urfave/cli/v3/godoc-current.txt 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/godoc-current.txt 2026-06-23 11:33:16.000000000 +0200 @@ -170,7 +170,9 @@ OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} -OPTIONS:{{template "visibleFlagTemplate" .}}{{end}} +OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}{{if .VisiblePersistentFlags}} + +GLOBAL OPTIONS:{{template "visiblePersistentFlagTemplate" .}}{{end}} ` SubcommandHelpTemplate is the text template for the subcommand help topic. cli.go uses text/template to render templates. You can render custom help @@ -384,7 +386,7 @@ string if the flag takes no value at all. func (bif *BoolWithInverseFlag) IsBoolFlag() bool - IsBoolFlag returns whether the flag doesnt need to accept args + IsBoolFlag returns whether the flag doesn't need to accept args func (bif *BoolWithInverseFlag) IsDefaultVisible() bool IsDefaultVisible returns true if the flag is not hidden, otherwise false @@ -405,6 +407,10 @@ func (bif *BoolWithInverseFlag) RunAction(ctx context.Context, cmd *Command) error +func (bif *BoolWithInverseFlag) SchemaItemsType() string + +func (bif *BoolWithInverseFlag) SchemaType() string + func (bif *BoolWithInverseFlag) Set(name, val string) error func (bif *BoolWithInverseFlag) SetCategory(c string) @@ -606,8 +612,8 @@ found func (cmd *Command) FullName() string - FullName returns the full name of the command. For commands with parents - this ensures that the parent commands are part of the command path. + FullName returns the full name of the command. Includes parent commands + separated by space. func (cmd *Command) Generic(name string) Value Generic looks up the value of a local GenericFlag, returns nil if not found @@ -689,6 +695,12 @@ func (cmd *Command) NumFlags() int NumFlags returns the number of flags set +func (cmd *Command) Path() []string + Path returns the path of command names from the root to cmd, inclusive. + Each element is a Command.Name. Path traverses upward via parent pointers + similar to Lineage. FullName() is equivalent to strings.Join(cmd.Path(), + " "). + func (cmd *Command) Root() *Command Root returns the Command at the root of the graph @@ -801,6 +813,10 @@ VisiblePersistentFlags returns a slice of LocalFlag with Persistent=true and Hidden=false. +func (cmd *Command) Walk(fn func(*Command) error) error + Walk visits cmd and every descendant. If fn returns a non-nil error, + the walk terminates and the error is returned to the caller. + type CommandCategories interface { // AddCommand adds a command to a category, creating a new category if necessary. AddCommand(category string, command *Command) @@ -1000,7 +1016,7 @@ string if the flag takes no value at all. func (f *FlagBase[T, C, VC]) IsBoolFlag() bool - IsBoolFlag returns whether the flag doesnt need to accept args + IsBoolFlag returns whether the flag doesn't need to accept args func (f *FlagBase[T, C, V]) IsDefaultVisible() bool IsDefaultVisible returns true if the flag is not hidden, otherwise false @@ -1032,6 +1048,12 @@ func (f *FlagBase[T, C, V]) RunAction(ctx context.Context, cmd *Command) error RunAction executes flag action if set +func (f *FlagBase[T, C, V]) SchemaItemsType() string + SchemaItemsType returns the JSON Schema element type for slice flags. + +func (f *FlagBase[T, C, V]) SchemaType() string + SchemaType returns the JSON Schema type for the flag's value type. + func (f *FlagBase[T, C, V]) Set(_ string, val string) error Set applies given value from string @@ -1296,6 +1318,23 @@ it allows flags required flags to be backwards compatible with the Flag interface +type SchemaItemsTyper interface { + // SchemaItemsType returns the JSON Schema type of elements for + // array-type flags. Returns "" for single-value or object flags. + SchemaItemsType() string +} + SchemaItemsTyper is an optional interface for multi-value flags that can + report the JSON Schema type of their elements. + +type SchemaTyper interface { + // SchemaType returns the JSON Schema type name for the value this + // flag accepts: "boolean", "integer", "number", "string", "array", + // "object". Returns "" if the flag does not map cleanly. + SchemaType() string +} + SchemaTyper is an optional interface for flags that can report their JSON + Schema type for programmatic introspection. + type Serializer interface { Serialize() string } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/help.go new/vendor/github.com/urfave/cli/v3/help.go --- old/vendor/github.com/urfave/cli/v3/help.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/help.go 2026-06-23 11:33:16.000000000 +0200 @@ -65,11 +65,12 @@ func buildHelpCommand(withAction bool) *Command { cmd := &Command{ - Name: helpName, - Aliases: []string{helpAlias}, - Usage: UsageCommandHelp, - ArgsUsage: ArgsUsageCommandHelp, - HideHelp: true, + Name: helpName, + Aliases: []string{helpAlias}, + Usage: UsageCommandHelp, + ArgsUsage: ArgsUsageCommandHelp, + HideHelp: true, + builtInHelp: true, } if withAction { @@ -85,14 +86,22 @@ tracef("doing help for cmd %[1]q with args %[2]q", cmd, args) - // This action can be triggered by a "default" action of a command - // or via cmd.Run when cmd == helpCmd. So we have following possibilities + // helpCommandAction is triggered in several ways: // - // 1 $ app - // 2 $ app help - // 3 $ app foo - // 4 $ app help foo - // 5 $ app foo help + // * the command has no user-defined Action (default action fallback) + // * the --help / -h flag was parsed (via cmd.checkHelp()) + // * the "help" subcommand (or "h" alias) was dispatched + // + // Possible invocations: + // + // $ app # default action; show root help + // $ app --help / -h # flag; show root help (ignores subsequent args) + // $ app help / h # subcommand; show root help + // $ app help / h foo # subcommand; show help for subcommand "foo" + // $ app --help / -h foo # flag; show help for subcommand "foo" + // $ app foo --help / -h # flag on subcommand; show help for "foo" + // $ app foo help / h # subcommand on subcommand; show help for "foo" + // $ app foo (no action) # default action on subcommand; show help for "foo" // Case 4. when executing a help command set the context to parent // to allow resolution of subsequent args. This will transform @@ -100,7 +109,7 @@ // to // $ app foo // which will then be handled as case 3 - if cmd.parent != nil && (cmd.HasName(helpName) || cmd.HasName(helpAlias)) { + if cmd.parent != nil && cmd.builtInHelp { tracef("setting cmd to cmd.parent") cmd = cmd.parent } @@ -459,13 +468,7 @@ } func checkVersion(cmd *Command) bool { - found := false - for _, name := range VersionFlag.Names() { - if cmd.Bool(name) { - found = true - } - } - return found + return cmd.versionFlag != nil && cmd.versionFlag.IsSet() } func checkShellCompleteFlag(c *Command, arguments []string) (bool, []string) { @@ -492,7 +495,7 @@ return true, arguments[:pos] } -func checkCompletions(ctx context.Context, cmd *Command) bool { +func shouldRunCompletion(cmd *Command) bool { tracef("checking completions on command %[1]q", cmd.Name) if !cmd.Root().shellCompletion { @@ -509,13 +512,14 @@ } tracef("no subcommand found for completion %[1]q", cmd.Name) + return true +} +func runCompletion(ctx context.Context, cmd *Command) { if cmd.ShellComplete != nil { tracef("running shell completion func for command %[1]q", cmd.Name) cmd.ShellComplete(ctx, cmd) } - - return true } func subtract(a, b int) int { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/mkdocs-requirements.txt new/vendor/github.com/urfave/cli/v3/mkdocs-requirements.txt --- old/vendor/github.com/urfave/cli/v3/mkdocs-requirements.txt 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/mkdocs-requirements.txt 2026-06-23 11:33:16.000000000 +0200 @@ -1,4 +1,4 @@ -mkdocs-git-revision-date-localized-plugin==1.5.1 +mkdocs-git-revision-date-localized-plugin==1.5.3 mkdocs-material==9.7.6 mkdocs==1.6.1 mkdocs-redirects==1.2.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/mkdocs.yml new/vendor/github.com/urfave/cli/v3/mkdocs.yml --- old/vendor/github.com/urfave/cli/v3/mkdocs.yml 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/mkdocs.yml 2026-06-23 11:33:16.000000000 +0200 @@ -20,6 +20,8 @@ - v3 Manual: - Getting Started: v3/getting-started.md - Migrating From Older Releases: v3/migrating-from-older-releases.md + - Path and Walk: v3/path-and-walk.md + - Binary Size: v3/binary-size.md - Examples: - Greet: v3/examples/greet.md - Flags: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/urfave/cli/v3/template.go new/vendor/github.com/urfave/cli/v3/template.go --- old/vendor/github.com/urfave/cli/v3/template.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/github.com/urfave/cli/v3/template.go 2026-06-23 11:33:16.000000000 +0200 @@ -107,7 +107,9 @@ OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} -OPTIONS:{{template "visibleFlagTemplate" .}}{{end}} +OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}{{if .VisiblePersistentFlags}} + +GLOBAL OPTIONS:{{template "visiblePersistentFlagTemplate" .}}{{end}} ` var FishCompletionTemplate = `# {{ .Command.Name }} fish shell completion diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sync/errgroup/errgroup.go new/vendor/golang.org/x/sync/errgroup/errgroup.go --- old/vendor/golang.org/x/sync/errgroup/errgroup.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sync/errgroup/errgroup.go 2026-06-23 11:33:16.000000000 +0200 @@ -109,7 +109,7 @@ if g.sem != nil { select { case g.sem <- token{}: - // Note: this allows barging iff channels in general allow barging. + // Note: this allows barging if and only if channels in general allow barging. default: return false } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux.go new/vendor/golang.org/x/sys/unix/ztypes_linux.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux.go 2026-06-23 11:33:16.000000000 +0200 @@ -6397,3 +6397,79 @@ MPOL_PREFERRED_MANY = 0x5 MPOL_WEIGHTED_INTERLEAVE = 0x6 ) + +const ( + GPIO_V2_GET_LINEINFO_IOCTL = 0xc100b405 + GPIO_V2_GET_LINE_IOCTL = 0xc250b407 + GPIO_V2_LINE_GET_VALUES_IOCTL = 0xc010b40e + GPIO_V2_LINE_SET_VALUES_IOCTL = 0xc010b40f + GPIO_V2_GET_LINEINFO_WATCH_IOCTL = 0xc100b406 + GPIO_GET_LINEINFO_UNWATCH_IOCTL = 0xc004b40c +) +const ( + GPIO_V2_LINE_ATTR_ID_FLAGS = 0x1 + GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES = 0x2 + GPIO_V2_LINE_ATTR_ID_DEBOUNCE = 0x3 + GPIO_V2_LINE_CHANGED_REQUESTED = 0x1 + GPIO_V2_LINE_CHANGED_RELEASED = 0x2 + GPIO_V2_LINE_CHANGED_CONFIG = 0x3 + GPIO_V2_LINE_EVENT_RISING_EDGE = 0x1 + GPIO_V2_LINE_EVENT_FALLING_EDGE = 0x2 +) + +type GPIOChipInfo struct { + Name [32]byte + Label [32]byte + Lines uint32 +} +type GPIOV2LineValues struct { + Bits uint64 + Mask uint64 +} +type GPIOV2LineAttribute struct { + Id uint32 + _ uint32 + Flags uint64 +} +type GPIOV2LineConfigAttribute struct { + Attr GPIOV2LineAttribute + Mask uint64 +} +type GPIOV2LineConfig struct { + Flags uint64 + Num_attrs uint32 + _ [5]uint32 + Attrs [10]GPIOV2LineConfigAttribute +} +type GPIOV2LineRequest struct { + Offsets [64]uint32 + Consumer [32]byte + Config GPIOV2LineConfig + Num_lines uint32 + Event_buffer_size uint32 + _ [5]uint32 + Fd int32 +} +type GPIOV2LineInfo struct { + Name [32]byte + Consumer [32]byte + Offset uint32 + Num_attrs uint32 + Flags uint64 + Attrs [10]GPIOV2LineAttribute + _ [4]uint32 +} +type GPIOV2LineInfoChanged struct { + Info GPIOV2LineInfo + Timestamp_ns uint64 + Event_type uint32 + _ [5]uint32 +} +type GPIOV2LineEvent struct { + Timestamp_ns uint64 + Id uint32 + Offset uint32 + Seqno uint32 + Line_seqno uint32 + _ [6]uint32 +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_386.go new/vendor/golang.org/x/sys/unix/ztypes_linux_386.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_386.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_386.go 2026-06-23 11:33:16.000000000 +0200 @@ -711,3 +711,7 @@ _ uint32 _ uint32 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x8044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go new/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go 2026-06-23 11:33:16.000000000 +0200 @@ -725,3 +725,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x8044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go new/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go 2026-06-23 11:33:16.000000000 +0200 @@ -705,3 +705,7 @@ _ uint32 _ uint32 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x8044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go new/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go 2026-06-23 11:33:16.000000000 +0200 @@ -704,3 +704,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x8044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go new/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go 2026-06-23 11:33:16.000000000 +0200 @@ -705,3 +705,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x8044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go new/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go 2026-06-23 11:33:16.000000000 +0200 @@ -710,3 +710,7 @@ Ctime_high uint16 _ uint16 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x4044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go new/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go 2026-06-23 11:33:16.000000000 +0200 @@ -707,3 +707,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x4044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go new/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go 2026-06-23 11:33:16.000000000 +0200 @@ -707,3 +707,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x4044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go new/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go 2026-06-23 11:33:16.000000000 +0200 @@ -710,3 +710,7 @@ Ctime_high uint16 _ uint16 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x4044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go new/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go 2026-06-23 11:33:16.000000000 +0200 @@ -718,3 +718,7 @@ _ uint32 _ [4]byte } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x4044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go new/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go 2026-06-23 11:33:16.000000000 +0200 @@ -713,3 +713,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x4044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go new/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go 2026-06-23 11:33:16.000000000 +0200 @@ -713,3 +713,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x4044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go new/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go 2026-06-23 11:33:16.000000000 +0200 @@ -792,3 +792,7 @@ RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE = 0x6 RISCV_HWPROBE_WHICH_CPUS = 0x1 ) + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x8044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go new/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go 2026-06-23 11:33:16.000000000 +0200 @@ -727,3 +727,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x8044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go new/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go --- old/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go 2026-06-23 11:33:16.000000000 +0200 @@ -708,3 +708,7 @@ _ uint64 _ uint64 } + +const ( + GPIO_GET_CHIPINFO_IOCTL = 0x4044b401 +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/modules.txt new/vendor/modules.txt --- old/vendor/modules.txt 2026-06-03 08:22:39.000000000 +0200 +++ new/vendor/modules.txt 2026-06-23 11:33:16.000000000 +0200 @@ -10,10 +10,10 @@ charm.land/bubbles/v2/textarea charm.land/bubbles/v2/textinput charm.land/bubbles/v2/viewport -# charm.land/bubbletea/v2 v2.0.6 +# charm.land/bubbletea/v2 v2.0.7 ## explicit; go 1.25.0 charm.land/bubbletea/v2 -# charm.land/lipgloss/v2 v2.0.3 +# charm.land/lipgloss/v2 v2.0.4 ## explicit; go 1.25.0 charm.land/lipgloss/v2 # github.com/atotto/clipboard v0.1.4 @@ -28,7 +28,7 @@ # github.com/charmbracelet/lipgloss v1.1.0 ## explicit; go 1.18 github.com/charmbracelet/lipgloss -# github.com/charmbracelet/ultraviolet v0.0.0-20260525132238-948f4557a654 +# github.com/charmbracelet/ultraviolet v0.0.0-20260622092850-f39628c8a989 ## explicit; go 1.25.0 github.com/charmbracelet/ultraviolet # github.com/charmbracelet/x/ansi v0.11.7 @@ -94,21 +94,21 @@ github.com/stretchr/testify/assert github.com/stretchr/testify/assert/yaml github.com/stretchr/testify/require -# github.com/urfave/cli/v3 v3.9.0 +# github.com/urfave/cli/v3 v3.10.0 ## explicit; go 1.22 github.com/urfave/cli/v3 # github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e ## explicit; go 1.19 github.com/xo/terminfo -# golang.org/x/sync v0.20.0 +# golang.org/x/sync v0.21.0 ## explicit; go 1.25.0 golang.org/x/sync/errgroup -# golang.org/x/sys v0.45.0 +# golang.org/x/sys v0.46.0 ## explicit; go 1.25.0 golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/term v0.43.0 +# golang.org/x/term v0.44.0 ## explicit; go 1.25.0 golang.org/x/term # gopkg.in/yaml.v3 v3.0.1
