Skip to content

Commit

Permalink
feat: update cobra (#1)
Browse files Browse the repository at this point in the history
* Create unit test illustrating unknown flag bug (spf13#1854)

Created a unit test that tests the unknown flag
error message when the unknown flag is located
in different arg positions.

* Update stale.yml (spf13#1863)

* fix: force ForEach-Object to return array in pwsh completion (spf13#1850)

Fixes spf13#1847

* Makefile: add target richtest (spf13#1865)

Don't require contributors to install richgo but keep it as an option and for CI

* build(deps): bump golangci/golangci-lint-action from 3.2.0 to 3.3.1 (spf13#1851)

Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 3.2.0 to 3.3.1.
- [Release notes](https://github.com/golangci/golangci-lint-action/releases)
- [Commits](golangci/golangci-lint-action@v3.2.0...v3.3.1)

---
updated-dependencies:
- dependency-name: golangci/golangci-lint-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update kubescape org (spf13#1874)

Signed-off-by: David Wertenteil <dwertent@armosec.io>

* ci: deprecate go 1.15 (spf13#1866)

Remove testing for go 1.15 to allow CI to pass, but don't force projects to upgrade.

* fix: conflict import name with variable (spf13#1879)

`template` is an import in `cobra.go` file and also used as a variable
name, which masks the library in the scope of that function.

* Update badge route (spf13#1884)

Based on
badges/shields#8671

* fix: func name in doc strings (spf13#1885)

Corrected the function name at the start of doc strings, as per the convention
outlined in official go documentation: https://go.dev/blog/godoc

* completions: do not detect arguments with dash as 2nd char as flag (spf13#1817)

Fixes spf13#1816

Previously, arguments with a dash as the second character (e.g., 1-ff00:0:1)
were detected as a flag by mistake. This resulted in auto completion misbehaving
if such an argument was last in the argument list during invocation.

* build(deps): bump github.com/inconshreveable/mousetrap (spf13#1872)

* Add documentation about disabling completion descriptions (spf13#1901)

* Improve MarkFlagsMutuallyExclusive example in User Guide (spf13#1904)

* Update shell_completions.md (spf13#1907)

align documentation with the code : completions.go:452

* build(deps): bump golangci/golangci-lint-action from 3.3.1 to 3.4.0 (spf13#1902)

* Removes stale bot from GitHub action (spf13#1908)

Signed-off-by: John McBride <jpmmcbride@gmail.com>

* Add keeporder to shell completion (spf13#1903)

This allows programs to request the shell to maintain the order of completions that was returned by the program

* Add support for PowerShell 7.2+ (spf13#1916)

PowerShell 7.2 has changed the way arguments are passed to executables.
This was originally an experimental feature in 7.2, but as of 7.3 it is
built-in. A simple "" is now sufficient for passing empty arguments, no
back-tick escaping is required.

Fixes spf13#1849

Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com>
Co-authored-by: Oldřich Jedlička <oldrich.jedlicka@rohlik.cz>

* ci: deprecate go 1.16 (spf13#1926)

* ci: test Golang 1.20 (spf13#1925)

* update copyright year (spf13#1927)

* Update projects_using_cobra.md (spf13#1932)

Signed-off-by: Florent Poinsard <florent.poinsard@outlook.fr>

* Document suggested layout for subcommands (spf13#1930)

Signed-off-by: Luiz Carvalho <lucarval@redhat.com>

* Allow sourcing zsh completion script (spf13#1917)

Although it is not the recommended approach, sourcing a completion
script is the simplest way to get people to try using shell completion.
Not allowing it for zsh has turned out to complicate shell completion
adoption.  Further, many tools modify the zsh script to allow sourcing.

This commit allows sourcing of the zsh completion script.

Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>

* Update main image to better handle dark background (spf13#1883)

Fixes spf13#1880

Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>
Co-authored-by: Deleplace <deleplace2015@gmail.com>

* Fix typo in fish completions (spf13#1945)

* build(deps): bump golangci/golangci-lint-action from 3.4.0 to 3.5.0 (spf13#1971)

* Fix grammar: 'allows to' (spf13#1978)

The use in generated bash completion files is getting flagged by
Lintian (the Debian package linting tool).

Signed-off-by: Taavi Väänänen <hi@taavi.wtf>

* test: make fish_completions_test more robust (spf13#1980)

Use temporary files instead of assuming the current directory is
writable. Also, if creating a temporary file still returns an error,
prevent the test from failing silently by replacing `log.Fatal` with
`t.Fatal`.

* powershell: escape variable with curly brackets (spf13#1960)

This fixes an issue with program names that include a dot, in our case
`podman.exe`. This was caused by the change in commit 6ba7ebb.

Fixes spf13#1853

Signed-off-by: Paul Holzinger <pholzing@redhat.com>

* build(deps): bump golangci/golangci-lint-action from 3.5.0 to 3.6.0 (spf13#1976)

* Move documentation sources to site/content (spf13#1428)

* Add 'one required flag' group (spf13#1952)

* golangci: enable 'unused' and disable deprecated replaced by it (spf13#1983)

* doc: fix typo, Deperecated -> Deprecated (spf13#2000)

* minor corrections to unit tests (spf13#2003)

* build(deps): bump golangci/golangci-lint-action from 3.6.0 to 3.7.0 (spf13#2021)

* command: temporarily disable G602 due to securego/gosec#1005 (spf13#2022)

* ci: test golang 1.21 (spf13#2024)

* Customizable error message prefix (spf13#2023)

* feat: add getters for flag completions (spf13#1943)

* Add notes to doc on preRun and postRun condition (spf13#2041)

* build(deps): bump actions/setup-go from 3 to 4 (spf13#1934)

* build(deps): bump github.com/cpuguy83/go-md2man/v2 from 2.0.2 to 2.0.3 (spf13#2047)

* Allow running persistent run hooks of all parents (spf13#2044)

Currently, only one of the persistent pre-runs and post-runs is executed.
It is always the first one found in the parents chain, starting at this command.
Expected behavior is to execute all parents' persistent pre-runs and post-runs.

Dependent projects implemented various workarounds for this:
- manually building persistent hook chains (in every hook).
- applying some kind of monkey-patching on top of Cobra.

This change eliminates the necessity for such workarounds
by allowing to set a global variable EnableTraverseRunHooks.

Tickets:
- spf13#216
- spf13#252

Signed-off-by: Volodymyr Khoroz <volodymyr.khoroz@foundries.io>

* Fix linter errors (spf13#2052)

When using golangci-lint v1.55.0 some new errors were being reported.

Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>

* Don't complete --help flag when flag parsing disabled (spf13#2061)

Fixes spf13#2060

When a command sets `DisableFlagParsing = true` it requests the
responsibility of doing all the flag parsing. Therefore even the
`--help/-f/--version/-v` flags should not be automatically completed
by Cobra in such a case.

Without this change the `--help/-h/--version/-v` flags can end up being
completed twice for plugins: one time from cobra and one time from the
plugin (which has set `DisableFlagParsing = true`).

Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>

* Add tests for flag completion registration (spf13#2053)

Different problems have been reported about flag completion registration.
These two tests are the cases that were not being verified but had been
mentioned as problematic.

Ref:
- spf13#1320
- spf13#1438 (comment)

Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>

* Replace all non-alphanumerics in active help env var program prefix (spf13#1940)

* Replace all non-alphanumerics in active help env var program prefix

There are other characters besides the dash that are fine in program
names, but are problematic in environment variable names. These include
(but are not limited to) period, space, and non-ASCII letters.

* Another change in docs to mention non-ASCII-alphanumeric instead of just dash

* build(deps): bump actions/checkout from 3 to 4 (spf13#2028)

* Support usage as plugin for tools like kubectl (spf13#2018)

In this case the executable is `kubectl-plugin`, but we run it as:

    kubectl plugin

And the help text should reflect the actual usage of the command.

To create a plugin, add the cobra.CommandDisplayNameAnnotation:

    rootCmd := &cobra.Command{
        Use: "plugin",
        Annotations: map[string]string{
            cobra.CommandDisplayNameAnnotation: "kubectl plugin",
        }
    }

Internally this change modifies CommandPath() for the root command to
return the command display name instead of the command name. This is
used for error messages, help text generation, and completions.

CommandPath() is expected to have spaces and code using it already
handle spaces (e.g replacing with _), so hopefully this does not break
anything.

Fixes: spf13#2017

Signed-off-by: Nir Soffer <nsoffer@redhat.com>

* Improve API to get flag completion function (spf13#2063)

The new API is simpler and matches the `c.RegisterFlagCompletionFunc()`
API.  By removing the global function `GetFlagCompletion()` we are more
future proof if we ever move from a global map of flag completion
functions to something associated with the command.

The commit also makes this API work with persistent flags by using
`c.Flag(flagName)` instead of `c.Flags().Lookup(flagName)`.

The commit also adds unit tests.

Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>

* feat: expose GetCompletions (was getCompletions)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: David Wertenteil <dwertent@armosec.io>
Signed-off-by: John McBride <jpmmcbride@gmail.com>
Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com>
Signed-off-by: Florent Poinsard <florent.poinsard@outlook.fr>
Signed-off-by: Luiz Carvalho <lucarval@redhat.com>
Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>
Signed-off-by: Taavi Väänänen <hi@taavi.wtf>
Signed-off-by: Paul Holzinger <pholzing@redhat.com>
Signed-off-by: Volodymyr Khoroz <volodymyr.khoroz@foundries.io>
Signed-off-by: Nir Soffer <nsoffer@redhat.com>
Co-authored-by: Brian Pursley <bpursley@cinlogic.com>
Co-authored-by: Enrico Candino <enrico.candino@gmail.com>
Co-authored-by: Norman Dankert <norman.dankert@outlook.com>
Co-authored-by: Unai Martinez-Corral <38422348+umarcor@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: David Wertenteil <dwertent@armosec.io>
Co-authored-by: Yash Ladha <18033231+yashLadha@users.noreply.github.com>
Co-authored-by: Seonghyeon Cho <seonghyeoncho96@gmail.com>
Co-authored-by: Dominik Roos <domi.roos@gmail.com>
Co-authored-by: Shihta Kuan <Shihta@users.noreply.github.com>
Co-authored-by: janhn <jan@hnatek.eu>
Co-authored-by: Ggg6542 <465806+gusega@users.noreply.github.com>
Co-authored-by: John McBride <jpmmcbride@gmail.com>
Co-authored-by: Gyanendra Mishra <anomaly.the@gmail.com>
Co-authored-by: Oldřich Jedlička <oldium@users.noreply.github.com>
Co-authored-by: Oldřich Jedlička <oldrich.jedlicka@rohlik.cz>
Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com>
Co-authored-by: Luiz Carvalho <luizcarvalho85@gmail.com>
Co-authored-by: Marc Khouzam <marc.khouzam@gmail.com>
Co-authored-by: Deleplace <deleplace2015@gmail.com>
Co-authored-by: Tom Payne <tom.payne@flarm.com>
Co-authored-by: Taavi Väänänen <hi@taavi.wtf>
Co-authored-by: Branch Vincent <branchevincent@gmail.com>
Co-authored-by: Paul Holzinger <45212748+Luap99@users.noreply.github.com>
Co-authored-by: Martijn Evers <94963229+marevers@users.noreply.github.com>
Co-authored-by: gocurr <xigua67damn@gmail.com>
Co-authored-by: Jun Nishimura <n.junjun0303@gmail.com>
Co-authored-by: Nuno Adrego <55922671+nunoadrego@users.noreply.github.com>
Co-authored-by: Souma <101255979+5ouma@users.noreply.github.com>
Co-authored-by: Alexandru-Claudius Virtopeanu <alexandru-claudius.virtopeanu@ionos.com>
Co-authored-by: Haoming Meng <41393704+Techming@users.noreply.github.com>
Co-authored-by: vkhoroz <vkhoroz@users.noreply.github.com>
Co-authored-by: Ville Skyttä <ville.skytta@upcloud.com>
Co-authored-by: Nir Soffer <nirsof@gmail.com>
Co-authored-by: Geoffrey Ragot <geoffrey.ragot@gmail.com>
  • Loading branch information
Show file tree
Hide file tree
Showing 59 changed files with 1,121 additions and 334 deletions.
56 changes: 0 additions & 56 deletions .github/workflows/stale.yml

This file was deleted.

36 changes: 16 additions & 20 deletions .github/workflows/test.yml
Expand Up @@ -18,14 +18,14 @@ jobs:
runs-on: ubuntu-latest
steps:

- uses: actions/checkout@v3
- uses: actions/checkout@v4

- run: >-
docker run
-v $(pwd):/wrk -w /wrk
ghcr.io/google/addlicense
-c 'The Cobra Authors'
-y '2013-2022'
-y '2013-2023'
-l apache
-ignore '.github/**'
-check
Expand All @@ -39,17 +39,17 @@ jobs:
runs-on: ubuntu-latest
steps:

- uses: actions/checkout@v3
- uses: actions/checkout@v4

- uses: actions/setup-go@v3
- uses: actions/setup-go@v4
with:
go-version: '^1.19'
go-version: '^1.21'
check-latest: true
cache: true

- uses: actions/checkout@v3
- uses: actions/checkout@v4

- uses: golangci/golangci-lint-action@v3.2.0
- uses: golangci/golangci-lint-action@v3.7.0
with:
version: latest
args: --verbose
Expand All @@ -63,32 +63,28 @@ jobs:
- ubuntu
- macOS
go:
- 15
- 16
- 17
- 18
- 19
- 20
- 21
name: '${{ matrix.platform }} | 1.${{ matrix.go }}.x'
runs-on: ${{ matrix.platform }}-latest
steps:

- uses: actions/checkout@v3
- uses: actions/checkout@v4

- uses: actions/setup-go@v3
- uses: actions/setup-go@v4
with:
go-version: 1.${{ matrix.go }}.x
cache: true

- run: |
export GOBIN=$HOME/go/bin
case "${{ matrix.go }}" in
14|15) _version='';;
*) _version='@latest';;
esac
go install github.com/kyoh86/richgo"${_version}"
go install github.com/mitchellh/gox"${_version}"
go install github.com/kyoh86/richgo@latest
go install github.com/mitchellh/gox@latest
- run: RICHGO_FORCE_COLOR=1 PATH=$HOME/go/bin/:$PATH make test
- run: RICHGO_FORCE_COLOR=1 PATH=$HOME/go/bin/:$PATH make richtest


test-win:
Expand All @@ -112,7 +108,7 @@ jobs:
unzip
mingw-w64-x86_64-go
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- uses: actions/cache@v3
with:
Expand All @@ -125,4 +121,4 @@ jobs:
go install github.com/kyoh86/richgo@latest
go install github.com/mitchellh/gox@latest
- run: RICHGO_FORCE_COLOR=1 PATH=$HOME/go/bin:$PATH make test
- run: RICHGO_FORCE_COLOR=1 PATH=$HOME/go/bin:$PATH make richtest
10 changes: 5 additions & 5 deletions .golangci.yml
@@ -1,4 +1,4 @@
# Copyright 2013-2022 The Cobra Authors
# Copyright 2013-2023 The Cobra Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -19,7 +19,7 @@ linters:
disable-all: true
enable:
#- bodyclose
- deadcode
# - deadcode ! deprecated since v1.49.0; replaced by 'unused'
#- depguard
#- dogsled
#- dupl
Expand Down Expand Up @@ -51,12 +51,12 @@ linters:
#- rowserrcheck
#- scopelint
#- staticcheck
- structcheck
#- structcheck ! deprecated since v1.49.0; replaced by 'unused'
#- stylecheck
#- typecheck
- unconvert
#- unparam
#- unused
- varcheck
- unused
# - varcheck ! deprecated since v1.49.0; replaced by 'unused'
#- whitespace
fast: false
8 changes: 4 additions & 4 deletions Makefile
Expand Up @@ -5,10 +5,6 @@ ifeq (, $(shell which golangci-lint))
$(warning "could not find golangci-lint in $(PATH), run: curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh")
endif

ifeq (, $(shell which richgo))
$(warning "could not find richgo in $(PATH), run: go install github.com/kyoh86/richgo@latest")
endif

.PHONY: fmt lint test install_deps clean

default: all
Expand All @@ -25,6 +21,10 @@ lint:

test: install_deps
$(info ******************** running tests ********************)
go test -v ./...

richtest: install_deps
$(info ******************** running tests with kyoh86/richgo ********************)
richgo test -v ./...

install_deps:
Expand Down
12 changes: 6 additions & 6 deletions README.md
@@ -1,12 +1,12 @@
![cobra logo](https://cloud.githubusercontent.com/assets/173412/10886352/ad566232-814f-11e5-9cd0-aa101788c117.png)
![cobra logo](assets/CobraMain.png)

Cobra is a library for creating powerful modern CLI applications.

Cobra is used in many Go projects such as [Kubernetes](https://kubernetes.io/),
[Hugo](https://gohugo.io), and [GitHub CLI](https://github.com/cli/cli) to
name a few. [This list](./projects_using_cobra.md) contains a more extensive list of projects using Cobra.
name a few. [This list](site/content/projects_using_cobra.md) contains a more extensive list of projects using Cobra.

[![](https://img.shields.io/github/workflow/status/spf13/cobra/Test?longCache=tru&label=Test&logo=github%20actions&logoColor=fff)](https://github.com/spf13/cobra/actions?query=workflow%3ATest)
[![](https://img.shields.io/github/actions/workflow/status/spf13/cobra/test.yml?branch=main&longCache=true&label=Test&logo=github%20actions&logoColor=fff)](https://github.com/spf13/cobra/actions?query=workflow%3ATest)
[![Go Reference](https://pkg.go.dev/badge/github.com/spf13/cobra.svg)](https://pkg.go.dev/github.com/spf13/cobra)
[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cobra)](https://goreportcard.com/report/github.com/spf13/cobra)
[![Slack](https://img.shields.io/badge/Slack-cobra-brightgreen)](https://gophers.slack.com/archives/CD3LP1199)
Expand Down Expand Up @@ -80,7 +80,7 @@ which maintains the same interface while adding POSIX compliance.

# Installing
Using Cobra is easy. First, use `go get` to install the latest version
of the library.
of the library.

```
go get -u github.com/spf13/cobra@latest
Expand All @@ -105,8 +105,8 @@ go install github.com/spf13/cobra-cli@latest

For complete details on using the Cobra-CLI generator, please read [The Cobra Generator README](https://github.com/spf13/cobra-cli/blob/main/README.md)

For complete details on using the Cobra library, please read the [The Cobra User Guide](user_guide.md).
For complete details on using the Cobra library, please read the [The Cobra User Guide](site/content/user_guide.md).

# License

Cobra is released under the Apache 2.0 license. See [LICENSE.txt](https://github.com/spf13/cobra/blob/master/LICENSE.txt)
Cobra is released under the Apache 2.0 license. See [LICENSE.txt](LICENSE.txt)
12 changes: 8 additions & 4 deletions active_help.go
@@ -1,4 +1,4 @@
// Copyright 2013-2022 The Cobra Authors
// Copyright 2013-2023 The Cobra Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand All @@ -17,6 +17,7 @@ package cobra
import (
"fmt"
"os"
"regexp"
"strings"
)

Expand All @@ -29,6 +30,8 @@ const (
activeHelpGlobalDisable = "0"
)

var activeHelpEnvVarPrefixSubstRegexp = regexp.MustCompile(`[^A-Z0-9_]`)

// AppendActiveHelp adds the specified string to the specified array to be used as ActiveHelp.
// Such strings will be processed by the completion script and will be shown as ActiveHelp
// to the user.
Expand All @@ -42,7 +45,7 @@ func AppendActiveHelp(compArray []string, activeHelpStr string) []string {

// GetActiveHelpConfig returns the value of the ActiveHelp environment variable
// <PROGRAM>_ACTIVE_HELP where <PROGRAM> is the name of the root command in upper
// case, with all - replaced by _.
// case, with all non-ASCII-alphanumeric characters replaced by `_`.
// It will always return "0" if the global environment variable COBRA_ACTIVE_HELP
// is set to "0".
func GetActiveHelpConfig(cmd *Command) string {
Expand All @@ -55,9 +58,10 @@ func GetActiveHelpConfig(cmd *Command) string {

// activeHelpEnvVar returns the name of the program-specific ActiveHelp environment
// variable. It has the format <PROGRAM>_ACTIVE_HELP where <PROGRAM> is the name of the
// root command in upper case, with all - replaced by _.
// root command in upper case, with all non-ASCII-alphanumeric characters replaced by `_`.
func activeHelpEnvVar(name string) string {
// This format should not be changed: users will be using it explicitly.
activeHelpEnvVar := strings.ToUpper(fmt.Sprintf("%s%s", name, activeHelpEnvVarSuffix))
return strings.ReplaceAll(activeHelpEnvVar, "-", "_")
activeHelpEnvVar = activeHelpEnvVarPrefixSubstRegexp.ReplaceAllString(activeHelpEnvVar, "_")
return activeHelpEnvVar
}
2 changes: 1 addition & 1 deletion active_help_test.go
@@ -1,4 +1,4 @@
// Copyright 2013-2022 The Cobra Authors
// Copyright 2013-2023 The Cobra Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down
4 changes: 2 additions & 2 deletions args.go
@@ -1,4 +1,4 @@
// Copyright 2013-2022 The Cobra Authors
// Copyright 2013-2023 The Cobra Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand All @@ -21,7 +21,7 @@ import (

type PositionalArgs func(cmd *Command, args []string) error

// Legacy arg validation has the following behaviour:
// legacyArgs validation has the following behaviour:
// - root commands with no subcommands can take arbitrary arguments
// - root commands with subcommands will do subcommand validity checking
// - subcommands will always accept arbitrary arguments
Expand Down
2 changes: 1 addition & 1 deletion args_test.go
@@ -1,4 +1,4 @@
// Copyright 2013-2022 The Cobra Authors
// Copyright 2013-2023 The Cobra Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down
Binary file added assets/CobraMain.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions bash_completions.go
@@ -1,4 +1,4 @@
// Copyright 2013-2022 The Cobra Authors
// Copyright 2013-2023 The Cobra Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -85,7 +85,7 @@ __%[1]s_handle_go_custom_completion()
local out requestComp lastParam lastChar comp directive args
# Prepare the command to request completions for the program.
# Calling ${words[0]} instead of directly %[1]s allows to handle aliases
# Calling ${words[0]} instead of directly %[1]s allows handling aliases
args=("${words[@]:1}")
# Disable ActiveHelp which is not supported for bash completion v1
requestComp="%[8]s=0 ${words[0]} %[2]s ${args[*]}"
Expand Down Expand Up @@ -532,7 +532,7 @@ func writeLocalNonPersistentFlag(buf io.StringWriter, flag *pflag.Flag) {
}
}

// Setup annotations for go completions for registered flags
// prepareCustomAnnotationsForFlags setup annotations for go completions for registered flags
func prepareCustomAnnotationsForFlags(cmd *Command) {
flagCompletionMutex.RLock()
defer flagCompletionMutex.RUnlock()
Expand Down
22 changes: 18 additions & 4 deletions bash_completionsV2.go
@@ -1,4 +1,4 @@
// Copyright 2013-2022 The Cobra Authors
// Copyright 2013-2023 The Cobra Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -57,7 +57,7 @@ __%[1]s_get_completion_results() {
local requestComp lastParam lastChar args
# Prepare the command to request completions for the program.
# Calling ${words[0]} instead of directly %[1]s allows to handle aliases
# Calling ${words[0]} instead of directly %[1]s allows handling aliases
args=("${words[@]:1}")
requestComp="${words[0]} %[2]s ${args[*]}"
Expand Down Expand Up @@ -101,6 +101,7 @@ __%[1]s_process_completion_results() {
local shellCompDirectiveNoFileComp=%[5]d
local shellCompDirectiveFilterFileExt=%[6]d
local shellCompDirectiveFilterDirs=%[7]d
local shellCompDirectiveKeepOrder=%[8]d
if (((directive & shellCompDirectiveError) != 0)); then
# Error code. No completion.
Expand All @@ -115,6 +116,19 @@ __%[1]s_process_completion_results() {
__%[1]s_debug "No space directive not supported in this version of bash"
fi
fi
if (((directive & shellCompDirectiveKeepOrder) != 0)); then
if [[ $(type -t compopt) == builtin ]]; then
# no sort isn't supported for bash less than < 4.4
if [[ ${BASH_VERSINFO[0]} -lt 4 || ( ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 4 ) ]]; then
__%[1]s_debug "No sort directive not supported in this version of bash"
else
__%[1]s_debug "Activating keep order"
compopt -o nosort
fi
else
__%[1]s_debug "No sort directive not supported in this version of bash"
fi
fi
if (((directive & shellCompDirectiveNoFileComp) != 0)); then
if [[ $(type -t compopt) == builtin ]]; then
__%[1]s_debug "Activating no file completion"
Expand Down Expand Up @@ -183,7 +197,7 @@ __%[1]s_process_completion_results() {
# Separate activeHelp lines from real completions.
# Fills the $activeHelp and $completions arrays.
__%[1]s_extract_activeHelp() {
local activeHelpMarker="%[8]s"
local activeHelpMarker="%[9]s"
local endIndex=${#activeHelpMarker}
while IFS='' read -r comp; do
Expand Down Expand Up @@ -360,7 +374,7 @@ fi
# ex: ts=4 sw=4 et filetype=sh
`, name, compCmd,
ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs,
ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder,
activeHelpMarker))
}

Expand Down

0 comments on commit ca456bf

Please sign in to comment.