unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Dmitry Gutov <dgutov@yandex.ru>
To: Theodor Thornhill <theo@thornhill.no>, 41955@debbugs.gnu.org
Cc: "João Távora" <joaotavora@gmail.com>
Subject: bug#41955: 28.0.50; Monorepos and project.el
Date: Sun, 21 Jun 2020 04:48:09 +0300	[thread overview]
Message-ID: <1d3ed076-692f-b6e2-2fb3-83593561e33a@yandex.ru> (raw)
In-Reply-To: <87pn9un5xu.fsf@thornhill.no>

On 19.06.2020 23:42, Theodor Thornhill wrote:

> At work I've had the following issue. Assume we have some sort of
> gigarepo, like this maybe:
> 
> gigarepo/
> ├── clients
> │   ├── client1
> │   ├── client2
> │   ├── client3
> │   └── client4
> └── services
>      ├── service1
>      ├── service2
>      ├── service3
>      └── service4
> 
> The services are made in different languages, say, some in c#, f#, java -
> as are clients, some are Typescript projects, some are JS etc etc.
> 
> Everything is rooted in a ".git" in "gigarepo/", and there are no
> submodules or any fancyness.
> 
> As project.el works now, there are several issues arising. I'll just
> note them down here, and probably split things up later, if that is ok.

Thank you for the report and the description. Before moving on to more 
complete solutions, here are some initial comments:

> * Lsp server/client
>    In most of the projects, the lsp servers are indexing from what they
>    consider root. Typically a tsconfig.json, elm.json etc. They get
>    confused, eglot a bit more than lsp-mode (it has its own root finding
>    algorithm). What happens is they look in root (gigarepo/), and it has
>    no executable for lsp-server. One solution is then to install the
>    server in root, but then it indexes the whole thing, and gets super
>    slow, and indexes a lot of unrelated stuff (I'm not even working on
>    client 2-4.)

I think Eglot is wrong in simply defaulting to project-root, without 
looking for tsconfig.json, etc. It would be pretty easy to implement, 
and would bring it closer to VS Code's behavior in this aspect (I think).

But that would require it to maintain a list of such files.

> * Buffer switching
>    Lets say several of the clients uses a module called AuthService.ts.
>    If I'm working on several of these projects you get a lot of identical
>    files, so it is a bit hit and miss.

Uniquify should help, but yeah, it sounds like a pain point indeed.

> * Grepping
>    This one was the worst for me, since grepping was very slow given the
>    size of the project, and grepping loads of unrelated files returns a
>    lot of noise.

This is just a small step, but have you tried the patch here (with rg)?

https://lists.gnu.org/archive/html/emacs-devel/2020-06/msg00547.html

> What would be nice is to be able to get the benefits of the vc-dir
> version of project.el, but not having to "git init" inside the child
> projects. More specifically, to be able to choose "project context",
> one as the closest project-root and one as the gigarepo project-root.

Here's some code based on yours.

Also rough and unofficial, but should hopefully be faster.

(defvar project-root-markers
   '("package.json"
     "tsconfig.json"
     "jsconfig.json"
     "elm.json"
     "*.sln")
   "Files or directories that indicate the root of a project.")

;; Probably better in .dir-locals.el.
(setq project-vc-ignores
       '("node_modules"
         "target"
         "build"
         "package-lock.json"
         "elm-stuff"))

(defun project-find-nomono (dir)
   (let ((root
          (locate-dominating-file
           dir
           (lambda (d)
             (let ((default-directory d))
               (seq-some #'file-expand-wildcards
                         project-root-markers))))))
     (when (and root
                (ignore-errors
                  (vc-responsible-backend root)))
       (cons 'vc root))))

(add-hook 'project-find-functions #'project-find-nomono)






      parent reply	other threads:[~2020-06-21  1:48 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-19 20:42 bug#41955: 28.0.50; Monorepos and project.el Theodor Thornhill
2020-06-20  7:17 ` Eli Zaretskii
2020-06-20  7:48   ` Theodor Thornhill
2020-06-20  8:57     ` Eli Zaretskii
2020-06-21  1:25       ` Dmitry Gutov
2020-06-22 17:17     ` Felician Nemeth
2020-06-22 21:06       ` Dmitry Gutov
2020-06-20 23:29 ` Juri Linkov
2020-06-21  1:23   ` Dmitry Gutov
2020-06-21  1:48 ` Dmitry Gutov [this message]

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=1d3ed076-692f-b6e2-2fb3-83593561e33a@yandex.ru \
    --to=dgutov@yandex.ru \
    --cc=41955@debbugs.gnu.org \
    --cc=joaotavora@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 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).