unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: jari.aalto@poboxes.com (Jari Aalto+mail.linux)
Subject: [patch] 21.3 executable.find - Use cache in `executable-find'
Date: Sun, 08 Feb 2004 13:37:16 +0200	[thread overview]
Message-ID: <ad3t4xar.fsf@blue.sea.net> (raw)


It is common that searches for programs are done multiple times, so it
would be good if the precious values were cached just like bash does.
Here is patch to make this happen.

This patch supposes that my other patches have been applied
(See patch to implement `executable-command-find-unix-p')


2004-02-08 Sun  Jari Aalto  <jari.aalto <AT> poboxes.com>

        * progmodes/executable.el (executable-find-cache): New variable.
        (executable-find-sans-suffix): New function.
        (executable-find-path): Renamed. Was `executable-find'.
        (executable-find-cache): New function.
        (executable-find): Rewritten. Now utilizes cache
        `executable-find-cache'. Added new OPTIONAL parameter `no-cache'
        to force searching COMMAND again.


Index: executable.el
===================================================================
RCS file: /cygdrive/h/data/version-control/cvsroot/emacs/gnu-emacs/lisp213/progmodes/executable.el,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -IId: -u -b -w -r1.5 -r1.6
--- executable.el	3 Feb 2004 16:34:18 -0000	1.5
+++ executable.el	8 Feb 2004 11:30:11 -0000	1.6
@@ -107,6 +107,10 @@
 
 (defvar executable-command nil)
 
+(defvar executable-find-cache nil
+  "*`executable-find' cache.
+Syntax: '((program path) ...).")
+
 (defcustom executable-self-display "tail"
   "*Command you use with argument `+2' to make text files self-display.
 Note that the like of `more' doesn't work too well under Emacs \\[shell]."
@@ -205,10 +209,21 @@
          ((search-forward "find: bad option -maxdepth" nil t)
           t)))))
 
+(defun executable-find-sans-suffix (command)
+  "Return COMMAND without `executable-binary-suffixes'."
+  (let ((ext (file-name-extension command)))
+    (if (and ext
+             (member (concat "." ext) executable-binary-suffixes))
+        (file-name-sans-extension command)
+      command)))
+
+(defsubst executable-find-cache (command)
+  "Look up COMMAND from `executable-find-cache'."
+  (assoc command executable-find-cache))
+
 ;;;###autoload
-(defun executable-find (command)
-  "Search for COMMAND in exec-path and return the absolute file name.
-Return nil if COMMAND is not found anywhere in `exec-path'."
+(defun executable-find-path (command)
+  "Search for COMMAND in exec-path and return the absolute file name."
   (let ((list exec-path)
         file)
     (while list
@@ -229,6 +244,29 @@
               (cdr list))))
     file))
 
+;;;###autoload
+(defun executable-find (command &optional no-cache)
+  "Search for COMMAND in exec-path and return the absolute file name.
+Return nil if COMMAND is not found anywhere in `exec-path'.
+Optional parameter NO-CACHE says to search all PATH hierarchy
+without looking the program location from `executable-find-cache'."
+  (let (cache
+        path)
+    (unless no-cache
+      (setq path (executable-find-cache
+                  (executable-find-sans-suffix command))))
+    (unless path
+      ;;  Was not in cache, or user requested full PATH search
+      (when (setq path (executable-find-path command))
+        ;;  Record this to cache
+        (setq cache
+              (list (executable-find-sans-suffix
+                     (file-name-nondirectory command))
+                    path))))
+    (when cache
+      (push cache executable-find-cache))
+    path))
+
 (defun executable-chmod ()
   "This gets called after saving a file to assure that it be executable.
 You can set the absolute or relative mode in variable `executable-chmod' for
@@ -241,7 +279,6 @@
                                (- executable-chmod)
                              (logior executable-chmod
                                      (file-modes buffer-file-name)))))))
-
 
 (defun executable-interpret (command)
   "Run script with user-specified args, and collect output in a buffer.

-- 
http://tiny-tools.sourceforge.net/
Swatch @time   http://www.mir.com.my/iTime/itime.htm
               http://www.ryanthiessen.com/swatch/resources.htm
Use Licenses!  http://www.linuxjournal.com/article.php?sid=6225
Which Licence? http://www.linuxjournal.com/article.php?sid=4825
OSI Licences   http://www.opensource.org/licenses/

             reply	other threads:[~2004-02-08 11:37 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-02-08 11:37 Jari Aalto+mail.linux [this message]
2004-03-24 11:13 ` [patch] 21.3 executable.find - Use cache in `executable-find' Eli Zaretskii
     [not found]   ` <y8pp51f9.fsf@blue.sea.net>
2004-03-25  6:49     ` Eli Zaretskii
2004-03-25  9:14       ` Jari Aalto+mail.linux
     [not found] <mailman.2083.1076239601.928.bug-gnu-emacs@gnu.org>
2004-02-10 21:21 ` Jari Aalto+mail.linux

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ad3t4xar.fsf@blue.sea.net \
    --to=jari.aalto@poboxes.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).