From: Dmitry Gutov <dgutov@yandex.ru>
To: Nikolay Kudryavtsev <nikolay.kudryavtsev@gmail.com>,
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: Wed, 6 Oct 2021 03:11:04 +0300 [thread overview]
Message-ID: <ac719eee-acf5-7bdf-5512-ea5881e84bfc@yandex.ru> (raw)
In-Reply-To: <0895f33c-dfff-135e-657a-fbcf4730b799@gmail.com>
On 05.10.2021 21:19, Nikolay Kudryavtsev wrote:
> I currently have a very basic real use case on my hands. There's a
> particular programming language that has it's own project file type.
> Since it's a project type, it makes sense to plug it in as project
> backend. And then on top of this I can implement project target actions
> like build, compile and debug(this is actually another matter that
> probably needs to be implemented in(or over) project.el at some point,
> I'll probably open a discussion about it later).
Right, we are yet to consider this functionality properly.
> So it all makes sense so far, at least conceptually. But here you're
> saying "you should not add a new file-based backend until you really
> think about the project file list optimization first". This violates the
> classic rule of doing the right thing first, then optimizing second. So
> while I feel this a real issue, it IMHO should be filed and discussed
> separately and is a nonblocker for this particular task.
Let's talk about correctness. The "right thing".
Suppose we have a large Git repo, which contains a "foo project" (as you
might see it), marked by Foofile in its 'foo' subdirectory.
And suppose we allow the project-foo backend to come first before the VC
backend. When we are inside the directory ./project/foo, that's the
current project. File listing shows ("./project/foo/a",
"./project/foo/b", etc).
But when we go up a directory, "./project/". And when asked to list its
files, how do we avoid including "./project/foo/a" in that list? It
would make sense to exclude any nested projects, right? But we can't do
that if the project detection logic is so flexible that the project-vc
backend couldn't find out about subprojects inside it except by visiting
every subdirectory and querying for the current project there, which
would obviously be too slow.
So it's a correctness issue as well. Hence the
simpler-but-easier-to-get-right approach in the other patch (with the
project-vc-subprojects variable). Even if it might require more effort
from the end user, unfortunately.
> Now to contradict myself, lets continue discussing this issue. I think
> this is a local version of a more global multiple backends problem. Lets
> say we have the same project(more precisely, a set of files) that is
> served by multiple backends. Roughly we order project-find-functions in
> this order: major-mode backends, tool backends(eg. GNU Global), generic
> backends(VC). The preference for the major mode backends over others is
> due to that "VC has different root" use case. Tool backends are
> preferred to VC due to that you can start a new Global project as sort
> of a custom project hack.
Setting project-find-functions in a major mode is a questionable thing
to do, because then you end up with Emacs where files in the same
directory belong to different projects. As we say in the commentary:
;; It is a good idea to depend on the
;; directory only, and not on the current major mode, for example.
;; Because the usual expectation is that all files in the directory
;; belong to the same project (even if some/most of them are ignored).
We want to support even backends where this approach is violated (on a
best-effort basis), but let's not make this the common scenario.
> And here we run into the problem: our major mode while it provides a
> backend, does not optimize file listing, but there's a backend that
> does. I think TRT is project.el choosing a different secondary backend
> in this case as long as it has the same project root.
If there is a next backend which indicates the same root, why do we need
the first one?
> For this it needs
> to have some rules, to know which backend better fits a particular
> situation, which does not.
Why do you need so many backends, anyway? One per language, one per
tool, etc. That seems to reduce the concept of a project to "this one
parent directory containing a file some tool cares about".
What would be the meaning of the value (project-current) returns?
Suppose I call project-find-file, meaning to jump to another file in the
same Git repository. And instead I am shown only a list of files in the
current subdirectory because it contains, say, a Makefile. Is that a
good idea to enact this kind of behavior automatically?
Or suppose we add a backend that looks for 'Makefile', another for
'Gemfile', another for 'Rakefile', etc. What user-level commands are
going to benefit from this setup? A command that shows the available
Makefile tasks? It can just as well call 'locate-dominating-file' to
find the nearest directory containing it. Same for 'M-x rake', and so on.
next prev parent reply other threads:[~2021-10-06 0:11 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 [this message]
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
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=ac719eee-acf5-7bdf-5512-ea5881e84bfc@yandex.ru \
--to=dgutov@yandex.ru \
--cc=41572@debbugs.gnu.org \
--cc=cjpeople2013@gmail.com \
--cc=juri@linkov.net \
--cc=larsi@gnus.org \
--cc=nikolay.kudryavtsev@gmail.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 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.