[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/el-search 6e6013a 159/332: Fix and speed up the `change
From: |
Stefan Monnier |
Subject: |
[elpa] externals/el-search 6e6013a 159/332: Fix and speed up the `change' pattern type |
Date: |
Tue, 1 Dec 2020 15:48:34 -0500 (EST) |
branch: externals/el-search
commit 6e6013a61a025a775b1780f2698eb9ed1ec59a3d
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>
Fix and speed up the `change' pattern type
---
el-search-x.el | 68 ++++++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 52 insertions(+), 16 deletions(-)
diff --git a/el-search-x.el b/el-search-x.el
index 328f631..a03b225 100644
--- a/el-search-x.el
+++ b/el-search-x.el
@@ -192,10 +192,25 @@ The default value is nil."
:type '(choice (const :tag "No transformer" nil)
(function :tag "User specified function")))
+(defalias 'el-search--file-truename
+ ;; We call `file-truename' very often and it's quite slow
+ (el-search-with-short-term-memory #'file-truename))
+
+(defun el-search--changed-files-in-repo (repo-root-dir &optional commit)
+ "Return a list of files that changed relative to COMMIT.
+COMMIT defaults to HEAD."
+ (cl-callf or commit "HEAD")
+ (let ((default-directory repo-root-dir))
+ (mapcar #'expand-file-name
+ (split-string
+ (shell-command-to-string
+ (format "git diff -z --name-only %s --" (shell-quote-argument
commit)))
+ "\0" t))))
+
(defun el-search--changes-from-diff-hl (revision)
"Return a list of changed regions (as conses of positions) since REVISION.
Use variable `el-search--cached-changes' for caching."
- (let ((buffer-file-name (file-truename buffer-file-name))) ;shouldn't be
necessary, but it is...
+ (let ((buffer-file-name (el-search--file-truename buffer-file-name)))
;shouldn't be necessary, but it is...
(if (and (consp el-search--cached-changes)
(equal (car el-search--cached-changes)
(list revision (visited-file-modtime))))
@@ -258,7 +273,7 @@ Use variable `el-search--cached-changes' for caching."
(defun el-search--file-changed-p (file rev)
;; FIXME: it would be better to calculate once a list of all changed
;; files in the repository
- (cl-callf file-truename file)
+ (cl-callf el-search--file-truename file)
(when-let ((backend (vc-backend file)))
(ignore-errors
(let ((default-directory (file-name-directory file))
@@ -270,18 +285,33 @@ Use variable `el-search--cached-changes' for caching."
(= 1 (vc-call-backend backend 'diff (list file) rev nil
(current-buffer)))))))))
(defun el-search-change--heuristic-matcher (&optional revision)
- (let ((test (el-search-with-short-term-memory
- (lambda (file-name-or-buffer)
- (require 'vc)
- (when-let ((file (if (stringp file-name-or-buffer)
- file-name-or-buffer
- (buffer-file-name file-name-or-buffer))))
- (let ((default-directory (file-name-directory file)))
- (el-search--file-changed-p
- file
- (funcall el-search-change-revision-transformer-function
- (or revision "HEAD") file))))))))
- (lambda (file-name-or-buffer _) (funcall test file-name-or-buffer))))
+ (let* ((get-changed-files-in-repo
+ (el-search-with-short-term-memory
#'el-search--changed-files-in-repo))
+ (file-changed-p (el-search-with-short-term-memory
+ (lambda (file-name-or-buffer)
+ (require 'vc)
+ (when-let ((file (if (stringp file-name-or-buffer)
+ file-name-or-buffer
+ (buffer-file-name
file-name-or-buffer))))
+ (cl-callf el-search--file-truename file)
+ (let ((default-directory (file-name-directory
file)))
+ (when-let ((backend (vc-backend file))
+ (root-dir
+ (condition-case err
+ (vc-call-backend backend 'root
default-directory)
+ (vc-not-supported
+ (unless (eq (cadr err) 'root)
+ (signal (car err) (cdr err)))
+ nil))))
+ (cl-some
+ (apply-partially #'file-equal-p file)
+ (funcall get-changed-files-in-repo
+ root-dir
+ (funcall (or
el-search-change-revision-transformer-function
+ (lambda (rev _) rev))
+ (or revision "HEAD")
+ file))))))))))
+ (lambda (file-name-or-buffer _) (funcall file-changed-p
file-name-or-buffer))))
(el-search-defpattern change (&optional revision)
"Matches the object if its text is part of a file change.
@@ -289,7 +319,10 @@ Use variable `el-search--cached-changes' for caching."
Requires library \"diff-hl\". REVISION defaults to the file's
repository's HEAD commit and is a revision string. Customize
`el-search-change-revision-transformer-function' to control how
-REVISION is interpreted."
+REVISION is interpreted.
+
+This pattern-type does currently only work for git versioned
+files."
(declare (heuristic-matcher #'el-search-change--heuristic-matcher))
`(guard (el-search--change-p (point) ,(or revision "HEAD"))))
@@ -299,7 +332,10 @@ REVISION is interpreted."
Requires library \"diff-hl\". REVISION defaults to the file's
repository's HEAD commit and is a revision string. Customize
`el-search-change-revision-transformer-function' to control how
-REVISION is interpreted."
+REVISION is interpreted.
+
+This pattern-type does currently only work for git versioned
+files."
(declare (heuristic-matcher #'el-search-change--heuristic-matcher))
`(guard (el-search--changed-p (point) ,(or revision "HEAD"))))
- [elpa] externals/el-search 0c2f0e5 127/332: Don't use the non-word "heuristical", (continued)
- [elpa] externals/el-search 0c2f0e5 127/332: Don't use the non-word "heuristical", Stefan Monnier, 2020/12/01
- [elpa] externals/el-search a38665c 115/332: Add section "Patterns for stylistic rewriting" and pattern `iffy-if', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 8fdb91d 124/332: New command `el-search-load-path', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 4202501 148/332: el-search version 1.3: Lots of fixes and improvements, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search d54491c 147/332: Add a FILE argument to `el-search-dired-marked-files', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search a26b6e0 152/332: Reset wrap flag even when no match, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 6919e8d 141/332: Also count pattern types starting with "_" as internal, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search b8e3812 144/332: Improve half-baked introduction of key bindings, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e96c054 156/332: Handle read errors when reading and validating replacement, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 6f0f22c 155/332: Some details, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 6e6013a 159/332: Fix and speed up the `change' pattern type,
Stefan Monnier <=
- [elpa] externals/el-search c878a24 173/332: Fix "Make amount of context around occur matches adjustable", Stefan Monnier, 2020/12/01
- [elpa] externals/el-search f6b1aec 180/332: Some details, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 8583d46 191/332: Fix resuming a single-buffer query-replace, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 365f93f 197/332: * el-search/el-search.el: Some buffer display related minor tweaks, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search c69dd52 205/332: * el-search/el-search.el: Some minor tweaks, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search c41288f 208/332: Make el-search key binding installation more flexible, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 8d20f8a 217/332: Add face `el-search-highlight-in-prompt-face', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 75f94f9 218/332: Improve quit/error handling in el-search-query-replace, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search b278fb7 219/332: Update a variable when splicing mode is toggled, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 8175417 237/332: * el-search/el-search.el: More minor tweaks, Stefan Monnier, 2020/12/01