Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] completion: chown, cpio: support user:group syntax only
- X-seq: zsh-workers 54500
- From: dana <dana@xxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: [PATCH] completion: chown, cpio: support user:group syntax only
- Date: Thu, 07 May 2026 20:08:35 -0500
- Archived-at: <https://zsh.org/workers/54500>
- Feedback-id: i9be146f9:Fastmail
- List-id: <zsh-workers.zsh.org>
i think this was inspired by a complaint on irc, but i've been sitting on it
for a few years
currently we handle . as a delimiter for chown and cpio, as in user.group.
this syntax has been deprecated/non-preferred for my entire life afaik. posix
says to use :. all bsd man pages for chown have said to use : since the '90s.
support for . has been disabled entirely in freebsd/darwin chown since the
early 2000s i think. gnu chown accepts it but it prints a warning message. the
man page on irix (special-cased in _chown) still mentioned . at the end but it
also supported :
anyway our trying to handle the . is annoying on systems that actually have
users/groups with dots in their names
rather than try to make it smarter i think it's ok to just stop supporting
that syntax
dana
diff --git a/Completion/Unix/Command/_chown b/Completion/Unix/Command/_chown
index dae0de86c..36db9c4d2 100644
--- a/Completion/Unix/Command/_chown
+++ b/Completion/Unix/Command/_chown
@@ -74,19 +74,13 @@ _arguments -C -s -S -0 $aopts "$args[@]" '*: :->files' && ret=0
case $state in
owner)
- if [[ $service = chgrp ]] || compset -P '*[:.]'; then
+ if [[ $service = chgrp ]] || compset -P '*:'; then
if (( EGID && $+commands[groups] && ! $+_comp_priv_prefix )); then # except for sudo
_wanted groups expl 'group' compadd -- $(groups) && return 0
fi
_groups && ret=0
else
- if compset -S '[.:]*'; then
- suf=()
- elif [[ $OSTYPE = irix* ]]; then
- suf=( -qS '.' )
- else
- suf=( -qS ':' )
- fi
+ compset -S ':*' || suf=( -qS: )
_users "$suf[@]" && ret=0
fi
;;
@@ -102,9 +96,9 @@ case $state in
if [[ $service = chgrp ]]; then
grp=${line[1]}
else
- usr=${line[1]%%[.:]*}
+ usr=${line[1]%%:*}
usr=${${(M)usr:#[0-9]#}:-${userdirs[$usr]:+.$usr.}}
- grp=${${(M)line[1]%%[.:]*}#?}
+ grp=${${(M)line[1]%%:*}#?}
fi
[[ -n $grp ]] && grp="${${(M)grp:#[0-9]#}:-.$grp.}"
req=( ${usr:+\^u$usr} ${grp:+\^g$grp} )
diff --git a/Completion/Unix/Command/_cpio b/Completion/Unix/Command/_cpio
index 20f8c712d..6db4994d8 100644
--- a/Completion/Unix/Command/_cpio
+++ b/Completion/Unix/Command/_cpio
@@ -120,13 +120,12 @@ if [[ $state = afile ]]; then
'users:user name:_users -qS@' && ret=0
fi
elif [[ $state = user ]]; then
- if compset -P '*[:.]'; then
+ if compset -P '*:'; then
_groups && ret=0
else
- local suf=.
- [[ $OSTYPE = (solaris|hpux)* ]] && suf=:
- compset -S '.*' && unset suf
- _users -S "$suf" -q && ret=0
+ local suf
+ compset -S ':*' || suf=( -qS: )
+ _users $suf && ret=0
fi
fi
Messages sorted by:
Reverse Date,
Date,
Thread,
Author