Source code for xompletions.git

"""Git completer: subcommands, options, and refs."""

import subprocess

from xonsh.completers.tools import RichCompletion
from xonsh.parsers.completion_context import CommandContext

_REF_SUBCMDS = frozenset(
    {
        "checkout",
        "switch",
        "merge",
        "rebase",
        "branch",
        "cherry-pick",
        "log",
        "diff",
        "show",
        "reset",
        "push",
        "pull",
        "fetch",
        "stash",
        "bisect",
        "blame",
        "revert",
        "tag",
    }
)


def _run_git(*args) -> "str | None":
    try:
        return subprocess.check_output(
            ["git", *args],
            stderr=subprocess.PIPE,
            text=True,
            timeout=5,
        )
    except subprocess.CalledProcessError as e:
        err = (e.stderr or "").strip()
        if err:
            from xonsh.tools import print_above_prompt

            print_above_prompt(f"completer git: {err}")
        return None
    except (OSError, FileNotFoundError, subprocess.TimeoutExpired):
        return None


[docs] def xonsh_complete(context: CommandContext): """Complete git subcommands, options, and branch/tag refs.""" if context.arg_index == 0: return # git <subcmd><Tab> if context.arg_index == 1: out = _run_git("--list-cmds=main,others") if out is None: return return {RichCompletion(s, append_space=True) for s in out.split()}, False subcmd = context.args[1].value # git <subcmd> -<Tab> if context.prefix.startswith("-"): out = _run_git(subcmd, "--git-completion-helper") if out is None: return return {RichCompletion(o) for o in out.split() if o.startswith("-")}, False # git <subcmd> <ref><Tab> if subcmd in _REF_SUBCMDS: out = _run_git( "for-each-ref", "--format=%(refname:short)", "refs/heads/", "refs/tags/", "refs/remotes/", ) if out is None: return return {RichCompletion(r, append_space=True) for r in out.split()}, False