123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- ;;; pcmpl-rpm.el --- functions for dealing with rpm completions
- ;; Copyright (C) 1999-2012 Free Software Foundation, Inc.
- ;; Package: pcomplete
- ;; This file is part of GNU Emacs.
- ;; GNU Emacs is free software: you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation, either version 3 of the License, or
- ;; (at your option) any later version.
- ;; GNU Emacs is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
- ;; You should have received a copy of the GNU General Public License
- ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
- ;;; Commentary:
- ;; These functions provide completion rules for the `rpm' command.
- ;;; Code:
- (require 'pcomplete)
- ;; Functions:
- ;; FIXME rpm -qa can be slow, so:
- ;; Adding --nodigest --nosignature is MUCH faster.
- ;; (Probably need to test --help for those options though.)
- ;; Consider caching the result (cf woman).
- ;; Consider printing an explanatory message before running -qa.
- ;;
- ;; Seems pointless for this to be a defsubst.
- (defsubst pcmpl-rpm-packages ()
- (split-string (pcomplete-process-result "rpm" "-q" "-a")))
- (defun pcmpl-rpm-all-query (flag)
- (message "Querying all packages with `%s'..." flag)
- (let ((pkgs (pcmpl-rpm-packages))
- (provs (list t)))
- (while pkgs
- (nconc provs (split-string
- (pcomplete-process-result
- "rpm" "-q" (car pkgs) flag)))
- (setq pkgs (cdr pkgs)))
- (pcomplete-uniqify-list (cdr provs))))
- (defsubst pcmpl-rpm-files ()
- (pcomplete-dirs-or-entries "\\.rpm\\'"))
- ;;;###autoload
- (defun pcomplete/rpm ()
- "Completion for the `rpm' command."
- ;; Originally taken from the output of `rpm --help' on a Red Hat 6.1 system.
- (let (mode)
- (while (<= pcomplete-index pcomplete-last)
- (unless mode
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (pcomplete-here*
- '("--addsign"
- "--checksig"
- "--erase"
- "--help"
- "--initdb"
- "--install"
- "--pipe"
- "--querytags"
- "--rebuild"
- "--rebuilddb"
- "--recompile"
- "--resign"
- "--rmsource"
- "--setperms"
- "--setugids"
- "--upgrade"
- "--verify"
- "--version"))
- (pcomplete-opt "vqVyiUebtK")))
- ; -b<stage> <spec>
- ; -t<stage> <tarball> - build package, where <stage> is one of:
- ; p - prep (unpack sources and apply patches)
- ; l - list check (do some cursory checks on %files)
- ; c - compile (prep and compile)
- ; i - install (prep, compile, install)
- ; b - binary package (prep, compile, install, package)
- ; a - bin/src package (prep, compile, install, package)
- (cond
- ((or (eq mode 'query)
- (pcomplete-match "-[^-]*q"))
- (setq mode 'query)
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (progn
- (pcomplete-here*
- '("--changelog"
- "--dbpath"
- "--dump"
- "--file"
- "--ftpport" ;nyi for the next four
- "--ftpproxy"
- "--httpport"
- "--httpproxy"
- "--provides"
- "--queryformat"
- "--rcfile"
- "--requires"
- "--root"
- "--scripts"
- "--triggeredby"
- "--whatprovides"
- "--whatrequires"))
- (cond
- ((pcomplete-test "--dbpath")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--queryformat")
- (pcomplete-here*))
- ((pcomplete-test "--rcfile")
- (pcomplete-here* (pcomplete-entries)))
- ((pcomplete-test "--file")
- (pcomplete-here* (pcomplete-entries)))
- ((pcomplete-test "--root")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--scripts")
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (pcomplete-here* '("--triggers"))))
- ((pcomplete-test "--triggeredby")
- (pcomplete-here* (pcmpl-rpm-packages)))
- ((pcomplete-test "--whatprovides")
- (pcomplete-here*
- (pcmpl-rpm-all-query "--provides")))
- ((pcomplete-test "--whatrequires")
- (pcomplete-here*
- (pcmpl-rpm-all-query "--requires")))))
- (if (pcomplete-match "^-" 0)
- (pcomplete-opt "af.p(pcmpl-rpm-files)ilsdcvR")
- (if (pcomplete-test "-[^-]*p" 'first 1)
- (pcomplete-here (pcmpl-rpm-files))
- (if (pcomplete-test "-[^-]*f" 'first 1)
- (pcomplete-here* (pcomplete-entries))
- (pcomplete-here (pcmpl-rpm-packages)))))))
- ((pcomplete-test "--pipe")
- (pcomplete-here* (funcall pcomplete-command-completion-function)))
- ((pcomplete-test "--rmsource")
- (pcomplete-here* (pcomplete-entries))
- (throw 'pcomplete-completions nil))
- ((pcomplete-match "\\`--re\\(build\\|compile\\)\\'")
- (pcomplete-here (pcmpl-rpm-files))
- (throw 'pcomplete-completions nil))
- ((pcomplete-match "\\`--\\(resign\\|addsign\\)\\'")
- (while (pcomplete-here (pcmpl-rpm-files))))
- ((or (eq mode 'checksig)
- (pcomplete-test "--checksig"))
- (setq mode 'checksig)
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (progn
- (pcomplete-here*
- '("--nopgp"
- "--nogpg"
- "--nomd5"
- "--rcfile"))
- (cond
- ((pcomplete-test "--rcfile")
- (pcomplete-here* (pcomplete-entries)))))
- (if (pcomplete-match "^-" 0)
- (pcomplete-opt "v")
- (pcomplete-here (pcmpl-rpm-files)))))
- ((or (eq mode 'rebuilddb)
- (pcomplete-test "--rebuilddb"))
- (setq mode 'rebuilddb)
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (progn
- (pcomplete-here*
- '("--dbpath"
- "--root"
- "--rcfile"))
- (cond
- ((pcomplete-test "--dbpath")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--root")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--rcfile")
- (pcomplete-here* (pcomplete-entries)))))
- (if (pcomplete-match "^-" 0)
- (pcomplete-opt "v")
- (pcomplete-here))))
- ((memq mode '(install upgrade))
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (progn
- (pcomplete-here*
- (append
- '("--allfiles"
- "--badreloc"
- "--dbpath"
- "--excludedocs"
- "--excludepath"
- "--force"
- "--hash"
- "--ignorearch"
- "--ignoreos"
- "--ignoresize"
- "--includedocs"
- "--justdb"
- "--nodeps"
- "--noorder"
- "--noscripts"
- "--notriggers")
- (if (eq mode 'upgrade)
- '("--oldpackage"))
- '("--percent"
- "--prefix"
- "--rcfile"
- "--relocate"
- "--replacefiles"
- "--replacepkgs"
- "--root")))
- (cond
- ((pcomplete-test "--dbpath")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--relocate")
- (pcomplete-here*))
- ((pcomplete-test "--rcfile")
- (pcomplete-here* (pcomplete-entries)))
- ((pcomplete-test "--excludepath")
- (pcomplete-here* (pcomplete-entries)))
- ((pcomplete-test "--root")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--prefix")
- (pcomplete-here* (pcomplete-dirs)))))
- (if (pcomplete-match "^-" 0)
- (pcomplete-opt "vh")
- (pcomplete-here (pcmpl-rpm-files)))))
- ((or (pcomplete-test "--install")
- (pcomplete-match "-[^-]*i"))
- (setq mode 'install))
- ((or (pcomplete-test "--upgrade")
- (pcomplete-match "-[^-]*U"))
- (setq mode 'upgrade))
- ((or (eq mode 'erase)
- (pcomplete-test "--erase")
- (pcomplete-match "-[^-]*e"))
- (setq mode 'erase)
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (progn
- (pcomplete-here*
- '("--allmatches"
- "--dbpath"
- "--justdb"
- "--nodeps"
- "--noorder"
- "--noscripts"
- "--notriggers"
- "--rcfile"
- "--root"))
- (cond
- ((pcomplete-test "--dbpath")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--rcfile")
- (pcomplete-here* (pcomplete-entries)))
- ((pcomplete-test "--root")
- (pcomplete-here* (pcomplete-dirs)))))
- (if (pcomplete-match "^-" 0)
- (pcomplete-opt "v")
- (pcomplete-here (pcmpl-rpm-packages)))))
- ((or (eq mode 'verify)
- (pcomplete-test "--verify"))
- (setq mode 'verify)
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (progn
- (pcomplete-here*
- '("--dbpath"
- "--nodeps"
- "--nofiles"
- "--nomd5"
- "--rcfile"
- "--root"
- "--triggeredby"
- "--whatprovides"
- "--whatrequires"))
- (cond
- ((pcomplete-test "--dbpath")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--rcfile")
- (pcomplete-here* (pcomplete-entries)))
- ((pcomplete-test "--root")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--triggeredby")
- (pcomplete-here* (pcmpl-rpm-packages)))
- ((pcomplete-test "--whatprovides")
- (pcomplete-here*
- (pcmpl-rpm-all-query "--provides")))
- ((pcomplete-test "--whatrequires")
- (pcomplete-here*
- (pcmpl-rpm-all-query "--requires")))))
- (if (pcomplete-match "^-" 0)
- (pcomplete-opt "af.p(pcmpl-rpm-files)v")
- (pcomplete-here (pcmpl-rpm-packages)))))
- ((or (memq mode '(build test))
- (pcomplete-match "\\`-[bt]"))
- (setq mode (if (pcomplete-match "\\`-b")
- 'build
- 'test))
- (if (pcomplete-match "^--\\(.*\\)" 0)
- (progn
- (pcomplete-here*
- '("--buildroot"
- "--clean"
- "--nobuild"
- "--rcfile"
- "--rmsource"
- "--short-circuit"
- "--sign"
- "--target"
- "--timecheck"))
- (cond
- ((pcomplete-test "--buildroot")
- (pcomplete-here* (pcomplete-dirs)))
- ((pcomplete-test "--rcfile")
- (pcomplete-here* (pcomplete-entries)))
- ((pcomplete-test "--timecheck")
- (pcomplete-here*))))
- (if (pcomplete-match "^-" 0)
- (pcomplete-opt "v")
- (pcomplete-here
- (pcomplete-dirs-or-entries (if (eq mode 'test)
- "\\.tar\\'"
- "\\.spec\\'"))))))
- (t
- (error "You must select a mode: -q, -i, -U, --verify, etc"))))))
- (provide 'pcmpl-rpm)
- ;;; pcmpl-rpm.el ends here
|