From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Sat, 23 Oct 2004 07:05:33 +0400 From: Alexey Tourbin To: Sisyphus Message-ID: <20041023030533.GY2017@solemn.turbinal.org> Mail-Followup-To: Sisyphus Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="E9SPMlsjsjqOlA3h" Content-Disposition: inline Subject: [sisyphus] [#5235] zsh completion for rpm X-BeenThere: sisyphus@altlinux.ru X-Mailman-Version: 2.1.5 Precedence: list Reply-To: ALT Linux Sisyphus discussion list List-Id: ALT Linux Sisyphus discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 23 Oct 2004 03:06:25 -0000 Archived-At: List-Archive: --E9SPMlsjsjqOlA3h Content-Type: multipart/mixed; boundary="B7FF+pnjRCrp0ISR" Content-Disposition: inline --B7FF+pnjRCrp0ISR Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: quoted-printable =FA=C4=D2=C1=D7=D3=D4=D7=D5=CA=D4=C5. =F1 =CE=C1=D5=DE=C9=CC=D3=D1 =D0=D2=CF=C7=D2=C1=CD=CD=C9=D2=CF=D7=C1=D4=D8 = =CE=C1 zsh. :) =F0=D2=C5=C4=CC=C1=C7=C1=C0 =D0=D2=CF=D4=C5=D3=D4=C9=D2=CF=D7=C1=D4=D8 =CE= =CF=D7=D5=C0 (=DA=CE=C1=DE=C9=D4=C5=CC=D8=CE=CF =D0=C5=D2=C5=C4=C5=CC=C1=CE= =CE=D5=C0) =C4=CF=D0=CF=CC=CE=D1=CC=CB=D5 =C4=CC=D1 rpm. =F4=C5=D0=C5=D2=D8 =C2=D5=C4=D5=D4 =C4=CF=D0=CF=CC=CE=D1=D4= =D8=D3=D1 =CB=CF=CD=C1=CE=C4=D9 rpmbuild, rpmqurey =C9 =C4=D2. =EB=C1=CB =D0=D2=CF=DD=C5 =D7=D3=C5=C7=CF =D0=CF=C4=CB=CC=C0=DE=C9=D4=D8 = =C4=CF=D0=CF=CC=CE=D1=CC=CB=D5: $ mkdir -p ~/fpath $ cp -a _rpm ~/fpath $ echo 'typeset -U fpath' >> ~/.zshenv $ echo 'fpath=3D(~/fpath $fpath)' >> ~/.zshenv $ . ~/.zshenv $ rm -rf ~/.zcomp* $ compinit =FE=D4=CF=C2=D9 =D7=CB=CC=C0=DE=C9=CC=D3=D1 =CB=DC=DB: $ zstyle ':completion::complete:*' use-cache 1 $ echo "!!" >> ~/.zshrc =F4=CF=C7=C4=C1 =D3=D0=C9=D3=CF=CB =D5=D3=D4=C1=CE=CF=D7=CC=C5=CE=CE=D9=C8 = =D0=C1=CB=C5=D4=CF=D7 =D3=CF=C8=D2=C1=CE=C9=D4=D3=D1 =D7 ~/.zcomcache/, =CB=DC=DB =C1=D7=D4=CF=CD=C1=D4=C9=DE=C5=D3=CB=C9 =CF=C2=CE=CF=D7=CC=D1=C5= =D4=D3=D1 =D0=D2=C9 =C9=DA=CD=C5=CE=C5=CE=C9=C9 =C2=C1=DA=D9 rpm =C9/=C9=CC= =C9 apt. =F0=D2=C9=CD=C5=D2 =C4=CF=D0=CF=CC=CE=C5=CE=C9=D1: $ rpm --eval %co %compress_docs %configure $ rpm --eval %con $ rpm --eval %configure Known bugs: --target =CB=C1=CB =D3=CC=C5=C4=D5=C5=D4 =CE=C5 =C4=CF=D0=CF=CC= =CE=D1=C5=D4=D3=D1. =EB=C1=CB =CF=CE=CF =D4=C5=D0=C5=D2=D8 =C2=D5=C4=C5=D4 =D2=C1=C2=CF=D4=C1= =D4=D8. =F7 =CD=C1=D3=D3=C9=D7=C1=C8 rpmb_opts0, rpmq_opts0 =C9 =C4=D2. =CC=C5=D6=C1=D4 =CF=D0=C3=C9=C9 =CB=CF=CD=C1=CE=C4=CE=CF=CA =D3=D4=D2=CF=CB= =C9, =CB=CF=D4=CF=D2=D9=C5 =C9=C4=C5=CE=D4=C9=C6=C9=C3=C9=D2=D5=C0=D4 =D3= =CF=CF=D4=D7=C5=D4=D3=D4=D7=D5=C0=DD=C9=CA =D2=C5=D6=C9=CD. =F4.=C5. =D7 rpmb_opts0 =CE=C1=C8=CF=C4=D1=D4=D3=D1 =CF=D0=C3=C9=C9 =D4=C9= =D0=C1 (-bc, -bb, -ba), =D7 rpmq_opts0 -- =CF=D0=C3=C9=C9 =D4=C9=D0=C1 (-qa, -qi). =F7 =CD=C1=D3=D3=C9=D7=C1=C8 rpmb= _opts1, rpmq_opts1 =CC=C5=D6=C1=D4 =C4=CF=D0=CF=CC=CE=C9=D4=C5=CC=D8=CE=D9=C5 =CF=D0=C3=C9=C9 =C4=CC=D1 =D3=CF= =CF=D4=D7=C5=D4=D3=D4=D7=D5=C0=DD=C5=C7=CF =D2=C5=D6=C9=CD=C1, =CE=C1=D0=D2= =C9=CD=C5=D2 --short-circut =C4=CC=D1 rpmb =C9 --lastchange =C4=CC=D1 rpmq. =F3=CD=D9=D3=CC =D7 =D4=CF=CD, =DE=D4=CF =D0=D2=C9 =C9=D3=D0=CF=CC=D8=DA=CF= =D7=C1=CE=C9=C9 =D3=D0=C5=C3=C9=C1=CC=C9=DA=C9=D2=CF=D7=C1=CE=CE=D9=C8 =CB= =CF=CD=C1=CE=C4 (rpmbuild, rpmquery) =D3=CF=CF=D4=D7=C5=D4=D3=D4=D7=D5=C0=DD=C9=C5 =CF=D0=C3=C9=C9 opt= s0 =C9 opts1 =CD=CF=D6=CE=CF =C2=D5=C4=C5=D4 =D3=CB=C1=D2=CD=CC=C9=D7=C1=D4= =D8 =D7 =CC=C0=C2=CF=CD =D0=CF=D2=D1=C4=CB=C5. =F0=D2=C9 =C9=D3=D0=CF=CC=D8=DA=CF= =D7=C1=CE=C9=C9 rpm =D3=CE=C1=DE=C1=CC=C1 =CE=D5=D6=CE=CF =C2=D5=C4=C5=D4 = =DA=C1=C4=C1=D4=D8 =D2=C5=D6=C9=CD =D3 =D0=CF=CD=CF=DD=D8=C0 opts0, =C1 =DA=C1=D4=C5=CD =D5=D6=C5 =D0=CF=C4=CB=CC= =C0=DE=C9=D4=D3=D1 =D3=CF=CF=D4=D7=C5=D4=D3=D4=D7=D5=C0=DD=C9=CA opts1. =F4.=C5. =CD=CF=D6=CE=CF =C2=D5=C4=C5=D4 =C4=CF=D0=CF=CC=CE=D1=D4=D8=20 $ rpmbuild --short-circuit -ba ... =CE=CF =CE=C5 $ rpm --short-circuit -ba ... =C1 =D4=CF=CC=D8=CB=CF $ rpm -ba --short-circuit ... =FC=D4=CF =CF=C7=D2=C1=CE=C9=DE=C5=CE=C9=C5 =CD=CF=D6=CE=CF =CB=C1=CB-=D4= =CF =CF=C2=CF=CA=D4=C9, =CE=CF =D1 =D0=CF=CB=C1 =CE=C5 =DA=CE=C1=C0 =CB=C1= =CB. rpmpopt -- =C8=C9=D4=D2=C1=D1 =DB=D4=D5=CB=C1. =EE=C1=D0=D2=C9=CD=C5=D2 $ rpm -qg Editors =C9 $ rpm -gq Editors =D2=C1=C2=CF=D4=C1=C0=D4 =CF=C4=C9=CE=C1=CB=CF=D7=CF =C8=CF=D2=CF=DB=CF, = =D4=C1=CB=D6=C5 =CB=C1=CB =C9 (=D5=D6=C5 =D7 =C4=D2=D5=C7=CF=CD =D2=C5=D6= =C9=CD=C5) $ rpm -Vg Editors $ rpm -gV Editors =C1 =D7 =C4=D2=D5=C7=C9=C8 =D3=CC=D5=DE=C1=D1=C8 -g =CE=C5 =D2=C1=C2=CF=D4= =C1=C5=D4. =EB=D3=D4=C1=D4=C9 =C7=D2=D5=D0=D0=D9 =D4=CF=D6=C5 =C4=CF=D0=CF=CC=CE=D1=C0= =D4=D3=D1: $ rpm -qg D $ rpm -qg De $ rpm -qg Development/ $ rpm -qg Development/ C Functional KDE\ and\ QT Objective-C Ruby C++ GNOME\ and\ GTK+ Kernel Other Sch= eme Databases Haskell Lisp Perl Tcl Debuggers Java ML Python =F6=C4=D5 =DA=C1=CD=C5=DE=C1=CE=C9=CA. --B7FF+pnjRCrp0ISR Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=_rpm Content-Transfer-Encoding: quoted-printable #compdef rpm rpmb rpmd rpme rpmi rpmk rpmq rpmt=3Drpmb rpmu=3Drpmi rpmv rpm= build=3Drpmb rpmdb=3Drpmd rpmquery=3Drpmq rpmsign=3Drpmk rpmverify=3Drpmv # This uses `_arguments' in a state-machine kind of way. These states # have names and before executing the default action for such a state # we try to call a function with the name `_rpm_'. If such a # function exists, we return with its return status immediately. This # allows users to override the default completions by simply defining # these functions. # The states (and possible values for the `' above) are: # # query # complete for `rpm -q' query # verify # complete for `rpm --verify' # install # complete for `rpm -i' or `rpm --install' # upgrade # complete for `rpm -U' or `rpm --upgrade' # uninstall # complete for `rpm -e' or `rpm --erase' # build_b # complete for `rpm -bx' (the stage `x' is already completed) # build_t # complete for `rpm -tx' (the stage `x' is already completed) # sigcheck # complete for `rpm --sigcheck' # rebuild # complete for `rpm --rebuild' # package # complete a RPM package name # package_file # complete a RPM package file name # tags # complete a tag name # capability # complete a capability # relocate # complete a `old=3Dnew' pair of paths _rpm () { local curcontext=3D"$curcontext" state lstate line nm=3D"$compstate[nmatc= hes]" typeset -A opt_args local ret=3D1 local -a tmp expl local -a common_opts common_opts=3D( -{\?,-help}'[print help information]' '--version[print the version of rpm being used]' '(-v --verbose)--quiet[provide less detailed output]' '(--quiet)*'-{v,-verbose}'[provide more detailed output]' '--define[define macro with value ]:' '--eval[print macro expansion]:macro:->macros' -{r,-root}'[use as the top level directory]:rpm root directory:_f= iles -/' '--dbpath[use as the directory for the database]:rpm database pat= h:_files -/' '--macros[read instead of default macro file(s)]:resource fi= le:_files' '--rcfile[read instead of default rpmrc file(s)]:resource fi= le:_files' '--showrc[display final rpmrc and macro configuration]' =20 '--ftpproxy:ftp proxy server:_hosts' '--ftpport:ftp port number' '--httpproxy:http proxy server:_hosts' '--httpport:http port number' '--pipe:pipe command:->command' ) local -a rpmb_opts0 rpmb_opts1 rpmb_opts0=3D( '(-t)-b+[build mode (spec file)]:build stage:((p\:execute\ \%prep\ stag= e l\:do\ a\ list\ check c\:execute\ build\ stage i\:execute\ install\ stage= b\:build\ a\ binary\ package a\:build\ binary\ and\ source\ packages)):*:b= uild:->build_b' \ '(-b)-t+[build mode (tar file)]:build stage:((p\:execute\ \%prep\ stage= l\:do\ a\ list\ check c\:execute\ build\ stage i\:execute\ install\ stage = b\:build\ a\ binary\ package a\:build\ binary\ and\ source\ packages)):*:bu= ild:->build_t' \ '(-b -t --recompile)--rebuild[build binary package from source package]= :*:source rpm file:->build_src' '(-b -t --rebuild)--recompile[build through %install from source packag= e]:*:source rpm file:->build_src' ) rpmb_opts1=3D( --{with,enable}'[enable configure option for build]:' --{without,disable}'[disable configure option for build]:' '--target:specify a build target:->target' '--buildroot:build root directory:_files -/' '--buildarch:architecture for which to build:->target' '--buildos:operating system for which to build:' '--short-circuit[skip straight to specified stage]' --{clean,nobuild,rmsource,sign,test} ) # package selection options of which only one can be used local -a selectopts sopts selectopts=3D( -{a,-all}'[query all packages]' -{f,-file}'[query packages that own specified files]' -{p,-package}'[query uninstalled packages]' -{g,-group}'[query packages in one of specified groups]' --fileid --hdrid --pkgid --tid --querybynumber --triggeredby --whatprovides --whatrequires ) sopts=3D${selectopts%\[*}\ --specfile selectopts=3D( "(* $sopts)"${selectopts[1,2]} "($sopts)"${selectopts[3,-1]} '(-a --all)*: :->package-select' ) local -a rpmdb_opts0 rpmdb_opts1 rpmd_opts0=3D( '--initdb[initialize database]' '--rebuilddb[rebuild database]' ) rpmd_opts1=3D( # none so far ) local -a rpme_opts0 rpme_opts1 rpme_opts0=3D( '(-e --erase)'-{e+,-erase}'[uninstall mode]:*:uninstall:->= uninstall' ) rpme_opts1=3D( --{allmatches,justdb,repackage,test} --no{deps,scripts,pre= un,postun,trigger{s,un,postun}} ) local -a rpmi_opts0 rpmi_opts1 rpmi_opts0=3D( '(-i --install)'-{i+,-install}'[install mode]:*:install:->install' '(-U --upgrade)'-{U+,-upgrade}'[upgrade mode]:*:upgrade:->upgrade' '(-F --freshen)'-{F+,-freshen}'[freshen mode]:*:upgrade:->upgrade' ) rpmi_opts1=3D( '--excludepath:file to exclude:_files -/' '--relocate:relocate:->relocate' '--prefix:package prefix directory:_files -/' '(-h --hash)'-{h,-hash} '(--replacepkgs --replacefiles --oldpackage)--force' '(--force)--'{replacefiles,replacepkgs} --{aid,allfiles,badreloc,excludedocs,ignorearch,ignoreos,ignoresize,inc= ludedocs,justdb,percent,repackage,test} --np{digest,signature,deps,suggest,order,pre,post,preun,postun,trigger{= s,in,un,postun}} '(--nopre --nopost --nopreun --nopostun)--noscripts' ) local -a rpmk_opts0 rpmk_opts1 rpmk_opts0=3D(=20 '(-K --checksig)'-{K+,-checksig}'[signature check mode]:*:sigcheck:->si= gcheck' '(--resign --addsign)'--{resign,addsign}':*:package:->package_file' ) rpmk_opts1=3D( --no{gpg,pgp,md5,signature,digest} ) local -a rpmq_opts0 rpmq_opts1 rpmq_opts0=3D( -{q+,-query}'[query mode]:*:query:->query' --querytags ) rpmq_opts1=3D( # --dump requires one of -{l,c,d} # --triggers requires --script "${(@)selectopts}" "($sopts)--specfile[query specified spec file as if it were a package]" '(-i --info)'{-i,--info}'[display package information]' '--changelog[display change log]' '--lastchange[display last changelog entry]' '(-s --state -l --list --filesbypkg)'{-l,--list}'[display package file = list]' '(-s --state -l --list --filesbypkg)'{-s,--state}'[show file states]' '(-s --state -l --list)--filesbypkg[list files with package names]' -{d,-docfiles}'[documentation files only]' -{c,-configfiles}'[configuration files only]' '--dump[show all information]' '--provides[show capabilities provided]' \*--{qf,queryformat}'[specify format for package information]:rpm query= format:->tags' -{R,-requires}'[list dependencies]' '--scripts[show (un)install scripts]' {--triggers,--triggerscripts}'[show trigger scripts]' ) local -a rpmv_opts0 rpmv_opts1 rpmv_opts0=3D( '(-V -y --verify)'{-V+,-y+,--verify}'[verify mode]:*:verif= y:->verify' ) rpmv_opts1=3D( "${(@)selectopts}" --no{deps,files,scripts,digest,signatur= e,linkto,md5,size,user,group,mtime,mode,rdev} ) case "$service" in rpmq) state=3Dquery ;& rpmv) state=3Dverify ;& rpm?) local service_opts0=3D"${service}_opts0" service_opts1=3D"${service}_op= ts1" _arguments -C -s "${(@)common_opts}" "${(P@)service_opts0}" "${(P@)serv= ice_opts1}" && ret=3D0 ;; rpm) _arguments -C -s "${(@)common_opts}" "${(@)rpmb_opts0}" "${(@)rpmd_opts= 0}" "${(@)rpme_opts0}" \ "${(@)rpmi_opts0}" "${(@)rpmk_opts0}" "${(@)rpmq_opts0}" "${(@)rpmv_o= pts0}" \ '--setperms[set file permissions]:*:package:->setattrs' \ '--setugids[set file owner/group]:*:package:->setattrs' \ && ret=3D0 ;; esac not_opts() { local var=3D"$1" print -l -- "\!${(@)^${(@)${(@)${(@)${(P@)var%%[[:]*}#*)}%[+-]}#\*}}" } # As long as we have a state name... while [[ -n "$state" ]]; do # First try to call a user-defined function. _call_function ret _rpm_$state && return ret # Copy the state and reset `state', to simplify the test above. lstate=3D"$state" state=3D'' tmp=3D() # Dispatch... case "$lstate" in query) _arguments -s "${(@)common_opts}" "${(f@)$(not_opts rpmq_opts0)}" "${= (@)rpmq_opts1}" && ret=3D0 ;; setattrs) _arguments -s --set{perm,ugids} "${selectopts[@]}" && ret =3D 0 ;; verify) _arguments -s "${(@)common_opts}" "${(f@)$(not_opts rpmv_opts0)}" "${= (@)rpmv_opts1}" \ ;; install|upgrade) _arguments -s "${(@)common_opts}" "${(f@)$(not_opts rpmi_opts0)}" "${= (@)rpmi_opts1}" \ '*:package file:->package_file' && ret=3D0 ;; uninstall) _arguments -s "${(@)common_opts}" "${(f@)$(not_opts rpme_opts0)}" "${= (@)rpme_opts1}" \ '*:package:->package' && ret=3D0 ;; build_b) _arguments -s "${(@)common_opts}" "${(f@)$(not_opts rpmb_opts0)}" "${= (@)rpmb_opts1}" \ '*:spec file:_files -g "*.spec(-.)"' && ret=3D0 ;; build_t) _arguments -s "${(@)common_opts}" "${(f@)$(not_opts rpmb_opts0)}" "${= (@)rpmb_opts1}" \ '*:tar file:_files -g "*.(#i)(tar|tar.gz|tar.bz2|tgz)(-.)"' && ret= =3D0 ;; build_src) _arguments -s "${(@)common_opts}" "${(f@)$(not_opts rpmb_opts0)}" "${= (@)rpmb_opts1}" \ '*:source package file:_files -g "(#i)*.src.rpm(-.)"' && ret=3D0 ;; sigcheck) _arguments -s "${(@)common_opts}" "${(f@)$(not_opts rpmk_opts0)}" "${= (@)rpmk_opts1}" \ '*:package file:->package_file' && ret=3D0 ;; package-select) case "${opt_args[(i)${sopts// /|}]}" in -f|--file) _files ;; -p|--package) state=3Dpackage_file ;; -g|--group) state=3Dgroups ;; --fileid|--pkgid) _message -e md5 md5 ;; --hdrid) _message -e sha1 sha1 ;; --querybynumber) _message -e value number ;; --what*) state=3Dcapabilities ;; --specfile) state=3Dspec_files ;; *) state=3Dpackage ;; esac ;; macros) local -a macros local mfile for mfile in {/usr/lib/rpm/{,*/}macros,/etc/rpm/macros{,.d/*},~/.rpmm= acros}(-.N); do macros+=3D( ${${(M)${(f)"$(<$mfile)"}:#%[^\{]*}%%[[:blank:]]*} ) done if zstyle -t ":completion:${curcontext}:macros" prefix-hidden; then macros=3D( ${macros#%} ) _wanted macros expl macro compadd -p '%' -a - macros else _wanted macros expl macro compadd -a - macros fi ;; command) compset -q _normal ;; target) if [[ ${+_rpm_targets} -eq 0 ]]; then typeset -gaU _rpm_targets _rpm_targets=3D( ${${(M)${(f)"$(_call_programs targets rpm --showrc)"}:#co= mpatible archs*}##*: } ) fi _wanted targets expl 'target platform' compadd -a - _rpm_targets && r= et=3D0 ;; groups) if [[ ${+_rpm_groups} -eq 0 ]]; then typeset -gaU _rpm_groups _rpm_groups=3D( "${(f)$(/dev/null)}#RPMTAG= _}" && ret=3D0 else _message -e formats 'rpm query format' fi ;; capabilities) _wanted capabilities expl capability compadd \ ${(f)"$(_call_program capabilities rpm -qa --queryformat '%\{requirename= }\\n' 2>/dev/null)"} ;; relocate) if compset -P '*=3D'; then _description directories expl 'new path' else _description directories expl 'old path' fi _files "$expl[@]" -/ && ret=3D0 ;; esac [[ ret -eq 0 || $nm -ne $compstate[nmatches] ]] && return 0 done return ret } _rpm "$@" --B7FF+pnjRCrp0ISR-- --E9SPMlsjsjqOlA3h Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFBecp9fBKgtDjnu0YRAt3mAJ4hDRonzEPsxiW1+u9GN/4rKbCNTQCeKtFx pVaKw1mydnZ/QwMm6rShSq8= =RpCm -----END PGP SIGNATURE----- --E9SPMlsjsjqOlA3h--