From: Dmitry Gutov <dgutov@yandex.ru>
To: 41572@debbugs.gnu.org
Cc: "Philip K." <philipk@posteo.net>,
"Rudi Schlatte" <rudi@constantly.at>,
"Augusto Stoffel" <arstoffel@gmail.com>,
"Zhu Zihao" <cjpeople2013@gmail.com>,
"Theodor Thornhill" <theo@thornhill.no>,
"Daniel Martín" <mardani29@yahoo.es>,
"Eric Abrahamsen" <eric@ericabrahamsen.net>,
"João Távora" <joaotavora@gmail.com>,
"Manuel Uberti" <manuel.uberti@inventati.org>,
"Juri Linkov" <juri@linkov.net>,
"Rudolf Adamkovič" <salutis@me.com>
Subject: bug#41572: 28.0.50; [PATCH] Support plain project marked with file .emacs-project
Date: Sat, 26 Nov 2022 03:49:36 +0200 [thread overview]
Message-ID: <9781acc2-e4c0-b53c-6422-ef2e0a96f400@yandex.ru> (raw)
In-Reply-To: <ea360b6f-883a-8dd6-b7ad-ec82d810ed72@yandex.ru>
[-- Attachment #1: Type: text/plain, Size: 1657 bytes --]
On 26/9/21 03:22, Dmitry Gutov wrote:
> Another issue is people working on monorepos (often backed by Git)
> sometimes want to split them into separate projects. The latter
> capability (excluding subproject's files) informed the choice of the
> approach. Which is altering the vc project backend's behavior, rather
> that offering this feature through another backend, like the one added
> in the previous patch, for example.
>
> I don't know if all users of this feature will want them excluded,
> though. The attached implementation does, and maybe another option could
> be added to disable this.
>
> Or we could drop this part of the behavior, insisting that users who
> want it could add the corresponding entries to project-vc-ignores. This
> way they would be listing the subprojects twice, however. And the
> project-vc-merge-submodules=nil behavior matches the other option
> (submodule files are excluded from the parent).
Here's a third approach, which now seems to me the most approachable.
It solves the semantic problems by having the new "plain" projects also
belong to the same type (which is still called project-vc, but means
something more now). The backend's variables are adhered to, and 'git
ls-files' is used for file listing in Git-backend subprojects still.
The subprojects' files are not excluded from the parent project, but as
long as the format of markers stays with wildcards, it at least remains
feasible to do, though with some extra expense at runtime. We'll see if
people really want this.
It will probably also improve performance over Tramp compared to the
current.
Does this work for everybody?
[-- Attachment #2: project-vc-extra-root-markers.diff --]
[-- Type: text/x-patch, Size: 5187 bytes --]
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 71061e6139d..19424a7343d 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -66,6 +66,9 @@
;; files, but supports additions to the list using the user option
;; `project-vc-ignores' (usually through .dir-locals.el).
;;
+;; At this point the name might as well be an abbreviation for "VC and
+;; Etc", see the variable `project-vc-extra-root-markers'.
+;;
;; Utils:
;;
;; `project-combine-directories' and `project-subtract-directories',
@@ -411,6 +414,27 @@ project-vc-name
:version "29.1"
:safe #'stringp)
+;; Not using regexps because these wouldn't work in Git pathspecs, in
+;; case we decide we need to be able to list subprojects.
+(defcustom project-vc-extra-root-markers nil
+ "List of additional \"markers\" to signal project roots.
+
+A marker is either a base file name or a glob pattern for such.
+
+These will be used in addition to regular directory markers such
+as .git, .hg, and so on, dependent on the value of
+`vc-handled-backends'. They are most useful when a VC project
+has subdirectories inside it that need to be considered as
+separate projects, but still use the parent's ignore rules and
+general behaviors.
+
+It can also be used for projects outside of VC repositories.
+Their behavior will still obey the relevant variables, such as
+`project-vc-ignores' or `project-vc-name'."
+ :type 'list
+ :version "29.1"
+ :safe (lambda (val) (and (listp val) (cl-every #'stringp val))))
+
;; FIXME: Using the current approach, major modes are supposed to set
;; this variable to a buffer-local value. So we don't have access to
;; the "external roots" of language A from buffers of language B, which
@@ -447,28 +471,50 @@ project-vc-external-roots-function
backend implementation of `project-external-roots'.")
(defun project-try-vc (dir)
+ (defvar vc-svn-admin-directory)
+ (require 'vc-svn)
+ ;; FIXME: Learn to invalidate when the value of
+ ;; `project-vc-merge-submodules' or `project-vc-extra-root-markers'
+ ;; changes.
(or (vc-file-getprop dir 'project-vc)
- (let* ((backend (ignore-errors (vc-responsible-backend dir)))
+ (let* ((backend-markers-alist `((Git . ".git")
+ (Hg . ".hg")
+ (Bzr . ".bzr")
+ (SVN . ,vc-svn-admin-directory)
+ (DARCS . "_darcs")
+ (Fossil . ".fslckout")))
+ (backend-markers
+ (delete
+ nil
+ (mapcar
+ (lambda (b) (assoc-default b backend-markers-alist))
+ vc-handled-backends)))
+ (marker-re
+ (mapconcat
+ (lambda (m) (format "\\(%s\\)" (wildcard-to-regexp m)))
+ (append backend-markers project-vc-extra-root-markers)
+ "\\|"))
+ (locate-dominating-stop-dir-regexp
+ (or vc-ignore-dir-regexp locate-dominating-stop-dir-regexp))
+ last-matches
(root
- (pcase backend
- ('Git
- ;; Don't stop at submodule boundary.
- (or (vc-file-getprop dir 'project-git-root)
- (let ((root (vc-call-backend backend 'root dir)))
- (vc-file-setprop
- dir 'project-git-root
- (if (and
- ;; FIXME: Invalidate the cache when the value
- ;; of this variable changes.
- project-vc-merge-submodules
- (project--submodule-p root))
- (let* ((parent (file-name-directory
- (directory-file-name root))))
- (vc-call-backend backend 'root parent))
- root)))))
- ('nil nil)
- (_ (ignore-errors (vc-call-backend backend 'root dir)))))
+ (locate-dominating-file
+ dir
+ (lambda (d)
+ (setq last-matches (directory-files d nil marker-re t 100)))))
+ (backend
+ (cl-find-if
+ (lambda (b)
+ (member (assoc-default b backend-markers-alist)
+ last-matches))
+ vc-handled-backends))
project)
+ (when (and
+ (eq backend 'Git)
+ project-vc-merge-submodules
+ (project--submodule-p root))
+ (let* ((parent (file-name-directory (directory-file-name root))))
+ (setq root (vc-call-backend 'Git 'root parent))))
(when root
(setq project (list 'vc backend root))
;; FIXME: Cache for a shorter time.
@@ -626,7 +672,8 @@ project-ignores
(let* ((root (nth 2 project))
backend)
(append
- (when (file-equal-p dir root)
+ (when (and backend
+ (file-equal-p dir root))
(setq backend (cadr project))
(delq
nil
next prev parent reply other threads:[~2022-11-26 1:49 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-28 3:32 bug#41572: 28.0.50; [PATCH] Support plain project marked with file .emacs-project Zhu Zihao
2020-05-28 7:42 ` Philip K.
2020-05-28 11:20 ` Zihao Zhu
2020-05-28 12:24 ` Philip K.
2020-06-03 11:04 ` Basil L. Contovounesios
2020-05-28 11:27 ` Zhu Zihao
2020-05-28 12:35 ` Dmitry Gutov
2020-05-28 15:46 ` Zihao Zhu
2020-05-28 19:58 ` Dmitry Gutov
2020-05-29 4:34 ` Zihao Zhu
2020-05-29 7:11 ` Philip K.
2020-05-29 13:58 ` Dmitry Gutov
2020-06-02 23:40 ` Juri Linkov
2020-06-05 19:02 ` Dmitry Gutov
2020-06-05 19:22 ` Theodor Thornhill
2020-06-05 23:11 ` Dmitry Gutov
2020-06-06 8:48 ` Theodor Thornhill
2020-06-06 11:15 ` Dmitry Gutov
2020-06-06 11:53 ` Theodor Thornhill
2020-06-06 12:17 ` Dmitry Gutov
2020-06-06 13:37 ` Theodor Thornhill
2020-07-20 20:55 ` Dmitry Gutov
2020-10-01 3:11 ` Lars Ingebrigtsen
2021-09-25 23:13 ` Dmitry Gutov
2021-09-26 6:38 ` Lars Ingebrigtsen
2021-10-03 18:06 ` Juri Linkov
2021-10-05 2:03 ` Dmitry Gutov
2021-10-05 2:08 ` Dmitry Gutov
2021-10-05 6:52 ` Juri Linkov
2021-10-05 12:42 ` Dmitry Gutov
2021-10-05 16:32 ` Juri Linkov
2021-10-06 7:21 ` Juri Linkov
2021-10-06 16:29 ` Juri Linkov
2021-10-06 21:16 ` Dmitry Gutov
2021-10-06 21:13 ` Dmitry Gutov
2021-10-07 7:17 ` Juri Linkov
2021-10-07 13:41 ` Dmitry Gutov
2021-10-10 16:47 ` Juri Linkov
2021-10-11 0:40 ` Dmitry Gutov
2021-10-05 14:39 ` Nikolay Kudryavtsev
2021-10-05 15:03 ` Dmitry Gutov
2021-10-05 15:21 ` Nikolay Kudryavtsev
2021-10-05 16:56 ` Dmitry Gutov
2021-10-05 18:19 ` Nikolay Kudryavtsev
2021-10-06 0:11 ` Dmitry Gutov
2021-10-06 14:09 ` Nikolay Kudryavtsev
2021-10-07 2:27 ` Dmitry Gutov
2021-10-07 13:08 ` Nikolay Kudryavtsev
2021-10-08 2:12 ` Dmitry Gutov
2021-10-08 16:24 ` Nikolay Kudryavtsev
2021-10-11 1:57 ` Dmitry Gutov
2021-10-11 18:05 ` Nikolay Kudryavtsev
2021-10-17 2:48 ` Dmitry Gutov
2021-10-17 11:52 ` Nikolay Kudryavtsev
2021-09-26 0:22 ` Dmitry Gutov
2022-11-26 1:49 ` Dmitry Gutov [this message]
2022-11-26 7:47 ` Eli Zaretskii
2022-11-26 13:22 ` Dmitry Gutov
2022-11-26 14:27 ` Eli Zaretskii
2022-11-27 1:08 ` Dmitry Gutov
2022-11-27 6:46 ` Eli Zaretskii
2022-11-27 14:10 ` Dmitry Gutov
2022-11-27 14:27 ` Eli Zaretskii
2022-11-27 15:51 ` Dmitry Gutov
2022-11-27 16:43 ` Eli Zaretskii
2022-11-27 21:41 ` Dmitry Gutov
2022-11-28 11:58 ` Eli Zaretskii
2022-11-28 12:30 ` Dmitry Gutov
2022-11-28 13:22 ` Eli Zaretskii
2022-11-28 14:29 ` Dmitry Gutov
2022-11-28 14:49 ` Eli Zaretskii
2022-11-28 15:31 ` Dmitry Gutov
2022-11-28 16:51 ` Eli Zaretskii
2022-11-30 2:26 ` Dmitry Gutov
2022-11-30 13:29 ` Eli Zaretskii
2022-11-30 18:52 ` Dmitry Gutov
2022-11-30 20:32 ` Eli Zaretskii
2022-11-30 20:43 ` Dmitry Gutov
2022-12-01 2:19 ` Dmitry Gutov
2022-12-01 6:02 ` Eli Zaretskii
2022-12-01 15:08 ` Dmitry Gutov
2022-11-26 9:52 ` João Távora
2022-11-26 12:29 ` Dmitry Gutov
2022-11-26 19:23 ` João Távora
2022-11-27 16:09 ` Dmitry Gutov
2022-11-29 9:46 ` João Távora
2022-11-29 18:51 ` Dmitry Gutov
2022-11-29 22:06 ` João Távora
2022-11-30 0:10 ` Dmitry Gutov
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=9781acc2-e4c0-b53c-6422-ef2e0a96f400@yandex.ru \
--to=dgutov@yandex.ru \
--cc=41572@debbugs.gnu.org \
--cc=arstoffel@gmail.com \
--cc=cjpeople2013@gmail.com \
--cc=eric@ericabrahamsen.net \
--cc=joaotavora@gmail.com \
--cc=juri@linkov.net \
--cc=manuel.uberti@inventati.org \
--cc=mardani29@yahoo.es \
--cc=philipk@posteo.net \
--cc=rudi@constantly.at \
--cc=salutis@me.com \
--cc=theo@thornhill.no \
/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).