;;; pcmpl-rpm.el --- functions for dealing with rpm completions
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007, 2008 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 3, 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
;; 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 <http://www.gnu.org/licenses/>.
;;; 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))
;;;###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
'("--changelog"
"--dbpath"
"--dump"
+ "--file"
"--ftpport" ;nyi for the next four
"--ftpproxy"
"--httpport"
(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")
(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")
(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