[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#59722: 30.0.50; project-find-regexp searches project-ignored files
From: |
Dmitry Gutov |
Subject: |
bug#59722: 30.0.50; project-find-regexp searches project-ignored files |
Date: |
Mon, 5 Dec 2022 02:43:53 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 |
On 05/12/2022 01:36, Rudolf Adamkovič via Bug reports for GNU Emacs, the
Swiss army knife of text editors wrote:
Can you step through 'project-find-regexp' with edebug? Does the
return value of 'project-files' (saved to 'files') contain the extra
entries?
So, I debugged the problem.
Thanks!
FINDING 1:
The first finding may explain why I see the ignored files in C-x p g.
For my dir-local ignore pattern
((nil . ((project-ignores . ("apps/**/*.scm")))))
project-vc-ignores, you mean.
Emacs ends up calling
git ls-files -z -c --exclude-standard \
--no-empty-directory -o -- :(exclude,glob,top)apps/**/*.scm
which gives a listing that DOES NOT contain (as expected) any '*.scm'
files in the 'apps' directory, such as
apps/lib-app-core/src/main/assets/app/atrium.scm
apps/lib-app-core/src/main/assets/app/database.scm
...
but it still DOES contain "logically empty" parent directories (as not
expected, perhaps) that would have contained the ignored files if not
ignored, such as
apps/lib-app-core/src/main/assets/app
Huh, interesting. Could you try to show a similar command invocation
which would make Git output include a "logically empty" directory for
the Emacs repo? So that we have a common public project to compare.
Or alternatively a project-vc-ignores value which, when put in
.dir-locals.el at the top, produces such effect on the return value of
(project-files (project-current)).
As a counter-example, if I add
(project-vc-ignores . ("./doc/emacs/*"))
there, 'project-files' does not include 'doc/emacs/' at all. Not files
in it, not it separately as a directory.
My interpretation:
git ls-files does not output just files, as one would expect, but also
directories with no matching files. grep then gets a list of files and
possibly also directories, and searches through it all.
That would make sense, if it's indeed what happens. Perhaps it's a bug
in our code, or this behavior is specific to certain versions of Git.
I currently have Git 2.37.2 installed.
FINDING 2:
Given the configuration
(setq project-switch-use-entire-map t
project-switch-commands '((nil "C-x p")))
when I type
C-x p p <...project...> g
then Emacs uses the global project ignores and not the ones defined in
the directory-local file. However,
C-x p g
inside of any project buffer works OK.
And that one is probably a regression from 2389158a31b4a.
It won't revert cleanly now, unfortunately. Here's a quick patch which
should fix project-switch-project (but not any other potential uses of
project-vc values outside of the associated directory):
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 3f4a5fb04b..c7fb39b0fb 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -1770,7 +1770,11 @@ project-switch-project
project-switch-commands
(project--switch-project-command))))
(let ((project-current-directory-override dir))
- (call-interactively command))))
+ (with-temp-buffer
+ (let ((default-directory dir)
+ (enable-local-variables :all))
+ (hack-dir-local-variables-non-file-buffer))
+ (call-interactively command)))))
(provide 'project)
;;; project.el ends here
It's mostly to help with your debugging, since it breaks the default
prompt for 'project-find-regexp' called from 'C-x p p' as well.
I'll have to think of the best way to resolve this: revert said commit
outright (with updates for the new code), or do it with certain tweaks.
Notes:
While probably not the root cause, this bug made debugging much harder,
until I realized it exists, so I report this finding as well.
Thank you.