]> code.delx.au - gnu-emacs/blobdiff - lisp/pcmpl-rpm.el
CC Mode: truncate the semi-nonlit cache when applying syntax-table to a quote
[gnu-emacs] / lisp / pcmpl-rpm.el
index 475215b162257d5257a73f31b875f8f051d0808d..4e17fa378cbaf1e30c559786e14a86cf02a272e2 100644 (file)
@@ -1,6 +1,6 @@
 ;;; pcmpl-rpm.el --- functions for dealing with rpm completions
 
-;; Copyright (C) 1999-201 Free Software Foundation, Inc.
+;; Copyright (C) 1999-2016 Free Software Foundation, Inc.
 
 ;; Package: pcomplete
 
 
 (require 'pcomplete)
 
+(defgroup pcmpl-rpm nil
+  "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))
               '("--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")
              (pcomplete-opt "af.p(pcmpl-rpm-files)ilsdcvR")
            (if (pcomplete-test "-[^-]*p" 'first 1)
                (pcomplete-here (pcmpl-rpm-files))
-             (pcomplete-here (pcmpl-rpm-packages))))))
+              (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"))))))