beetbox / beetbox/beets

plugins: Bash completion fails when command names contain a hyphen

Open
#2,836 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Python
Stars
15.7k
Forks
2.1k
Avg merge
5d 4h
Merged PRs (30d)
35

Description

beets version 1.4.6
Python version 3.5.2

For commands like `foo-bar`, you create invalid bash code. The following diff is part of a solution, and at least prevents ugly bash error messages when you press TAB.

```patch
--- a/beets/ui/commands.py
+++ b/beets/ui/commands.py
@@ -1758,7 +1758,7 @@ def completion_script(commands):
# Command aliases
yield u" local aliases='%s'\n" % ' '.join(aliases.keys())
for alias, cmd in aliases.items():
- yield u" local alias__%s=%s\n" % (alias, cmd)
+ yield u" local alias__%s=%s\n" % (alias.replace('-', '_'), cmd)
yield u'\n'

# Fields
@@ -1775,7 +1775,7 @@ def completion_script(commands):
if option_list:
option_list = u' '.join(option_list)
yield u" local %s__%s='%s'\n" % (
- option_type, cmd, option_list)
+ option_type, cmd.replace('-', '_'), option_list)

yield u' _beet_dispatch\n'
yield u'}\n'
--- a/beets/ui/completion_base.sh
+++ b/beets/ui/completion_base.sh
@@ -70,7 +70,7 @@ _beet_dispatch() {

# Replace command shortcuts
if [[ -n $cmd ]] && _list_include_item "$aliases" "$cmd"; then
- eval "cmd=\$alias__$cmd"
+ eval "cmd=\$alias__${cmd//-/_}"
fi

case $cmd in
@@ -94,8 +94,8 @@ _beet_dispatch() {
_beet_complete() {
if [[ $cur == -* ]]; then
local opts flags completions
- eval "opts=\$opts__$cmd"
- eval "flags=\$flags__$cmd"
+ eval "opts=\$opts__${cmd//-/_}"
+ eval "flags=\$flags__${cmd//-/_}"
completions="${flags___common} ${opts} ${flags}"
COMPREPLY+=( $(compgen -W "$completions" -- $cur) )
else
@@ -129,7 +129,7 @@ _beet_complete_global() {
COMPREPLY+=( $(compgen -W "$completions" -- $cur) )
elif [[ -n $cur ]] && _list_include_item "$aliases" "$cur"; then
local cmd
- eval "cmd=\$alias__$cur"
+ eval "cmd=\$alias__${cur//-/_}"
COMPREPLY+=( "$cmd" )
else
COMPREPLY+=( $(compgen -W "$commands" -- $cur) )
@@ -138,7 +138,7 @@ _beet_complete_global() {

_beet_complete_query() {
local opts
- eval "opts=\$opts__$cmd"
+ eval "opts=\$opts__${cmd//-/_}"

if [[ $cur == -* ]] || _list_include_item "$opts" "$prev"; then
_beet_complete
```

But then option completion still doesn't work correctly.

Contributor guide

Open the contributing guide

Research direction

Start in beets/ui/commands.py at completion_script and compare its generated variable names with the lookups in beets/ui/completion_base.sh. Trace aliases, command options, and query completion for names containing hyphens; the proposed changes show the affected paths, but option completion still needs investigation. Done when hyphenated command names generate valid Bash and option completion works correctly.

Written by the indexing model from the issue text.

Assessment

Tech stack
bash, python
Domain
cli
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.