all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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.





  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.