X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/a3e44e793796153ff1534be9c74fcab50b45de30..ff834ffe06e858c6d511419b5f030ef091f83032:/lisp/pcmpl-rpm.el diff --git a/lisp/pcmpl-rpm.el b/lisp/pcmpl-rpm.el index 4cf2a3055e..4e17fa378c 100644 --- a/lisp/pcmpl-rpm.el +++ b/lisp/pcmpl-rpm.el @@ -1,7 +1,6 @@ ;;; pcmpl-rpm.el --- functions for dealing with rpm completions -;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -;; 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +;; Copyright (C) 1999-2016 Free Software Foundation, Inc. ;; Package: pcomplete @@ -28,11 +27,66 @@ (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)) @@ -93,6 +147,7 @@ '("--changelog" "--dbpath" "--dump" + "--file" "--ftpport" ;nyi for the next four "--ftpproxy" "--httpport" @@ -113,6 +168,8 @@ (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") @@ -130,7 +187,9 @@ (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") @@ -314,9 +373,9 @@ (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"))))))