compare symbol names with `equal'
[bpt/emacs.git] / lisp / pcmpl-rpm.el
index 6347666..f7eac8c 100644 (file)
@@ -1,6 +1,6 @@
 ;;; pcmpl-rpm.el --- functions for dealing with rpm completions
 
-;; Copyright (C) 1999-2012 Free Software Foundation, Inc.
+;; Copyright (C) 1999-2014 Free Software Foundation, Inc.
 
 ;; Package: pcomplete
 
         (if (search-forward "--nosignature " nil t)
             (push "--nosignature" opts))))
     opts)
-  "List of extra options to add to an rpm query command."
-  :version "24.2"
-  :type '(repeat string)
+  "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:
 
-;; TODO
-;; This can be slow, so:
-;; Consider caching the result (cf woman).
-;; Consider printing an explanatory message before running -qa.
 (defun pcmpl-rpm-packages ()
   "Return a list of all installed rpm packages."
-  (split-string (apply 'pcomplete-process-result "rpm"
-                       (append '("-q" "-a") pcmpl-rpm-query-options))))
+  (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 (?).