all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Dmitry Gutov <dgutov@yandex.ru>
To: Lars Ingebrigtsen <larsi@gnus.org>
Cc: Zhu Zihao <cjpeople2013@gmail.com>,
	Theodor Thornhill <theo@thornhill.no>,
	41572@debbugs.gnu.org, Juri Linkov <juri@linkov.net>
Subject: bug#41572: 28.0.50; [PATCH] Support plain project marked with file .emacs-project
Date: Sun, 26 Sep 2021 03:22:33 +0300	[thread overview]
Message-ID: <ea360b6f-883a-8dd6-b7ad-ec82d810ed72@yandex.ru> (raw)
In-Reply-To: <871riitzch.fsf@gnus.org>

[-- Attachment #1: Type: text/plain, Size: 1553 bytes --]

Another issue is people working on monorepos (often backed by Git) 
sometimes want to split them into separate projects.

Either because they only work on a certain part of the whole project, or 
because they want to use Eglot, and that package has tied LSP roots 
detection to project roots (but the language server might expect some 
project configuration files in the root which reside in a subdirectory).

Here's a typical question/request for this functionality: 
https://emacs.stackexchange.com/questions/58463/project-el-override-project-root-with-dir-local-var/58468

Patch attached, it adds new user option project-vc-subprojects which 
alters the root-finding logic and cuts out the subproject contents from 
the parent project with the mechanism of "ignores".

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).

Again, thoughts welcome.

[-- Attachment #2: project-vc-subprojects.diff --]
[-- Type: text/x-patch, Size: 3420 bytes --]

diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 57a961c260..e45667ed15 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -369,6 +369,23 @@ project-vc-merge-submodules
   :package-version '(project . "0.2.0")
   :safe #'booleanp)
 
+(defcustom project-vc-subprojects nil
+  "List of relative directory names to consider separate projects.
+Each entry should a string, name of a subproject root directory
+relative to the VC root.
+
+Every entry in this list will be considered a separate project
+for the purposes of files listings, searches, etc, and the parent
+project will exclude those files.
+
+One would usually set this variable through .dir-locals.el.
+
+If subprojects are Git submodules, you can use the variable
+`project-vc-merge-submodules' instead."
+  :type 'list
+  :version "28.1"
+  :safe (lambda (val) (and (listp val) (seq-every-p #'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
@@ -428,7 +445,22 @@ project-try-vc
                       root)))))
             ('nil nil)
             (_ (ignore-errors (vc-call-backend backend 'root dir))))))
-    (and root (cons 'vc root))))
+    (when root
+      (let* ((relative-dir (file-relative-name dir root))
+             (subproject (seq-find
+                          (lambda (sub-dir)
+                            (string-prefix-p (file-name-as-directory sub-dir)
+                                             relative-dir))
+                          (project--value-in-dir
+                           'project-vc-subprojects
+                           dir))))
+        (if subproject
+            (cons 'vc (propertize
+                       (concat root subproject)
+                       ;; Side-channel so we don't change the value format.
+                       ;; But we could do that instead.
+                       'vc-subproject t))
+          (cons 'vc root))))))
 
 (defun project--submodule-p (root)
   ;; XXX: We only support Git submodules for now.
@@ -467,7 +499,9 @@ project-external-roots
 (cl-defmethod project-files ((project (head vc)) &optional dirs)
   (mapcan
    (lambda (dir)
-     (let ((ignores (project--value-in-dir 'project-vc-ignores dir))
+     (let ((ignores
+            (nconc (project--vc-subproject-ignores dir)
+                   (project--value-in-dir 'project-vc-ignores dir)))
            backend)
        (if (and (file-equal-p dir (cdr project))
                 (setq backend (vc-responsible-backend dir))
@@ -579,6 +613,12 @@ project--git-submodules
           (nreverse res)))
     (file-missing nil)))
 
+(defun project--vc-subproject-ignores (dir)
+  (unless (get-text-property 0 'vc-subproject dir)
+    (mapcar
+     (lambda (supb) (format "./%s" (file-name-as-directory supb)))
+     (project--value-in-dir 'project-vc-subprojects dir))))
+
 (cl-defmethod project-ignores ((project (head vc)) dir)
   (let* ((root (cdr project))
          backend)
@@ -608,6 +648,7 @@ project-ignores
              (vc-call-backend backend 'ignore-completion-table root)
            (vc-not-supported () nil)))))
      (project--value-in-dir 'project-vc-ignores root)
+     (project--vc-subproject-ignores root)
      (mapcar
       (lambda (dir)
         (concat dir "/"))

  parent reply	other threads:[~2021-09-26  0:22 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 [this message]
2022-11-26  1:49                           ` Dmitry Gutov
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

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

  git send-email \
    --in-reply-to=ea360b6f-883a-8dd6-b7ad-ec82d810ed72@yandex.ru \
    --to=dgutov@yandex.ru \
    --cc=41572@debbugs.gnu.org \
    --cc=cjpeople2013@gmail.com \
    --cc=juri@linkov.net \
    --cc=larsi@gnus.org \
    --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 external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.