about summary refs log tree commit diff
path: root/Completion/User/_cvs
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/User/_cvs')
-rw-r--r--Completion/User/_cvs466
1 files changed, 329 insertions, 137 deletions
diff --git a/Completion/User/_cvs b/Completion/User/_cvs
index 4e191cecb..811d1c232 100644
--- a/Completion/User/_cvs
+++ b/Completion/User/_cvs
@@ -1,141 +1,333 @@
 #compdef cvs
 
-setopt localoptions extendedglob
-
-typeset -A commands
-commands=(add "ad new"            admin "adm rcs"         annotate ann
-          checkout "co get"       commit "ci com"         diff "di dif"
-          edit ""                 editors ""              export "exp ex"
-          history "hi his"        import "im imp"         init ""
-          log "lo rlog"           login "logon lgn"       logout ""
-          rdiff patch             release "re rel"        remove "rm delete"
-          status "st stat"        rtag "rt rfreeze"       tag "ta freeze"
-          unedit ""               update "up upd"         watch ""
-          watchers "")
-
-local com="${words[(i)(${(j:|:)${(kv)=commands}})]}"
-
-local showlist='compstate[list]=list; compstate[force_list]=yes'
-local showhint="$showlist ; compstate[insert]=''"
-local complete_D="compadd yesterday week\\ ago month\\ ago"
-local complete_k="compadd kv kvl k o b v"
-local complete_r="compadd -UX 'Enter tag name or rev number' ''; $showhint"
-local complete_m="compadd -UX 'Enter log message' -n ''; $showhint"
-
-
-if (( com < CURRENT )); then
-  case "$words[$com]" in
-    add|ad|new) # "+k:m:"
-      _complete_opts k: "$complete_k" m: "$complete_m" || _files
-      ;;
-    admin|adm|rcs) # "+ib::c:a:A:e:l::u::LUn:N:m:o:s:t::IqxV:k:"
-      _complete_opts i '' b:: '' c: '' a: '' A: '' e: '' l:: '' u:: '' L '' U '' n: '' N: '' m: "$complete_m" o: '' s: '' t:: '' I '' q '' x '' V: '' k: "$complete_k" || _files
-      ;;
-    annotate|ann) # "+lr:D:fR"
-      _complete_opts l '' r: '' D: '' f '' R '' || _files
-      ;;
-    checkout|co|get) # "+ANnk:d:flRpQqcsr:D:j:P"
-      _complete_opts A '' N '' n '' k: "$complete_k" d: '' f '' l '' R '' p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" j: '' P '' || compadd MODULE
-      ;;
-    commit|ci|com) # "+nlRm:fF:r:"
-      _complete_opts n '' l '' R '' m: "$complete_m" f '' F: '' r: "$complete_r" || _files
-      ;;
-    diff|di|dif) # "+abcdefhilnpstuw0123456789BHNRC:D:F:I:L:U:V:W:k:r:"
-      _complete_opts a '' b '' c '' d '' e '' f '' h '' i '' l '' n '' p '' s '' t '' u '' w '' 0 '' 1 '' 2 '' 3 '' 4 '' 5 '' 6 '' 7 '' 8 '' 9 '' B '' H '' N '' R '' C: '' D: "$complete_D" F: '' I: '' L: '' U: '' V: '' W: '' k: "$complete_k" r: "$complete_r" || _files
-      ;;
-    edit) # "+lRa:"
-      _complete_opts l '' R '' a: '' || _files
-      ;;
-    editors) # "+lR"
-      _complete_opts l '' R '' || _files
-      ;;
-    export|exp|ex) # "+ANnk:d:flRpQqcsr:D:j:P"
-      _complete_opts A '' N '' n '' k: "$complete_k" d: '' f '' l '' R '' p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" j: '' P '' || compadd MODULE
-      ;;
-    history|hi|his) # "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:"
-      _complete_opts T '' a '' c '' e '' l '' o '' w '' \? '' D: "$complete_D" b: '' f: '' m: "$complete_m" n: '' p: '' r: '' t: '' u: '' x: '' X: '' z: '' || _files
-      ;;
-    import|im|imp) # "+Qqdb:m:I:k:W:"
-      _complete_opts Q '' q '' d '' b: '' m: "$complete_m" I: '' k: "$complete_k" W: '' || case $[CURRENT-com] in
-	1) if [[ "${+CVSROOT}" == 1 && "$CVSROOT" != :* ]]; then
-	     compgen -X "Enter repository name" -W "$CVSROOT" -g '*~*CVSROOT(/)' -s ''
-	   else
-	     compadd -UX "Enter repository name" -n '' && eval "$showhint"
-	   fi
-	   ;;
-	2) compadd -UX "Enter vendor tag name" -n '' && eval "$showhint";;
-	3) compadd -UX "Enter release tag name" -n '' && eval "$showhint";;
-	*) compadd -UX "No futher arguments used" -n '' && eval "$showhint";;
-	esac
-      ;;
-    init)
-      break
-      ;;
-    login|logon|lgn|logout)
-      _complete_opts || _files
-      ;;
-    rdiff|patch|pa) # "+V:k:cuftsQqlRD:r:"
-      _complete_opts V: '' k: "$complete_k" c '' u '' f '' t '' s '' Q '' q '' l '' R '' D: "$complete_D" r: "$complete_r" || _files
-      ;;
-    release|re|rel) # "+Qdq"
-      _complete_opts Q '' d '' q '' || _files -/
-      ;;
-    remove|rm|delete) # "+flR"
-      _complete_opts f '' l '' R '' || _files
-      ;;
-    status|st|stat) # "+vlR"
-      _complete_opts v '' l '' R '' || _files
-      ;;
-    tag|ta|freeze) # "+FQqlRcdr:D:bf"
-      _complete_opts F '' Q '' q '' l '' R '' c '' d '' r: "$complete_r" D: "$complete_D" b '' f '' || _files
-      ;;
-    unedit) # "+lR"
-      _complete_opts l '' R '' || _files
-      ;;
-    update|up|upd) # "+ApPflRQqduk:r:D:j:I:W:"
-      _complete_opts A '' p '' P '' f '' l '' R '' Q '' q '' d '' u '' k: "$complete_k" r: "$complete_r" D: "$complete_D" j: '' I: '' W: '' || _files
-      ;;
-    watch)
-      if (( CURRENT == com + 1 )); then
-        compadd on off add remove
-      else
-        case "$words[com+1]" in
-          on|off) # "+lR"
-            _complete_opts l '' R '' || _files
-            ;;
-          add|remove) # "+lRa:"
-            _complete_opts l '' R '' a: '' || _files
-            ;;
-        esac
-      fi
-      ;;
-    watchers) # "+lR"
-      _complete_opts l '' R '' || _files
-      ;;
-    *) _files;;
-  esac
-  return
-fi
+_cvs () {
+  setopt localoptions extendedglob
+
+  typeset -A commands
+  commands=(add "ad new"            admin "adm rcs"         annotate ann
+	    checkout "co get"       commit "ci com"         diff "di dif"
+	    edit ""                 editors ""              export "exp ex"
+	    history "hi his"        import "im imp"         init ""
+	    log "lo rlog"           login "logon lgn"       logout ""
+	    rdiff patch             release "re rel"        remove "rm delete"
+	    status "st stat"        rtag "rt rfreeze"       tag "ta freeze"
+	    unedit ""               update "up upd"         watch ""
+	    watchers "")
+
+  local com="${words[(i)(${(j:|:)${(kv)=commands}})]}"
+
+  local showlist='compstate[list]=list; compstate[force_list]=yes'
+  local showhint="$showlist ; compstate[insert]=''"
+  local complete_D="compadd today yesterday week\\ ago month\\ ago"
+  local complete_k="compadd kv kvl k o b v"
+  local complete_r="_cvsrevisions"
+  local complete_m="compadd -UX 'Enter log message' -n ''; $showhint"
+
+  if (( com < CURRENT )); then
+    case "$words[$com]" in
+      add|ad|new) # "+k:m:"
+	_complete_opts k: "$complete_k" m: "$complete_m" || _cvsaddp
+	;;
+      admin|adm|rcs) # "+ib::c:a:A:e:l::u::LUn:N:m:o:s:t::IqxV:k:"
+	_complete_opts i '' b:: '' c: '' a: '' A: '' e: '' l:: '' u:: '' L '' \
+	  U '' n: '' N: '' m: "$complete_m" o: '' s: '' t:: '' I '' q '' x '' \
+	    V: '' k: "$complete_k" ||
+	_cvstargets
+	;;
+      annotate|ann) # "+lr:D:fR"
+	_complete_opts l '' r: "$complete_r" D: "$complete_D" f '' R '' ||
+	_cvstargets
+	;;
+      checkout|co|get) # "+ANnk:d:flRpQqcsr:D:j:P"
+	_complete_opts A '' N '' n '' k: "$complete_k" d: '_files -/' f '' \
+	  l '' R '' p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" \
+	  j: "$complete_r" P '' ||
+	_cvsrepositories
+	;;
+      commit|ci|com) # "+nlRm:fF:r:"
+	_complete_opts n '' l '' R '' m: "$complete_m" f '' F: _files \
+	  r: "$complete_r" ||
+	_cvstargets_modified
+	;;
+      diff|di|dif) # "+abcdefhilnpstuw0123456789BHNRC:D:F:I:L:U:V:W:k:r:"
+	_complete_opts a '' b '' c '' d '' e '' f '' h '' i '' l '' n '' p '' \
+	  s '' t '' u '' w '' 0 '' 1 '' 2 '' 3 '' 4 '' 5 '' 6 '' 7 '' 8 '' \
+	  9 '' B '' H '' N '' R '' C: '' D: "$complete_D" F: '' I: '' L: '' \
+	  U: '' V: '' W: '' k: "$complete_k" r: "$complete_r" ||
+	_cvstargets_modified || _cvstargets
+	;;
+      edit) # "+lRa:"
+	_complete_opts l '' R '' a: 'compadd edit unedit commit all none' ||
+	_cvstargets
+	;;
+      editors) # "+lR"
+	_complete_opts l '' R '' || _cvstargets
+	;;
+      export|exp|ex) # "+Nnk:d:flRQqr:D:"
+	_complete_opts N '' n '' k: "$complete_k" d: '_files -/' f '' l '' \
+	  R '' Q '' q '' r: "$complete_r" D: "$complete_D" ||
+	_cvsrepositories
+	;;
+      history|hi|his) # "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:"
+	_complete_opts T '' a '' c '' e '' l '' o '' w '' \? '' \
+	  D: "$complete_D" b: '' f: '' m: "$complete_m" n: '' p: '' r: '' \
+	  t: '' u: '' x: '' X: '' z: '' ||
+	_cvstargets
+	;;
+      import|im|imp) # "+Qqdb:m:I:k:W:"
+	_complete_opts Q '' q '' d '' b: '' m: "$complete_m" I: _files \
+	  k: "$complete_k" W: '' ||
+	case $[CURRENT-com] in
+	  1) _cvsrepositories;;
+	  2) compadd -UX "Enter vendor tag name" -n '' && eval "$showhint";;
+	  3) compadd -UX "Enter release tag name" -n '' && eval "$showhint";;
+	  *) compadd -UX "No futher arguments used" -n '' && eval "$showhint";;
+	  esac
+	;;
+      init)
+	break
+	;;
+      login|logon|lgn|logout)
+	_complete_opts || _files
+	;;
+      rdiff|patch|pa) # "+V:k:cuftsQqlRD:r:"
+	_complete_opts V: '' k: "$complete_k" c '' u '' f '' t '' s '' Q '' \
+	  q '' l '' R '' D: "$complete_D" r: "$complete_r" ||
+	_cvstargets
+	;;
+      release|re|rel) # "+Qdq"
+	_complete_opts Q '' d '' q '' || _files -/
+	;;
+      remove|rm|delete) # "+flR"
+	_complete_opts f '' l '' R '' || _cvsremovep
+	;;
+      status|st|stat) # "+vlR"
+	_complete_opts v '' l '' R '' || _cvstargets
+	;;
+      tag|ta|freeze) # "+FQqlRcdr:D:bf"
+	_complete_opts F '' Q '' q '' l '' R '' c '' d '' r: "$complete_r" \
+	  D: "$complete_D" b '' f '' ||
+	_cvstargets
+	;;
+      unedit) # "+lR"
+	_complete_opts l '' R '' || _cvstargets
+	;;
+      update|up|upd) # "+ApPflRQqduk:r:D:j:I:W:"
+	_complete_opts A '' p '' P '' f '' l '' R '' Q '' q '' d '' u '' \
+	  k: "$complete_k" r: "$complete_r" D: "$complete_D" j: "$complete_r" \
+	  I: '' W: '' ||
+	_cvstargets
+	;;
+      watch)
+	if (( CURRENT == com + 1 )); then
+	  compadd on off add remove
+	else
+	  case "$words[com+1]" in
+	    on|off) # "+lR"
+	      _complete_opts l '' R '' || _cvstargets
+	      ;;
+	    add|remove) # "+lRa:"
+	      _complete_opts l '' R '' \
+	        a: 'compadd edit unedit commit all none' || \
+	      _cvstargets
+	      ;;
+	  esac
+	fi
+	;;
+      watchers) # "+lR"
+	_complete_opts l '' R '' || _cvstargets
+	;;
+      *) _files;;
+    esac
+    return
+  fi
+
+  _complete_opts \
+    H '' Q '' q '' r '' w '' l '' n '' t '' v '' f '' a '' \
+    b: "compadd /usr/local/bin" \
+    T: "compadd $TMPPREFIX:h $TMPDIR /tmp" \
+    e: "compadd vi" \
+    d: "compadd $_cvs_roots || _files -/" \
+    z: "compadd 9'" \
+    s: "_cvs_user_variable" \
+   || 
+  compadd ${(k)commands} ||
+  compadd ${(kv)=commands}
+}
+
+_cvsrevisions () {
+  compadd - ${${${(M)${(f)"$(cvs -q status -vl .)"}:#	*}##[ 	]##}%%[ 	]*}
+}
+
+_cvsrepositories () {
+  local root=$CVSROOT
+  [[ -f CVS/Root ]] && root=$(<CVS/Root)
+
+  if [[ $root = :* || ! -d $root ]]; then
+    compadd -UX "Enter repository name" -n '' &&
+    { compstate[list]=list; compstate[force_list]=yes; compstate[insert]='' }
+  else
+    compadd - \
+      $root/^CVSROOT(:t) \
+      ${${(M)${(f)"$(<$root/CVSROOT/modules)"}:#[^#]*}%%[ 	]*}
+  fi
+}
+
+_cvsprefix () {
+  #if [[ -prefix */ ]]; then
+  if [[ x"$PREFIX" == x*/* ]]; then
+    qpref="${PREFIX%/*}/"
+    pref=$~qpref
+  else
+    qpref=
+    pref=./
+  fi
+}
+
+_cvsdirentries () {
+  setopt localoptions nullglob unset
+  if [[ -f ${pref}CVS/Entries ]]; then
+    entries=(${${${(M)${(f)"$(<${pref}CVS/Entries)"}:#D/*}#D/}%%/*})
+  else
+    entries=()
+  fi
+}
+
+_cvsentries () {
+  setopt localoptions nullglob unset
+  if [[ -f ${pref}CVS/Entries ]]; then
+    entries=(${${${${(f)"$(<${pref}CVS/Entries)"}:#D}#(D|)/}%%/*})
+  else
+    entries=()
+  fi
+}
+
+_cvsentries_modified () {
+  if (( $+_cvsentries_modified_disable_stat )) ||
+    ! { zmodload -e stat || zmodload stat }; then
+    _cvsentries
+    return
+  fi
+
+  entries=()
+  local line Entries
+  typeset -A mtime
 
-case ${+cvs_roots} in
-  0)
-    cvs_roots=()
-    if [[ -f ~/.cvspass ]]; then
-      cvs_roots=(
-	$(cut -d ' ' -f 1 ~/.cvspass)
-      )
+  if [[ -f "${pref}CVS/Entries" ]]; then
+    Entries="$(<${pref}CVS/Entries)"
+  else
+    return
+  fi
+
+  local LANG=C
+  local OLDTZ="$TZ"; if ! (( $+TZ )); then unset OLDTZ; fi; export TZ=GMT
+
+  mtime=(${(s:/:)${(j:/:)${${${${(M)${(f)Entries}:#/*}#/}%/*/*}/\\/*\\///}}})
+  entries=(${${${(M)${(f)Entries}:#D/*}#D/}%%/*})
+  builtin stat -n +mtime -F '%a %b %e %T %Y' "$pref${(@k)^mtime}" |
+  while read line
+  do
+    line=${line#$pref}
+    if [[ x"$mtime[${line%% *}]" != x"${line#* }" ]]; then
+      entries=($entries "${line%% *}")
     fi
-    ;;
-esac
-
-_complete_opts \
-  H '' Q '' q '' r '' w '' l '' n '' t '' v '' f '' a '' \
-  b: "compadd /usr/local/bin" \
-  T: "compadd $TMPPREFIX:h $TMPDIR /tmp" \
-  e: "compadd vi" \
-  d: "compadd $cvs_roots || _files -/" \
-  z: "compadd 9'" \
-  s: "_cvs_user_variable" \
- || 
-compadd ${(k)commands} ||
-compadd ${(kv)=commands}
+  done
+
+  if (( $+OLDTZ )); then TZ="$OLDTZ"; else unset TZ; fi
+}
+
+_cvsdirs () {
+  if [[ -d ${pref}CVS ]]; then
+    _cvsdirentries
+    case $#entries in
+      0) false;;
+      1) compgen "$@" -g "${entries:q}";;
+      *) compgen "$@" -g '('${(j:|:)entries:q}')';;
+    esac
+  else
+    _files
+  fi
+}
+
+_cvstargets () {
+  local qpref pref entries
+  _cvsprefix
+  if [[ -d ${pref}CVS ]]; then
+    _cvsentries
+    case $#entries in
+      0) false;;
+      1) compgen -g "${entries:q}";;
+      *) compgen -g '('${(j:|:)entries:q}')';;
+    esac
+  else
+    _files
+  fi
+}
+
+_cvstargets_modified () {
+  local qpref pref entries
+  _cvsprefix
+  if [[ -d ${pref}CVS ]]; then
+    _cvsentries_modified
+    case $#entries in
+      0) false;;
+      1) compgen -g "${entries:q}";;
+      *) compgen -g '('${(j:|:)entries:q}')';;
+    esac
+  else
+    _files 
+  fi
+}
+
+_cvsremovep () {
+  local qpref pref entries
+  _cvsprefix
+  if [[ -d ${pref}CVS ]]; then
+    _cvsentries
+    setopt localoptions unset
+    local omit
+    omit=(${pref}*(D:t))
+    eval 'entries=(${entries:#('${(j:|:)omit:q}')})'
+    compadd -P "$qpref" - ${entries:q} ||
+    _cvsdirs
+  else
+    _files
+  fi
+}
+
+_cvsaddp () {
+  local qpref pref entries
+  _cvsprefix
+  if [[ -d ${pref}CVS ]]; then
+    _cvsentries
+    setopt localoptions unset
+    local omit
+    omit=($_cvs_ignore_default ${entries:q} ${=cvsignore})
+    [[ -r ~/.cvsignore ]] && omit=($omit $(<~/.cvsignore))
+    [[ -r ${pref}.cvsignore ]] && omit=($omit $(<${pref}.cvsignore))
+    compgen -g '*~(*/|)('${(j:|:)omit}')(D)' ||
+    compgen -g '*~(*/|)('${(j:|:)entries:q}')(D)' ||
+    _cvsdirs
+  else
+    _files
+  fi
+}
+
+if (( ! $+_cvs_ignore_default )); then
+  _cvs_ignore_default=(
+    RCS SCCS CVS CVS.adm RCSLOG 'cvslog.*' tags TAGS .make.state .nse_depinfo
+    '*\~' '\#*' '.\#*' ',*' '_$*' '*$' '*.old' '*.bak' '*.BAK' '*.orig' '*.rej'
+    '.del-*' '*.a' '*.olb' '*.o' '*.obj' '*.so' '*.exe' '*.Z' '*.elc' '*.ln'
+    core
+  )
+fi
+
+if (( ! $+_cvs_roots )); then
+  if [[ -f ~/.cvspass ]]; then
+    _cvs_roots=(${${(f)"$(<~/.cvspass)"}%% *})
+  else
+    _cvs_roots=()
+  fi
+fi
+
+_cvs "$@"