Skip to content

Add support for cli completion in git bash for windows #34150

Description

Request

Please make the Azure CLI Bash completion script honor
ARGCOMPLETE_USE_TEMPFILES by using _ARGCOMPLETE_STDOUT_FILENAME and
reading the completion results from that file. This would allow Git Bash on
Windows to use the completion script without users replacing its completion
function in their .bashrc.

Alternatively, document the Git Bash limitation and this workaround.

Reproduction

On Windows 11 with Git Bash and Azure CLI installed via the Windows MSI,
sourcing the upstream az.completion script and setting
ARGCOMPLETE_USE_TEMPFILES=1 is not sufficient: pressing Tab after az
offers filesystem paths instead of CLI commands.

The tempfile-aware function below works in this environment. I tested it with
Azure CLI 2.90.0. It creates _ARGCOMPLETE_STDOUT_FILENAME, reads the
completion results from the temporary file, and cleans it up.

Related discussion: Azure CLI #26051, which describes the Git Bash file
descriptor limitation.

Environment

  • OS: Windows 11
  • Shell: Git Bash (MINGW64)
  • Azure CLI installation: Windows MSI
  • Azure CLI version:
{
  "azure-cli": "2.90.0",
  "azure-cli-core": "2.90.0",
  "azure-cli-telemetry": "1.1.0",
  "extensions": {
    "azure-devops": "1.0.8"
  }
}

Workaround

Using the stock bash completion file
curl -fsSL https://raw.githubusercontent.com/Azure/azure-cli/dev/az.completion -o ~/.azure/.az.completion

The completion in this scenario needs to use temp files and to get this going you need the completion to also be temp-file aware like this:

if [[ -r "$HOME/.azure/.az.completion" ]]; then
  export ARGCOMPLETE_USE_TEMPFILES=1
  source "$HOME/.azure/.az.completion"

  _az_python_argcomplete() {
    local IFS=$'\013'
    local SUPPRESS_SPACE=0
    local TMPFILE
    local STATUS

    if compopt +o nospace 2>/dev/null; then
      SUPPRESS_SPACE=1
    fi

    TMPFILE=$(mktemp) || return 1

    COMPREPLY=($(
      IFS="$IFS" \
        COMP_LINE="$COMP_LINE" \
        COMP_POINT="$COMP_POINT" \
        COMP_TYPE="$COMP_TYPE" \
        _ARGCOMPLETE_COMP_WORDBREAKS="$COMP_WORDBREAKS" \
        _ARGCOMPLETE=1 \
        _ARGCOMPLETE_SUPPRESS_SPACE=$SUPPRESS_SPACE \
        ARGCOMPLETE_USE_TEMPFILES=1 \
        _ARGCOMPLETE_STDOUT_FILENAME="$TMPFILE" \
        "$1" 8>&1 9>&2 1>/dev/null 2>/dev/null
      STATUS=$?
      cat "$TMPFILE"
      rm -f "$TMPFILE"
      exit "$STATUS"
    ))

    STATUS=$?
    if [[ $STATUS != 0 ]]; then
      unset COMPREPLY
    elif [[ $SUPPRESS_SPACE == 1 ]] && [[ "${COMPREPLY[0]}" =~ [=/:]$ ]]; then
      compopt -o nospace
    fi
  }
fi

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Service AttentionThis issue is responsible by Azure service team.customer-reportedIssues that are reported by GitHub users external to the Azure organization.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions