X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/380874900ca183ec2fdce91949d841328852d7a8..455700d69a1a6861dc8c9b2ba19733429727d3c3:/lisp/pcmpl-rpm.el diff --git a/lisp/pcmpl-rpm.el b/lisp/pcmpl-rpm.el index 5855a3e5d1..4e17fa378c 100644 --- a/lisp/pcmpl-rpm.el +++ b/lisp/pcmpl-rpm.el @@ -1,14 +1,15 @@ ;;; pcmpl-rpm.el --- functions for dealing with rpm completions -;; Copyright (C) 1999, 2000, 2002, 2003, 2004, -;; 2005, 2006 Free Software Foundation, Inc. +;; Copyright (C) 1999-2016 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 +;; 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 2, or (at your option) -;; any later version. +;; 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 @@ -16,29 +17,76 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: -;; These functions provide completion rules for RedHat's `rpm' tool. +;; These functions provide completion rules for the `rpm' command. ;;; Code: -(provide 'pcmpl-rpm) - (require 'pcomplete) (defgroup pcmpl-rpm nil - "Functions for dealing with CVS completions." - :group 'pcomplete) + "Options for rpm completion." + :group 'pcomplete + :prefix "pcmpl-rpm-") + +;; rpm -qa can be slow. Adding --nodigest --nosignature is MUCH faster. +(defcustom pcmpl-rpm-query-options + (let (opts) + (with-temp-buffer + (when (ignore-errors (call-process "rpm" nil t nil "--help")) + (if (search-backward "--nodigest " nil 'move) + (setq opts '("--nodigest"))) + (goto-char (point-min)) + (if (search-forward "--nosignature " nil t) + (push "--nosignature" opts)))) + opts) + "String, or list of strings, with extra options for an rpm query command." + :version "24.3" + :type '(choice (const :tag "No options" nil) + (string :tag "Single option") + (repeat :tag "List of options" string)) + :group 'pcmpl-rpm) + +(defcustom pcmpl-rpm-cache t + "Whether to cache the list of installed packages." + :version "24.3" + :type 'boolean + :group 'pcmpl-rpm) + +(defconst pcmpl-rpm-cache-stamp-file "/var/lib/rpm/Packages" + "File used to check that the list of installed packages is up-to-date.") + +(defvar pcmpl-rpm-cache-time nil + "Time at which the list of installed packages was updated.") + +(defvar pcmpl-rpm-packages nil + "List of installed packages.") ;; Functions: -(defsubst pcmpl-rpm-packages () - (split-string (pcomplete-process-result "rpm" "-q" "-a"))) +(defun pcmpl-rpm-packages () + "Return a list of all installed rpm packages." + (if (and pcmpl-rpm-cache + pcmpl-rpm-cache-time + (let ((mtime (nth 5 (file-attributes pcmpl-rpm-cache-stamp-file)))) + (and mtime (not (time-less-p pcmpl-rpm-cache-time mtime))))) + pcmpl-rpm-packages + (message "Getting list of installed rpms...") + (setq pcmpl-rpm-cache-time (current-time) + pcmpl-rpm-packages + (split-string (apply 'pcomplete-process-result "rpm" + (append '("-q" "-a") + (if (stringp pcmpl-rpm-query-options) + (list pcmpl-rpm-query-options) + pcmpl-rpm-query-options))))) + (message "Getting list of installed rpms...done") + pcmpl-rpm-packages)) +;; Should this use pcmpl-rpm-query-options? +;; I don't think it would speed it up at all (?). (defun pcmpl-rpm-all-query (flag) (message "Querying all packages with `%s'..." flag) (let ((pkgs (pcmpl-rpm-packages)) @@ -55,11 +103,8 @@ ;;;###autoload (defun pcomplete/rpm () - "Completion for RedHat's `rpm' command. -These rules were taken from the output of `rpm --help' on a RedHat 6.1 -system. They follow my interpretation of what followed, but since I'm -not a major rpm user/builder, please send me any corrections you find. -You can use \\[eshell-report-bug] to do so." + "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 @@ -102,6 +147,7 @@ You can use \\[eshell-report-bug] to do so." '("--changelog" "--dbpath" "--dump" + "--file" "--ftpport" ;nyi for the next four "--ftpproxy" "--httpport" @@ -122,6 +168,8 @@ You can use \\[eshell-report-bug] to do so." (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") @@ -137,7 +185,11 @@ You can use \\[eshell-report-bug] to do so." (pcmpl-rpm-all-query "--requires"))))) (if (pcomplete-match "^-" 0) (pcomplete-opt "af.p(pcmpl-rpm-files)ilsdcvR") - (pcomplete-here (pcmpl-rpm-packages))))) + (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") @@ -321,11 +373,12 @@ You can use \\[eshell-report-bug] to do so." (if (pcomplete-match "^-" 0) (pcomplete-opt "v") (pcomplete-here - (if (eq mode 'test) - (pcomplete-dirs-or-entries "\\.tar\\'") - (pcomplete-dirs-or-entries "\\.spec\\'")))))) + (pcomplete-dirs-or-entries (if (eq mode 'test) + "\\.tar\\'" + "\\.spec\\'")))))) (t (error "You must select a mode: -q, -i, -U, --verify, etc")))))) -;;; arch-tag: 4e64b490-fecf-430e-b2b9-70a8ad64b8c1 +(provide 'pcmpl-rpm) + ;;; pcmpl-rpm.el ends here