unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* A unified project root interface
@ 2013-03-09 16:44 Jorgen Schaefer
  2013-03-09 17:12 ` Fabian Ezequiel Gallina
  2013-03-10  5:38 ` Stefan Monnier
  0 siblings, 2 replies; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-09 16:44 UTC (permalink / raw)
  To: emacs-devel

Hello!

A growing number of extensions out there deal with "projects" as
opposed to "single files", that is, a collection of files that belong
together in some form or another. The usual way to define a project is
via the "project root", a directory so that all files under that
directory are considered part of "the project".

This is not exactly difficult to write, which has lead to the situation
where pretty much every extension that uses projects defines their own
code to find and set the project root. Examples of this are
find-file-in-project, projectile, elpy, flymake, ropemacs, nose, etc.
Now, if an user wants to use two or more of those extensions together,
she needs to "synchronize" the different ideas of project root manually.
Which gets more complicated the more extensions that define their own
project roots.

It would be really useful if there was a single standard way to define
the project root, so that extensions can just use that standard way
without each and every one of them writing the same code over and over
again. Sadly, as the code is not exactly difficult and so many projects
have already used their own way, it's highly unlikely that a random
third-party library would simply "emerge" as the standard way of doing
things. Which makes me believe the only way to solve this is via a bit
of a top-down decision to include a library in Emacs and declare it as
"the default".

So this is my somewhat verbose request to say "yes, let's do this" and
pick a library to provide the functionality. The library itself doesn't
have to be big at all, in theory a single variable `project-root'
that everyone is encouraged to use would be enough. Adding some
basic functionality to this would be helpful, though. If we keep the
functionality to a minimum, this lets other extensions use it without
being annoyed at the features they drag in.

Suitable libraries exist:

https://github.com/jorgenschaefer/project-el (my own proposal for this
problem, GPLed, happy to assign copyright / should already have.)

https://github.com/nex3/project-el (unsure about the status, it's on
marmalade, though.)

There are probably others.


Does this sound sensible?
Are there other possible approaches?
What's the next step to solve this problem?


Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-09 16:44 A unified project root interface Jorgen Schaefer
@ 2013-03-09 17:12 ` Fabian Ezequiel Gallina
  2013-03-10  5:38 ` Stefan Monnier
  1 sibling, 0 replies; 62+ messages in thread
From: Fabian Ezequiel Gallina @ 2013-03-09 17:12 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel

2013/3/9 Jorgen Schaefer <forcer@forcix.cx>:
>
> It would be really useful if there was a single standard way to define
> the project root, so that extensions can just use that standard way
> without each and every one of them writing the same code over and over
> again. Sadly, as the code is not exactly difficult and so many projects
> have already used their own way, it's highly unlikely that a random
> third-party library would simply "emerge" as the standard way of doing
> things. Which makes me believe the only way to solve this is via a bit
> of a top-down decision to include a library in Emacs and declare it as
> "the default".
>

There's a standard way of defining variable values for files inside a
parent folder (read project). This mechanism is the Directory Local
variables [M-: (info "(emacs)Directory Variables")]. And it works, and
works good, in fact python.el makes use of this a lot and is able to
even to set the virtualenv for all your project files (without messing
with external others) thanks to it[0].

Normally I would consider the .dir-locals.el file location as the
project root, but then perhaps the user needs to override some values
in a sub-folder. So in that case I think it might be a good idea to
introduce an additional standard name for .dir-locals.el files that
are ought to be used only at the project root. I propose the name of
.project-locals.el. With this detecting if a file belongs to a project
and what's the project root is as easy as to find the
.project-locals.el.

>
> So this is my somewhat verbose request to say "yes, let's do this" and
> pick a library to provide the functionality. The library itself doesn't
> have to be big at all, in theory a single variable `project-root'
> that everyone is encouraged to use would be enough. Adding some
> basic functionality to this would be helpful, though. If we keep the
> functionality to a minimum, this lets other extensions use it without
> being annoyed at the features they drag in.
>

With something like the .project-locals.el, the only thing missing is
some UI for people fearing associations lists. I think, the best way
to go is a similar interface of what you get with customize-group
(hopefully most of its code could be borrowed).

[0] See Directory Local Variables section at: http://bit.ly/ZzUxxL



Regards,
Fabián



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-09 16:44 A unified project root interface Jorgen Schaefer
  2013-03-09 17:12 ` Fabian Ezequiel Gallina
@ 2013-03-10  5:38 ` Stefan Monnier
  2013-03-10 10:06   ` Jorgen Schaefer
                     ` (3 more replies)
  1 sibling, 4 replies; 62+ messages in thread
From: Stefan Monnier @ 2013-03-10  5:38 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel

> So this is my somewhat verbose request to say "yes, let's do this" and
> pick a library to provide the functionality.

Agreed.  There are already different such things distributed with Emacs:
.dir-locals.el is one of them.  CEDET has its own notion.
As mentioned .dir-local.el often acts as a project root, but it can also
appear in sub-directories of a project, so it's not sufficient.
It should at least be augmented so that some .dir-locals.el can be
flagged as "non-root".

If the only need is to figure out the "root directory of the project",
then maybe a simple solution is:

   (defvar project-root-predicate
       (lambda () (file-exists-p ".dir-locals.el")))
   (defun project-root ()
     (locate-dominating-file default-directory project-root-predicate))

where packages can (add-function :until-before (default-value
project-root-predicate) <mypredicate>) to recognize other "tell tale
sign" of a project root (e.g. a Tupfile).

   
        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-10  5:38 ` Stefan Monnier
@ 2013-03-10 10:06   ` Jorgen Schaefer
  2013-03-11 18:57   ` Lluís
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-10 10:06 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

On Sun, 10 Mar 2013 00:38:12 -0500
Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> > So this is my somewhat verbose request to say "yes, let's do this"
> > and pick a library to provide the functionality.
> 
> Agreed.
>
> [...]
>
> If the only need is to figure out the "root directory of the project",

That is I think the minimum requirement, yes.

> then maybe a simple solution is:
> 
>    (defvar project-root-predicate
>        (lambda () (file-exists-p ".dir-locals.el")))
>    (defun project-root ()
>      (locate-dominating-file default-directory
> project-root-predicate))
> 
> where packages can (add-function :until-before (default-value
> project-root-predicate) <mypredicate>) to recognize other "tell tale
> sign" of a project root (e.g. a Tupfile).

This would indeed be the minimal set to help with the problem. I think
it's a bit *too* minimal, because it fails for most common cases, i.e.
those where the project root is not defined yet. Every package trying
to use it will need to extend it with some way to define or set the
project root before this code can be used at all. The project.el files I
linked to (and most projects) by default look for VCS markers to find
the project root if nothing else is specified. This might be trivial
enough to add by default, too.

The only added functionality of the project.el files I linked to is
that they allow the user to override the project root (using M-x
project-set-root), which in turn makes it worthwhile to have the
project root as a buffer-local variable.

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-10  5:38 ` Stefan Monnier
  2013-03-10 10:06   ` Jorgen Schaefer
@ 2013-03-11 18:57   ` Lluís
  2013-03-12 23:28     ` Eric M. Ludlam
  2013-03-12 15:34   ` Sudish Joseph
  2013-03-12 18:23   ` Ted Zlatanov
  3 siblings, 1 reply; 62+ messages in thread
From: Lluís @ 2013-03-11 18:57 UTC (permalink / raw)
  To: emacs-devel

Stefan Monnier writes:

>> So this is my somewhat verbose request to say "yes, let's do this" and
>> pick a library to provide the functionality.

> Agreed.  There are already different such things distributed with Emacs:
> .dir-locals.el is one of them.  CEDET has its own notion.
> As mentioned .dir-local.el often acts as a project root, but it can also
> appear in sub-directories of a project, so it's not sufficient.
> It should at least be augmented so that some .dir-locals.el can be
> flagged as "non-root".

> If the only need is to figure out the "root directory of the project",
> then maybe a simple solution is:

>    (defvar project-root-predicate
>        (lambda () (file-exists-p ".dir-locals.el")))
>    (defun project-root ()
>      (locate-dominating-file default-directory project-root-predicate))

> where packages can (add-function :until-before (default-value
> project-root-predicate) <mypredicate>) to recognize other "tell tale
> sign" of a project root (e.g. a Tupfile).

CEDET provides this in two ways (as part of the EDE subsystem):

* If a Project.ede file exists, that's the root (similar to .dir-locals.el in
  this context)

* If signs of a "project-like" structure exist (e.g., (auto)makefiles, scons,
  java, etc), uses system-specific knowledge to automatically detect the project
  root.


I'm commenting this because, first, managing projects is the purpose of EDE
(although it tries to do more than just identifying their root) and it's
integrated in Emacs; and second, because the auto-detection could help in making
the process simpler and, in the best case, auto-magical.


Lluis

-- 
 "And it's much the same thing with knowledge, for whenever you learn
 something new, the whole world becomes that much richer."
 -- The Princess of Pure Reason, as told by Norton Juster in The Phantom
 Tollbooth



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-10  5:38 ` Stefan Monnier
  2013-03-10 10:06   ` Jorgen Schaefer
  2013-03-11 18:57   ` Lluís
@ 2013-03-12 15:34   ` Sudish Joseph
  2013-03-12 16:51     ` Dmitry Gutov
  2013-03-12 18:23   ` Ted Zlatanov
  3 siblings, 1 reply; 62+ messages in thread
From: Sudish Joseph @ 2013-03-12 15:34 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, Jorgen Schaefer

Using .dir-locals as the definition of a project is eminently
reasonable, but it'd be good if projects and their roots could also be
computed dynamically or definitely implicitly from the context of an
action.

Computable roots:

- VC root directories define the most natural project roots in many
  cases.  This is by far the common case for me: look for the .git/
  directory.
- File and directory existence checks.  Rails projects contain these
  directories at their root: app, config, db.  Perl used to contain t
  and lib, though it's been a while.

It'd be good if Emacs didn't require or even write any context of its
own into these directories like most IDEs do - there's no reason to.

Implicit roots:

- Emacsclient should generate an implicit project root if given a
  directory as an argument.
- Drag and drop a directory into Emacs. This used to be one of
  Textmate's killer features - easy project creation.

Emacs doesn't need to define all this, just provide standard hooks to
let the user or external packages define this.  What would be great
would be if the grep interfaces and such could look for and use project
roots if one is found.

Here's the definition of projects I'm using right now:

(setq project-roots
      `(("Rails Project"
         :root-contains-files ("app" "config" "db" "lib" "script" "test")
         :on-hit (lambda (p) (message (car p))))
	("Emacs config"
         :path-matches ,(format "\\(%s\\)" sj/emacs-base-dir)
	 :on-hit (lambda (p) (message (car p))))
	("Perl Project"
         :root-contains-files ("t" "lib")
         :on-hit (lambda (p) (message (car p))))
	("Git Project"
         :root-contains-files (".git")
         :on-hit (lambda (p) (message (car p))))))

That's for project-root.el - selected because it was the only one I
found at the time.

The default .git rule turns out to be the most useful and catches most
projects.

Here's an example of a package that groups buffers by vc root that could
do an even better job with a standardized project interface in Emacs
itself: https://github.com/purcell/ibuffer-vc

Cheers,
-Sudish



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-12 15:34   ` Sudish Joseph
@ 2013-03-12 16:51     ` Dmitry Gutov
  0 siblings, 0 replies; 62+ messages in thread
From: Dmitry Gutov @ 2013-03-12 16:51 UTC (permalink / raw)
  To: Sudish Joseph; +Cc: Jorgen Schaefer, Stefan Monnier, emacs-devel

Sudish Joseph <sudish@gmail.com> writes:

> Here's the definition of projects I'm using right now:
>
> (setq project-roots
>       `(("Rails Project"
>          :root-contains-files ("app" "config" "db" "lib" "script" "test")
>          :on-hit (lambda (p) (message (car p))))
> 	("Emacs config"
>          :path-matches ,(format "\\(%s\\)" sj/emacs-base-dir)
> 	 :on-hit (lambda (p) (message (car p))))
> 	("Perl Project"
>          :root-contains-files ("t" "lib")
>          :on-hit (lambda (p) (message (car p))))
> 	("Git Project"
>          :root-contains-files (".git")
>          :on-hit (lambda (p) (message (car p))))))

This looks quite similar to eproject configuration:

https://github.com/jrockway/eproject/wiki/ProjectTypes

> Here's an example of a package that groups buffers by vc root that could
> do an even better job with a standardized project interface in Emacs
> itself: https://github.com/purcell/ibuffer-vc

Indeed. As another example, if I were to start working on some
programming-language specific feature, like code completion, I'd need a
way to enumerate files and/or buffers that belong to the same project.

So, to add to the list of the required features, the project root
mechanism will need a way to enumerate all files in the project (or
maybe all files of a certain type), and a way to ignore files and
directories, for example to improve performance of the enumerator
function.



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-10  5:38 ` Stefan Monnier
                     ` (2 preceding siblings ...)
  2013-03-12 15:34   ` Sudish Joseph
@ 2013-03-12 18:23   ` Ted Zlatanov
  3 siblings, 0 replies; 62+ messages in thread
From: Ted Zlatanov @ 2013-03-12 18:23 UTC (permalink / raw)
  To: emacs-devel

On Sun, 10 Mar 2013 00:38:12 -0500 Stefan Monnier <monnier@iro.umontreal.ca> wrote: 

SM> As mentioned .dir-local.el often acts as a project root, but it can also
SM> appear in sub-directories of a project, so it's not sufficient.
SM> It should at least be augmented so that some .dir-locals.el can be
SM> flagged as "non-root".

I think it's simple to add a "root" property to .dir-locals.el.  If it
exists, stop searching.  It's backwards compatible (unlike a non-root
flag, IIUC) and doesn't require new libraries or variables, just a guard
in the search code.

Ted




^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-11 18:57   ` Lluís
@ 2013-03-12 23:28     ` Eric M. Ludlam
  2013-03-12 23:42       ` Jorgen Schaefer
  2013-03-13 18:03       ` David Engster
  0 siblings, 2 replies; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-12 23:28 UTC (permalink / raw)
  To: emacs-devel

On 03/11/2013 02:57 PM, Lluís wrote:
> Stefan Monnier writes:
>
>>> So this is my somewhat verbose request to say "yes, let's do this" and
>>> pick a library to provide the functionality.
>
>> Agreed.  There are already different such things distributed with Emacs:
>> .dir-locals.el is one of them.  CEDET has its own notion.
>> As mentioned .dir-local.el often acts as a project root, but it can also
>> appear in sub-directories of a project, so it's not sufficient.
>> It should at least be augmented so that some .dir-locals.el can be
>> flagged as "non-root".
>
>> If the only need is to figure out the "root directory of the project",
>> then maybe a simple solution is:
>
>>     (defvar project-root-predicate
>>         (lambda () (file-exists-p ".dir-locals.el")))
>>     (defun project-root ()
>>       (locate-dominating-file default-directory project-root-predicate))
>
>> where packages can (add-function :until-before (default-value
>> project-root-predicate)<mypredicate>) to recognize other "tell tale
>> sign" of a project root (e.g. a Tupfile).
>
> CEDET provides this in two ways (as part of the EDE subsystem):
>
> * If a Project.ede file exists, that's the root (similar to .dir-locals.el in
>    this context)
>
> * If signs of a "project-like" structure exist (e.g., (auto)makefiles, scons,
>    java, etc), uses system-specific knowledge to automatically detect the project
>    root.
>
>
> I'm commenting this because, first, managing projects is the purpose of EDE
> (although it tries to do more than just identifying their root) and it's
> integrated in Emacs; and second, because the auto-detection could help in making
> the process simpler and, in the best case, auto-magical.

I, of course, agree with Lluis.  EDE is already setup to automatically 
find projects as was requested.  Adding new projects through the 
'generic' system is a pretty simple prospect.

I know some people think of EDE as being this big thing for creating 
your Makefiles, but its most common use really is to just tag the root 
of a project, and hang some configuration features for semantic auto 
completion.  Adding new detectable projects to EDE would be a win all 
around.

Eric




^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-12 23:28     ` Eric M. Ludlam
@ 2013-03-12 23:42       ` Jorgen Schaefer
  2013-03-13  2:02         ` Eric M. Ludlam
  2013-03-13 18:03       ` David Engster
  1 sibling, 1 reply; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-12 23:42 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: emacs-devel

On Tue, 12 Mar 2013 19:28:28 -0400
"Eric M. Ludlam" <eric@siege-engine.com> wrote:

> I know some people think of EDE as being this big thing for creating 
> your Makefiles, but its most common use really is to just tag the
> root of a project, and hang some configuration features for semantic
> auto completion.  Adding new detectable projects to EDE would be a
> win all around.

Also extracting the project part so you can use it without depending on
all of EDE. Right now, that seems either not doable or badly
documented, as none of the project-based extensions I have seen actually
uses that functionality.

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-12 23:42       ` Jorgen Schaefer
@ 2013-03-13  2:02         ` Eric M. Ludlam
  0 siblings, 0 replies; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-13  2:02 UTC (permalink / raw)
  To: emacs-devel

On 03/12/2013 07:42 PM, Jorgen Schaefer wrote:
> On Tue, 12 Mar 2013 19:28:28 -0400
> "Eric M. Ludlam"<eric@siege-engine.com>  wrote:
>
>> I know some people think of EDE as being this big thing for creating
>> your Makefiles, but its most common use really is to just tag the
>> root of a project, and hang some configuration features for semantic
>> auto completion.  Adding new detectable projects to EDE would be a
>> win all around.
>
> Also extracting the project part so you can use it without depending on
> all of EDE. Right now, that seems either not doable or badly
> documented, as none of the project-based extensions I have seen actually
> uses that functionality.
>
> Regards,
> 	-- Jorgen

It's not clear to me what you mean.  When a project is detected, it 
instantiates an instance of that project for that directory.  It doesn't 
load any other projects but the one it detected.  Thus, if it finds and 
Emacs project, it loads that project type which is pretty small.  It 
doesn't load the big Makefile generating project.

If you mean that "all of EDE" represents the core EDE project classes, 
then no, you can't use the project detection piece without that.  The 
project detection code first needs to look up a project.  If a project 
is already open, it will instead find it in the list of currently open 
projects without using the file system based search.

Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-12 23:28     ` Eric M. Ludlam
  2013-03-12 23:42       ` Jorgen Schaefer
@ 2013-03-13 18:03       ` David Engster
  2013-03-13 19:11         ` Sudish Joseph
  2013-03-16  0:47         ` Eric M. Ludlam
  1 sibling, 2 replies; 62+ messages in thread
From: David Engster @ 2013-03-13 18:03 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: emacs-devel

Eric M. Ludlam writes:
> On 03/11/2013 02:57 PM, Lluís wrote:
>> CEDET provides this in two ways (as part of the EDE subsystem):
>>
>> * If a Project.ede file exists, that's the root (similar to .dir-locals.el in
>>    this context)
>>
>> * If signs of a "project-like" structure exist (e.g., (auto)makefiles, scons,
>>    java, etc), uses system-specific knowledge to automatically
>> detect the project
>>    root.
>> I'm commenting this because, first, managing projects is the purpose of EDE
>> (although it tries to do more than just identifying their root) and it's
>> integrated in Emacs; and second, because the auto-detection could help in making
>> the process simpler and, in the best case, auto-magical.
>
> I, of course, agree with Lluis.  EDE is already setup to automatically
> find projects as was requested.  Adding new projects through the
> generic' system is a pretty simple prospect.

Yes, but we cannot envision all the kinds of projects people would want
and create those for them beforehand. And defining own projects with
ede-generic is simple, but not simple enough for end users. Let's take
the example for defining those simple projects in project-roots.el,
given by Sudish Joseph in this thread:

	("Perl Project"
         :root-contains-files ("t" "lib")
         :on-hit (lambda (p) (message (car p))))

You can create a project like this with ede-generic, but then you have
to write a little defclass inheriting from ede-generic, call
ede-generic-new-autoloader, and to actually *do* something when the
project is loaded you have to define methods like
`ede-generic-setup-configuration'. This is just too much boilerplate for
such a simple thing like the above. Also, even most Emacs developers are
not familiar with the CLOS-like syntax that's needed to define those
things.

There's no doubt that EDE can do all what's needed, but is has to be
wrapped in something that's easier to use, at least for simple stuff
like what project-roots.el does.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-13 18:03       ` David Engster
@ 2013-03-13 19:11         ` Sudish Joseph
  2013-03-16  0:47         ` Eric M. Ludlam
  1 sibling, 0 replies; 62+ messages in thread
From: Sudish Joseph @ 2013-03-13 19:11 UTC (permalink / raw)
  To: emacs-devel

David Engster <deng@randomsample.de> writes:
> You can create a project like this with ede-generic, but then you have
> to write a little defclass inheriting from ede-generic, call
> ede-generic-new-autoloader, and to actually *do* something when the
> project is loaded you have to define methods like
> `ede-generic-setup-configuration'. This is just too much boilerplate for
> such a simple thing like the above. Also, even most Emacs developers are
> not familiar with the CLOS-like syntax that's needed to define those
> things.
>
> There's no doubt that EDE can do all what's needed, but is has to be
> wrapped in something that's easier to use, at least for simple stuff
> like what project-roots.el does.

The simplest - and for me, only - use is to ask a buffer which project
it belongs to, if any.  Everything else in my usage can be derived from
that.  This is how vc works, too, I think, and ibuffer-vc can aggregate
buffers by vc-roots handily.

Buffers and buffer-locals provide a simple and emacsy form of extensible
object and attributes, so if there's more data associated with a project
it'd be nice to expose them as such as opposed or in addition to having
a dedicated project api.  This fits with .dir-locals as well.

Most project convenience functions I need turn out to be general
directory and file functions.  For e.g., "all files in current project"
could be as simple as
	(all-files-in project-root)
where the former is generic functionality and the latter is a buffer
local.

-Sudish

PS: Some more examples of how I find having a simple buffer-local
project-root handy - I use these every day:

;; project-details is a buffer-local of
;; (matching-rule-name . project-root-dir)
(defun sj/project-root-dir ()
  (when (project-root-fetch)
    (cdr project-details)))

;; this auto-restricts recursive ack searches to current project, where
;; project is defined dynamically - vc roots, etc.
(setq ack-mode-root-directory-function 'sj/project-root-dir)


;; A couple of anything.el sources that automatically use the current
;; buffer's project root

;; Files from current project root, if any
(defconst sj/anything-source-project-root-files
  '((name . "Project Files")
    (init . (lambda ()
	      (setq anything-project-root project-details)))
    (candidates . (lambda ()
		    (project-root-file-find-process anything-pattern)))
    (candidate-transformer . sj/anything-file-candidate-filter)
    (requires-pattern . 2)
    (volatile)
    (type . file)))

;; A source that's aware of the MVC structure of a Rails project.
(defconst sj/anything-rails-files
  '((name . "Rails")
    (init . (lambda ()
	      (setq anything-project-root project-details)))
    (candidates . (lambda ()
		    (when (equal "Rails Project" (car anything-project-root))
		      (rails-list-project-files (cdr anything-project-root)))))
    (type . file)))



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-13 18:03       ` David Engster
  2013-03-13 19:11         ` Sudish Joseph
@ 2013-03-16  0:47         ` Eric M. Ludlam
  2013-03-16 14:18           ` David Engster
  1 sibling, 1 reply; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-16  0:47 UTC (permalink / raw)
  To: emacs-devel, David Engster

On 03/13/2013 02:03 PM, David Engster wrote:
> Eric M. Ludlam writes:
>> On 03/11/2013 02:57 PM, Lluís wrote:
>>> CEDET provides this in two ways (as part of the EDE subsystem):
>>>
>>> * If a Project.ede file exists, that's the root (similar to .dir-locals.el in
>>>     this context)
>>>
>>> * If signs of a "project-like" structure exist (e.g., (auto)makefiles, scons,
>>>     java, etc), uses system-specific knowledge to automatically
>>> detect the project
>>>     root.
>>> I'm commenting this because, first, managing projects is the purpose of EDE
>>> (although it tries to do more than just identifying their root) and it's
>>> integrated in Emacs; and second, because the auto-detection could help in making
>>> the process simpler and, in the best case, auto-magical.
>>
>> I, of course, agree with Lluis.  EDE is already setup to automatically
>> find projects as was requested.  Adding new projects through the
>> generic' system is a pretty simple prospect.
>
> Yes, but we cannot envision all the kinds of projects people would want
> and create those for them beforehand. And defining own projects with
> ede-generic is simple, but not simple enough for end users. Let's take
> the example for defining those simple projects in project-roots.el,
> given by Sudish Joseph in this thread:
>
> 	("Perl Project"
>           :root-contains-files ("t" "lib")
>           :on-hit (lambda (p) (message (car p))))
>
> You can create a project like this with ede-generic, but then you have
> to write a little defclass inheriting from ede-generic, call
> ede-generic-new-autoloader, and to actually *do* something when the
> project is loaded you have to define methods like
> `ede-generic-setup-configuration'. This is just too much boilerplate for
> such a simple thing like the above. Also, even most Emacs developers are
> not familiar with the CLOS-like syntax that's needed to define those
> things.
>
> There's no doubt that EDE can do all what's needed, but is has to be
> wrapped in something that's easier to use, at least for simple stuff
> like what project-roots.el does.

Ok, I can buy that.  EDE was never simple.  I just know that if an 
"official" project mechanism is built, I'll have some work to do. ;)

In particular, if a system for detecting projects is developed, it would 
be great if EDE could stop detecting projects (ie - I delete some code), 
and instead use a hook to say "hey, let me know if you found a project", 
after which it can do its bit of magic for projects it also knows about.

Also be aware that I ran into a lot of performance issues I had to work 
through with EDE project detection.  Once other code starts asking where 
it is in a project, it's amazing how often that stuff gets called.  A 
project cache is a super handy thing, and was one of the key performance 
improvements I made back when i was trying to speed up smart completion.

Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-16  0:47         ` Eric M. Ludlam
@ 2013-03-16 14:18           ` David Engster
  2013-03-16 15:02             ` Jorgen Schaefer
  0 siblings, 1 reply; 62+ messages in thread
From: David Engster @ 2013-03-16 14:18 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: emacs-devel

Eric M. Ludlam writes:
> On 03/13/2013 02:03 PM, David Engster wrote:
>> There's no doubt that EDE can do all what's needed, but is has to be
>> wrapped in something that's easier to use, at least for simple stuff
>> like what project-roots.el does.
>
> Ok, I can buy that.  EDE was never simple.  I just know that if an
> "official" project mechanism is built, I'll have some work to do. ;)

I think we don't need another project mechanism in Emacs. EDE and
dir-locals should be enough. What we have to do however is to develop at
least one very basic project type in EDE which can be used similar to
project-root.el. I think what Sudish Joseph explained in this thread is
pretty typical:

- Recognizing projects based on some files or directories which are in
  the current directory or further up the tree.

- The ability to ask Emacs of what project the current buffer is part
  of.

- Automatic setting of variables based on the current project.

The user should be able to configure this in a variable, similar to how
project-root.el does it. For example:

("Perl Project"
   :root-contains ("t" "lib")
   :on-load 'some-function 
   :variable-settings '((tab-width . 4)
                        (fill-column . 79)))

This is easy to implement with EDE. I can work on this, but I'd like to
finish my five other things which are 90% finished first...

> Also be aware that I ran into a lot of performance issues I had to
> work through with EDE project detection.  Once other code starts
> asking where it is in a project, it's amazing how often that stuff
> gets called.  A project cache is a super handy thing, and was one of
> the key performance improvements I made back when i was trying to
> speed up smart completion.

Yes, I know. This is why I think EDE should be the framework on which
those things are built.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-16 14:18           ` David Engster
@ 2013-03-16 15:02             ` Jorgen Schaefer
  2013-03-16 22:27               ` Phil Hagelberg
  2013-03-16 22:59               ` David Engster
  0 siblings, 2 replies; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-16 15:02 UTC (permalink / raw)
  To: David Engster; +Cc: emacs-devel

On Sat, 16 Mar 2013 15:18:50 +0100
David Engster <deng@randomsample.de> wrote:

> I think we don't need another project mechanism in Emacs. EDE and
> dir-locals should be enough. What we have to do however is to develop
> at least one very basic project type in EDE which can be used similar
> to project-root.el.

Unless you create this in a way that is usable without requiring (or
understanding) EDE, I fear that it will not be used by many
other packages. And that's the issue I started this thread for.

The issue is not that we would not have a way to define a project. We
do. Dozens of them, actually. Every package has their own. It's so
trivial to do for 90% of all use cases that most packages just write
their own code.

If we do not provide a way that is simpler to use than "I'll just
quickly write my own", the original problem will not go away. No matter
how much we say "but we have a solution".

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-16 15:02             ` Jorgen Schaefer
@ 2013-03-16 22:27               ` Phil Hagelberg
  2013-03-16 22:59               ` David Engster
  1 sibling, 0 replies; 62+ messages in thread
From: Phil Hagelberg @ 2013-03-16 22:27 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: David Engster, emacs-devel


Jorgen Schaefer writes:

> Unless you create this in a way that is usable without requiring (or
> understanding) EDE, I fear that it will not be used by many other
> packages. And that's the issue I started this thread for.

Speaking as the author of one of the most widely-used project-centric
libraries[1], I agree with Jorgen. I would be happy to adopt a mechanism
that ships with Emacs as long as it doesn't involve CLOS.

My personal vote is for a way to provide a list of project-defining
predicates, but a .dir-locals.el-based approach that didn't have false
positives for .dir-locals nested inside project subdirectories would be
fine too.

thanks,
Phil

[1] - https://github.com/technomancy/find-file-in-project/blob/master/find-file-in-project.el



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-16 15:02             ` Jorgen Schaefer
  2013-03-16 22:27               ` Phil Hagelberg
@ 2013-03-16 22:59               ` David Engster
  2013-03-16 23:16                 ` Jorgen Schaefer
  2013-03-17  8:08                 ` joakim
  1 sibling, 2 replies; 62+ messages in thread
From: David Engster @ 2013-03-16 22:59 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel

Jorgen Schaefer writes:
> On Sat, 16 Mar 2013 15:18:50 +0100
> David Engster <deng@randomsample.de> wrote:
>
>> I think we don't need another project mechanism in Emacs. EDE and
>> dir-locals should be enough. What we have to do however is to develop
>> at least one very basic project type in EDE which can be used similar
>> to project-root.el.
>
> Unless you create this in a way that is usable without requiring (or
> understanding) EDE, I fear that it will not be used by many
> other packages. And that's the issue I started this thread for.
>
> The issue is not that we would not have a way to define a project. We
> do. Dozens of them, actually. Every package has their own. It's so
> trivial to do for 90% of all use cases that most packages just write
> their own code.

I think the main issue is that every "language community" has a
different view of what a "project" entails, so existing solutions are
often missing something crucial, or things that should be easy to do are
too cumbersome. It's the same reason why almost every new popular
programming language sooner or later comes along with its own build tool
(Rake, SCons, Maven, Ant, Leiningen, CMake, and so on). It's always
better to have something specifically aimed at the tool-chain you're
using. In my opinion, this is the reason why so many people develop
their own project definitions in Emacs: they want something with
precisely the functionality they need, nothing more or less.

EDE has developed into a framework for writing such specialized projects
in. If you want to *develop* such a specialized project type for your
tool-chain, you indeed need to understand the inner workings of EDE,
which mostly means to first learn EIEIO syntax, which I guess is what
most people don't like about it. However, if you just want to *query* a
project object for something, all you need to know is 'oref', and even
that could be wrapped in helper functions if needed.

It is entirely possible to write a project type so that it is very
simple to use for end users. I think our C/C++ project wrapper is a good
example for this, where you define a project like this:

   (ede-cpp-root-project "NAME"
         :file "~/myproject/Makefile"
         :include-path '( "/include" "../include" "/c/include" )
         :system-include-path '( "/usr/include/c++/3.2.2/" )
         :spp-table '( ("OS_GNU_LINUX" . "1") ))

I'd argue this is already similar to how projects are defined in
project-root.el. This is all a user has to use, and every file loaded
from that project will have a buffer local ede-object, from which you
can easily extract those attributes. This project type was deliberately
created for people who don't want to explicitly mess with targets,
linkers, compilers, object files, dependency generation, 'clean' rules,
and so on. My suggestion was to create something similar, but more
generic and not explicitly aimed at C/C++. We already have a 'generic'
project type, which IMO comes close.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-16 22:59               ` David Engster
@ 2013-03-16 23:16                 ` Jorgen Schaefer
  2013-03-17 17:40                   ` David Engster
  2013-03-17  8:08                 ` joakim
  1 sibling, 1 reply; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-16 23:16 UTC (permalink / raw)
  To: David Engster, emacs-devel

On Sat, 16 Mar 2013 23:59:39 +0100
David Engster <deng@randomsample.de> wrote:

> I think our C/C++ project wrapper is a
> good example for this, where you define a project like this:
> 
>    (ede-cpp-root-project "NAME"
>          :file "~/myproject/Makefile"
>          :include-path '( "/include" "../include" "/c/include" )
>          :system-include-path '( "/usr/include/c++/3.2.2/" )
>          :spp-table '( ("OS_GNU_LINUX" . "1") ))
> 
> I'd argue this is already similar to how projects are defined in
> project-root.el.

I have no idea what project-root.el is or why anyone brought it up. The
two project libraries I linked in the first post of this thread and
described therein do not require such cumbersome extra effort.

In the normal case, I do not want to define a project at all.

As an extension author, I just want to call (project-root) in my
extension and have it magically return a directory that's the root
directory of the project.

As a user, I just want to Have It Work[tm] when opening a file without
me defining anything. At most, if all possible heuristics fail, I can
live with being asked for the project root directory.

Everything more than this, and I'll just ignore that "feature" because
it's cumbersome to use.

Every further feature is "nice to have", and only useful if it does not
require more effort than the above.

And every requirement for "project" the above does not cover (like,
say, multiple project roots) is a fringe use I can happily live without,
as apparently can a bunch of other extension authors.

The problem I raised in this thread is that too many packages write
their own solution because using any of the possible standard solutions
is too cumbersome. Saying "there is a cumbersome standard solution"
does not solve the problem.

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-16 22:59               ` David Engster
  2013-03-16 23:16                 ` Jorgen Schaefer
@ 2013-03-17  8:08                 ` joakim
  1 sibling, 0 replies; 62+ messages in thread
From: joakim @ 2013-03-17  8:08 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel

David Engster <deng@randomsample.de> writes:

> Jorgen Schaefer writes:
>> On Sat, 16 Mar 2013 15:18:50 +0100
>> David Engster <deng@randomsample.de> wrote:
>>
>>> I think we don't need another project mechanism in Emacs. EDE and
>>> dir-locals should be enough. What we have to do however is to develop
>>> at least one very basic project type in EDE which can be used similar
>>> to project-root.el.
>>
>> Unless you create this in a way that is usable without requiring (or
>> understanding) EDE, I fear that it will not be used by many
>> other packages. And that's the issue I started this thread for.
>>
>> The issue is not that we would not have a way to define a project. We
>> do. Dozens of them, actually. Every package has their own. It's so
>> trivial to do for 90% of all use cases that most packages just write
>> their own code.
>
> I think the main issue is that every "language community" has a
> different view of what a "project" entails, so existing solutions are
> often missing something crucial, or things that should be easy to do are
> too cumbersome. It's the same reason why almost every new popular
> programming language sooner or later comes along with its own build tool
> (Rake, SCons, Maven, Ant, Leiningen, CMake, and so on). It's always
> better to have something specifically aimed at the tool-chain you're
> using. In my opinion, this is the reason why so many people develop
> their own project definitions in Emacs: they want something with
> precisely the functionality they need, nothing more or less.
>
> EDE has developed into a framework for writing such specialized projects
> in. If you want to *develop* such a specialized project type for your
> tool-chain, you indeed need to understand the inner workings of EDE,
> which mostly means to first learn EIEIO syntax, which I guess is what
> most people don't like about it. However, if you just want to *query* a
> project object for something, all you need to know is 'oref', and even
> that could be wrapped in helper functions if needed.
>
> It is entirely possible to write a project type so that it is very
> simple to use for end users. I think our C/C++ project wrapper is a good
> example for this, where you define a project like this:
>
>    (ede-cpp-root-project "NAME"
>          :file "~/myproject/Makefile"
>          :include-path '( "/include" "../include" "/c/include" )
>          :system-include-path '( "/usr/include/c++/3.2.2/" )
>          :spp-table '( ("OS_GNU_LINUX" . "1") ))
>
> I'd argue this is already similar to how projects are defined in
> project-root.el. This is all a user has to use, and every file loaded
> from that project will have a buffer local ede-object, from which you
> can easily extract those attributes. This project type was deliberately
> created for people who don't want to explicitly mess with targets,
> linkers, compilers, object files, dependency generation, 'clean' rules,
> and so on. My suggestion was to create something similar, but more
> generic and not explicitly aimed at C/C++. We already have a 'generic'
> project type, which IMO comes close.

I would just like to voice my support for EDE. It is a good base for
further facilities.

The critique is also correct though, that it has been too complicated to
setup a very simple project type. That should be something that we that
are interested in CEDET should continue to work on. It has all the
facilities one might ask for with a project base framework in
Emacs. (That doesnt mean that others can't keep on working on their own
competing solutions of course, in the time honoured tradition of
Emacs-hackers)

>
> -David
>

-- 
Joakim Verona



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-16 23:16                 ` Jorgen Schaefer
@ 2013-03-17 17:40                   ` David Engster
  2013-03-17 18:18                     ` Jorgen Schaefer
  0 siblings, 1 reply; 62+ messages in thread
From: David Engster @ 2013-03-17 17:40 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel

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

Jorgen Schaefer writes:
> On Sat, 16 Mar 2013 23:59:39 +0100
> David Engster <deng@randomsample.de> wrote:
>
>> I think our C/C++ project wrapper is a
>> good example for this, where you define a project like this:
>> 
>>    (ede-cpp-root-project "NAME"
>>          :file "~/myproject/Makefile"
>>          :include-path '( "/include" "../include" "/c/include" )
>>          :system-include-path '( "/usr/include/c++/3.2.2/" )
>>          :spp-table '( ("OS_GNU_LINUX" . "1") ))
>> 
>> I'd argue this is already similar to how projects are defined in
>> project-root.el.
>
> I have no idea what project-root.el is or why anyone brought it up. The
> two project libraries I linked in the first post of this thread and
> described therein do not require such cumbersome extra effort.

This is just a matter of providing default project types, which are
activated at startup. You do not have to explicitly specify projects
like this. EDE already ships with such default projects, for example for
detecting the Emacs source, or the Linux kernel. It is very easy to do
something similar for version controlled files (see below), similar to
what your project.el does.

project-root.el is just a slightly more generic version than your
project.el. Most importantly, it allows to define different types of
projects, so that a package author can for example add some
functionality only for Perl projects, excluding all the others.

> In the normal case, I do not want to define a project at all.

Fair enough, but while this may be the "normal" case, the ability to
define own project types is not an exotic demand, IMO. I like how
project-root handles this.

> As an extension author, I just want to call (project-root) in my
> extension and have it magically return a directory that's the root
> directory of the project.

In EDE, you have a buffer-local variable `ede-object-root-project',
which holds the root project. I can be queried through methods, for
instance

(ede-project-root-directory ede-object-root-project)

will get you the root directory.

> The problem I raised in this thread is that too many packages write
> their own solution because using any of the possible standard solutions
> is too cumbersome. Saying "there is a cumbersome standard solution"
> does not solve the problem.

I do not say that.

To hopefully prove my point, I've hacked together a small EDE project
for detecting files under git/hg/bzr version control, very similar to
how you do it in your project.el (I've dropped the CVS/.svn detection
for the moment).

Just load Emacs with

emacs -Q -f global-ede-mode -l vcs-root.el

and load some file under a git/hg/bzr versioned directory. There is an
example function `my-get-project-root' to print the project's root.

While you might not like the CLOS-like syntax, I hope it can be seen
that this is not difficult and fairly short (most of it is just
boilerplate), and you directly profit from stuff like caching that EDE
does (as Eric has already mentioned in this thread).

Just to be clear: I do *not* expect that users write this stuff;
instead, Emacs should provide projects like this as defaults.

-David


[-- Attachment #2: vcs-root.el --]
[-- Type: application/emacs-lisp, Size: 1643 bytes --]

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-17 17:40                   ` David Engster
@ 2013-03-17 18:18                     ` Jorgen Schaefer
  2013-03-18 22:50                       ` David Engster
  0 siblings, 1 reply; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-17 18:18 UTC (permalink / raw)
  To: David Engster; +Cc: emacs-devel

On Sun, 17 Mar 2013 18:40:13 +0100
David Engster <deng@randomsample.de> wrote:

> > The problem I raised in this thread is that too many packages write
> > their own solution because using any of the possible standard
> > solutions is too cumbersome. Saying "there is a cumbersome standard
> > solution" does not solve the problem.
> 
> I do not say that.

Great. I'm glad I misunderstood, and thank you for correcting me.

> To hopefully prove my point, I've hacked together a small EDE project
> for detecting files under git/hg/bzr version control, very similar to
> how you do it in your project.el (I've dropped the CVS/.svn detection
> for the moment).

> [...]

> and load some file under a git/hg/bzr versioned directory. There is an
> example function `my-get-project-root' to print the project's root.

Opening a file in a subdirectory of a repository root does not
associate it with a project. I suspect this is a bug in this "proof of
concept" implementation more so than a conceptual problem, though :-)

Thank you for providing an example implementation.

> Just to be clear: I do *not* expect that users write this stuff;
> instead, Emacs should provide projects like this as defaults.

If I understand this right, this looks good.

I'm a bit unsure about requiring EDE, CEDET, etc. for this - it's not
unlikely that people will go "meh" and not use it because of that. (I'm
sorry to say so, but the complexity of CEDET is a recurring theme on the
Emacs IRC channel.)

So in the end, what we need for trivial implementation:

- Provide a default "simple project" that auto-detects the root via
  VCS markers

- Define a (project-root) that simply returns (and
  ede-object-root-project (ede-project-root-directory
  ede-object-root-project))

- Define a (project-set-root DIR) that does (oset this :file DIR) for
  the current project. If there is no current project, this should
  create a "simple project" for that directory so other uses of
  (project-root) will find it.

- Ask authors of extensions to use (ede-minor-mode 1) in their mode
  function and simply use that function in their modes.

Does this sound sensible?

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-17 18:18                     ` Jorgen Schaefer
@ 2013-03-18 22:50                       ` David Engster
  2013-03-19  1:57                         ` John Yates
  2013-03-19  7:33                         ` Jorgen Schaefer
  0 siblings, 2 replies; 62+ messages in thread
From: David Engster @ 2013-03-18 22:50 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel

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

Jorgen Schaefer writes:
> On Sun, 17 Mar 2013 18:40:13 +0100
> David Engster <deng@randomsample.de> wrote:
>> To hopefully prove my point, I've hacked together a small EDE project
>> for detecting files under git/hg/bzr version control, very similar to
>> how you do it in your project.el (I've dropped the CVS/.svn detection
>> for the moment).
>
>> [...]
>
>> and load some file under a git/hg/bzr versioned directory. There is an
>> example function `my-get-project-root' to print the project's root.
>
> Opening a file in a subdirectory of a repository root does not
> associate it with a project. I suspect this is a bug in this "proof of
> concept" implementation more so than a conceptual problem, though :-)

I've attached a new version which should hopefully work better.

> I'm a bit unsure about requiring EDE, CEDET, etc. for this - it's not
> unlikely that people will go "meh" and not use it because of that. (I'm
> sorry to say so, but the complexity of CEDET is a recurring theme on the
> Emacs IRC channel.)

I'd like to stress again that querying EDE for stuff like the current
root project directory does not require knowledge of EIEIO/CLOS; if you
find that it does, then please report this and we fix it.

Yes, functions like `ede-project-root-directory' are actually methods,
but why does it matter? Just call them like any other function. What
*is* a real problem at the moment is that `describe-function' does not
say anything meaningful about them, but I'm in the process of fixing
that. If it's still seen as too cumbersome after that, then OK, let's
wrap'em. :-)

I'm willing to code the necessary stuff on the EDE side of things; if it
turns out too complicated to use for package maintainers, I have no
problem throwing it away.

> So in the end, what we need for trivial implementation:
>
> - Provide a default "simple project" that auto-detects the root via
>   VCS markers
>
> - Define a (project-root) that simply returns (and
>   ede-object-root-project (ede-project-root-directory
>   ede-object-root-project))

That's for the maintainers to decide. I have a hunch they'd like to have
an ede- prefix...

> - Define a (project-set-root DIR) that does (oset this :file DIR) for
>   the current project. If there is no current project, this should
>   create a "simple project" for that directory so other uses of
>   (project-root) will find it.

This can be done. I will need a bit of time though, since I really need
to do another CEDET merge round with current trunk first. I think I'll
be able to come up with something in the coming weeks.

> - Ask authors of extensions to use (ede-minor-mode 1) in their mode
>   function and simply use that function in their modes.

Not sure if it's a good idea to enable EDE behind the user's back; I
think they should enable it in their init file if they want to have
project support. But IMO that's a detail; let's cross that bridge when
we get there.

-David


[-- Attachment #2: vcs-root.el --]
[-- Type: application/emacs-lisp, Size: 1881 bytes --]

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-18 22:50                       ` David Engster
@ 2013-03-19  1:57                         ` John Yates
  2013-03-19  7:18                           ` David Engster
  2013-03-19  7:33                         ` Jorgen Schaefer
  1 sibling, 1 reply; 62+ messages in thread
From: John Yates @ 2013-03-19  1:57 UTC (permalink / raw)
  To: Jorgen Schaefer, emacs-devel

On Mon, Mar 18, 2013 at 6:50 PM, David Engster <deng@randomsample.de> wrote:
>> - Define a (project-root) that simply returns (and
>>   ede-object-root-project (ede-project-root-directory
>>   ede-object-root-project))
>
> That's for the maintainers to decide. I have a hunch they'd like to have
> an ede- prefix...
...
>> - Ask authors of extensions to use (ede-minor-mode 1) in their mode
>>   function and simply use that function in their modes.
>
> Not sure if it's a good idea to enable EDE behind the user's back; I
> think they should enable it in their init file if they want to have
> project support.

I took the sense of the OP to be that the concept of a project-root
deserved to become part of the core set of emacs concepts unrelated to
optional packages e.g. much as file and directory local variables.
Once the concept gets pulled into the core extension author simply
assume existence of project-root functionality without needing to have
to enable in any particular way.

/john



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-19  1:57                         ` John Yates
@ 2013-03-19  7:18                           ` David Engster
  2013-03-19 12:23                             ` Eric M. Ludlam
  2013-03-19 13:06                             ` Stefan Monnier
  0 siblings, 2 replies; 62+ messages in thread
From: David Engster @ 2013-03-19  7:18 UTC (permalink / raw)
  To: John Yates; +Cc: emacs-devel, Jorgen Schaefer

John Yates writes:
> I took the sense of the OP to be that the concept of a project-root
> deserved to become part of the core set of emacs concepts unrelated to
> optional packages e.g. much as file and directory local variables.
> Once the concept gets pulled into the core extension author simply
> assume existence of project-root functionality without needing to have
> to enable in any particular way.

OK, if this is something which should be available with emacs -Q right
at startup, then EDE is out. It indeed is too big for that.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-18 22:50                       ` David Engster
  2013-03-19  1:57                         ` John Yates
@ 2013-03-19  7:33                         ` Jorgen Schaefer
  1 sibling, 0 replies; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-19  7:33 UTC (permalink / raw)
  To: David Engster; +Cc: emacs-devel

On Mon, 18 Mar 2013 23:50:23 +0100
David Engster <deng@randomsample.de> wrote:

> Yes, functions like `ede-project-root-directory' are actually methods,
> but why does it matter?

Nothing. I don't have a problem with CLOS (I think you might be
confusing me with another person who mentioned a distaste for CLOS). A
method for me has a complexity of a function with one required
argument. Which is, a higher complexity than a function with no
arguments. ;-)

> I'm willing to code the necessary stuff on the EDE side of things; if
> it turns out too complicated to use for package maintainers, I have no
> problem throwing it away.

This is the tricky part. I do not know what is "too complex", and it's
difficult to predict this. The only way is to try and provide a very
simple API and see if it gets adopted.

As to EDE/CEDET's complexity, I hope that "oh no, the memory usage" or
"oh no, the load time" isn't a *huge* concern if the API is simple
enough.

It would be great if EDE has such a simple entry point to allow for
expansion and better integration between packages. That is, you can use
this API without knowing anything else, and when you need more, you can
stumble into the CEDET manual and go "woah, it's full of stars". ;-)

My original idea was to provide an API that CEDET/EDE can build upon,
too, but I don't really care either way.

> This can be done. I will need a bit of time though, since I really
> need to do another CEDET merge round with current trunk first. I
> think I'll be able to come up with something in the coming weeks.

Thank you for your willingness to support this!

> > - Ask authors of extensions to use (ede-minor-mode 1) in their mode
> >   function and simply use that function in their modes.
> 
> Not sure if it's a good idea to enable EDE behind the user's back; I
> think they should enable it in their init file if they want to have
> project support. But IMO that's a detail; let's cross that bridge when
> we get there.

Yes, it's a detail. I'm trying to replicate the current use case in
e.g. find-file-in-project where the user simply has to install ffip as
a package and can use the function without having to configure anything
else.

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-19  7:18                           ` David Engster
@ 2013-03-19 12:23                             ` Eric M. Ludlam
  2013-03-19 13:06                             ` Stefan Monnier
  1 sibling, 0 replies; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-19 12:23 UTC (permalink / raw)
  To: emacs-devel

On 03/19/2013 03:18 AM, David Engster wrote:
> John Yates writes:
>> I took the sense of the OP to be that the concept of a project-root
>> deserved to become part of the core set of emacs concepts unrelated to
>> optional packages e.g. much as file and directory local variables.
>> Once the concept gets pulled into the core extension author simply
>> assume existence of project-root functionality without needing to have
>> to enable in any particular way.
>
> OK, if this is something which should be available with emacs -Q right
> at startup, then EDE is out. It indeed is too big for that.

Hi David,

If you look at ede/base.el at the baseclass ede-project-placeholder, you 
will see bits from an old implementation of a project cache.  It used to 
save just the root directories between emacs sessions, and the 
placeholder was used in the project cache to speed up detection.  The 
goal was a "Recent Projects" menu item to load projects from.  I never 
got that far though.

It should be possible to revive that old bit of code and have a mode of 
EDE that only creates placeholders for detected projects, and only loads 
the project if the user asks, calls 'ede-compile', or some other 
explicit action.

In this scenario, I'm sure it would be possible to trim ede/base.el, and 
ede.el to be minimal, and provide just the root project detection.  CLOS 
would still be involved, but the result would be pretty light-weight.

I'd be happy to help figure that out if it would be useful.

Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-19  7:18                           ` David Engster
  2013-03-19 12:23                             ` Eric M. Ludlam
@ 2013-03-19 13:06                             ` Stefan Monnier
  2013-03-19 19:09                               ` David Engster
  1 sibling, 1 reply; 62+ messages in thread
From: Stefan Monnier @ 2013-03-19 13:06 UTC (permalink / raw)
  To: John Yates; +Cc: emacs-devel, Jorgen Schaefer

>> I took the sense of the OP to be that the concept of a project-root
>> deserved to become part of the core set of emacs concepts unrelated to
>> optional packages e.g. much as file and directory local variables.
>> Once the concept gets pulled into the core extension author simply
>> assume existence of project-root functionality without needing to have
>> to enable in any particular way.
> OK, if this is something which should be available with emacs -Q right
> at startup, then EDE is out.  It indeed is too big for that.

It should be possible to write the code such that the project-root part
of EDE doesn't require loading too much code.


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-19 13:06                             ` Stefan Monnier
@ 2013-03-19 19:09                               ` David Engster
  2013-03-20  3:21                                 ` Stefan Monnier
  0 siblings, 1 reply; 62+ messages in thread
From: David Engster @ 2013-03-19 19:09 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eric M. Ludlam, emacs-devel, Jorgen Schaefer, John Yates

Stefan Monnier writes:
>>> I took the sense of the OP to be that the concept of a project-root
>>> deserved to become part of the core set of emacs concepts unrelated to
>>> optional packages e.g. much as file and directory local variables.
>>> Once the concept gets pulled into the core extension author simply
>>> assume existence of project-root functionality without needing to have
>>> to enable in any particular way.
>> OK, if this is something which should be available with emacs -Q right
>> at startup, then EDE is out.  It indeed is too big for that.
>
> It should be possible to write the code such that the project-root part
> of EDE doesn't require loading too much code.

Yes, but no matter how small, EDE depends on EIEIO, so this would mean
that EIEIO is loaded right at startup. I thought this would be
considered a showstopper, even when we clean up its namespace use.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-19 19:09                               ` David Engster
@ 2013-03-20  3:21                                 ` Stefan Monnier
  2013-03-20  4:48                                   ` Leo Liu
  2013-03-20  7:13                                   ` David Engster
  0 siblings, 2 replies; 62+ messages in thread
From: Stefan Monnier @ 2013-03-20  3:21 UTC (permalink / raw)
  To: John Yates; +Cc: Jorgen Schaefer, Eric M. Ludlam, emacs-devel

>>>> I took the sense of the OP to be that the concept of a project-root
>>>> deserved to become part of the core set of emacs concepts unrelated to
>>>> optional packages e.g. much as file and directory local variables.
>>>> Once the concept gets pulled into the core extension author simply
>>>> assume existence of project-root functionality without needing to have
>>>> to enable in any particular way.
>>> OK, if this is something which should be available with emacs -Q right
>>> at startup, then EDE is out.  It indeed is too big for that.
>> It should be possible to write the code such that the project-root part
>> of EDE doesn't require loading too much code.
> Yes, but no matter how small, EDE depends on EIEIO, so this would mean
> that EIEIO is loaded right at startup.  I thought this would be
> considered a showstopper, even when we clean up its namespace use.

Right, preloading EIEIO is not what I was planning to do, indeed.
IOW, I think the challenge is to extract the "project-root" part of EDE
in such a way that it doesn't require preloading as much code.
That might require splitting EIEIO, or some other approach, maybe,
I don't know.


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20  3:21                                 ` Stefan Monnier
@ 2013-03-20  4:48                                   ` Leo Liu
  2013-03-20  7:04                                     ` joakim
  2013-03-20  7:05                                     ` David Engster
  2013-03-20  7:13                                   ` David Engster
  1 sibling, 2 replies; 62+ messages in thread
From: Leo Liu @ 2013-03-20  4:48 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Jorgen Schaefer, emacs-devel, Eric M. Ludlam, John Yates

On 2013-03-20 11:21 +0800, Stefan Monnier wrote:
> Right, preloading EIEIO is not what I was planning to do, indeed.
> IOW, I think the challenge is to extract the "project-root" part of EDE
> in such a way that it doesn't require preloading as much code.
> That might require splitting EIEIO, or some other approach, maybe,
> I don't know.

I personally would like a package not using any of pseudo-CLOS features
unless it is ABSOLUTELY necessary. There are projects with far larger
scale and beautifully built before EIEIO came along.

Leo



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20  4:48                                   ` Leo Liu
@ 2013-03-20  7:04                                     ` joakim
  2013-03-20  7:05                                     ` David Engster
  1 sibling, 0 replies; 62+ messages in thread
From: joakim @ 2013-03-20  7:04 UTC (permalink / raw)
  To: Leo Liu
  Cc: Eric M. Ludlam, emacs-devel, Stefan Monnier, John Yates,
	Jorgen Schaefer

Leo Liu <sdl.web@gmail.com> writes:

> On 2013-03-20 11:21 +0800, Stefan Monnier wrote:
>> Right, preloading EIEIO is not what I was planning to do, indeed.
>> IOW, I think the challenge is to extract the "project-root" part of EDE
>> in such a way that it doesn't require preloading as much code.
>> That might require splitting EIEIO, or some other approach, maybe,
>> I don't know.
>
> I personally would like a package not using any of pseudo-CLOS features
> unless it is ABSOLUTELY necessary. There are projects with far larger
> scale and beautifully built before EIEIO came along.

Just so another view is represented then:

I think EIEIO is pretty neat. The EDE feature is also prety neat. It has
most features you need in a project root fromework already. What it
lacks is ease of use.

If we rewrite EDE using some other method, it will eventually turn into
EDE if its going to cater for the same use-cases.

IMHO if one would like to work on reducing the footprint of Emacs, which
is a worthy goal, greater gains could be made implementing lazy loading
of C libraries on platforms where its possible.

> Leo
>

-- 
Joakim Verona



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20  4:48                                   ` Leo Liu
  2013-03-20  7:04                                     ` joakim
@ 2013-03-20  7:05                                     ` David Engster
  1 sibling, 0 replies; 62+ messages in thread
From: David Engster @ 2013-03-20  7:05 UTC (permalink / raw)
  To: Leo Liu
  Cc: Eric M. Ludlam, emacs-devel, Stefan Monnier, John Yates,
	Jorgen Schaefer

Leo Liu writes:
> On 2013-03-20 11:21 +0800, Stefan Monnier wrote:
>> Right, preloading EIEIO is not what I was planning to do, indeed.
>> IOW, I think the challenge is to extract the "project-root" part of EDE
>> in such a way that it doesn't require preloading as much code.
>> That might require splitting EIEIO, or some other approach, maybe,
>> I don't know.
>
> I personally would like a package not using any of pseudo-CLOS features
> unless it is ABSOLUTELY necessary. There are projects with far larger
> scale and beautifully built before EIEIO came along.

That's a straw man argument. No one here is claiming that EIEIO is
needed to build large scale packages. EDE just happens to use it.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20  3:21                                 ` Stefan Monnier
  2013-03-20  4:48                                   ` Leo Liu
@ 2013-03-20  7:13                                   ` David Engster
  2013-03-20 12:57                                     ` Stefan Monnier
  1 sibling, 1 reply; 62+ messages in thread
From: David Engster @ 2013-03-20  7:13 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Jorgen Schaefer, emacs-devel, Eric M. Ludlam, John Yates

Stefan Monnier writes:
>>>>> I took the sense of the OP to be that the concept of a project-root
>>>>> deserved to become part of the core set of emacs concepts unrelated to
>>>>> optional packages e.g. much as file and directory local variables.
>
>>>>> Once the concept gets pulled into the core extension author simply
>>>>> assume existence of project-root functionality without needing to have
>>>>> to enable in any particular way.
>>>> OK, if this is something which should be available with emacs -Q right
>>>> at startup, then EDE is out.  It indeed is too big for that.
>>> It should be possible to write the code such that the project-root part
>>> of EDE doesn't require loading too much code.
>> Yes, but no matter how small, EDE depends on EIEIO, so this would mean
>> that EIEIO is loaded right at startup.  I thought this would be
>> considered a showstopper, even when we clean up its namespace use.
>
> Right, preloading EIEIO is not what I was planning to do, indeed.
> IOW, I think the challenge is to extract the "project-root" part of EDE
> in such a way that it doesn't require preloading as much code.
> That might require splitting EIEIO, or some other approach, maybe,
> I don't know.

I don't think that's a practical approach. In EDE, a project *is* a
class.

I would however like to ask if such a 'project-root' feature is
absolutely needed right at startup time. I'm not sure about the overhead
involved when loading files, which might be annoying to people who don't
need it. OTOH, we already have vc-find-file-hook enabled by default,
which I guess renders such questions moot...

BTW, I was wondering if the vc package couldn't just provide the current
root; it felt kind of silly to implement scanning for vcs markers, when
'vc' actually already did that. This way, we could implement a
'project-root' function, which first checks if there's an EDE project,
and if not, it could return the root directory from 'vc' if the current
file is under version control.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20  7:13                                   ` David Engster
@ 2013-03-20 12:57                                     ` Stefan Monnier
  2013-03-20 16:14                                       ` Davis Herring
  2013-03-20 16:34                                       ` David Engster
  0 siblings, 2 replies; 62+ messages in thread
From: Stefan Monnier @ 2013-03-20 12:57 UTC (permalink / raw)
  To: John Yates; +Cc: Eric M. Ludlam, emacs-devel, Jorgen Schaefer

>> That might require splitting EIEIO, or some other approach, maybe,
>> I don't know.
> I don't think that's a practical approach. In EDE, a project *is* a
> class.

[ Actually, there are various reasons to split EIEIO, one of them would
  be to try and fix the eval-and-compile mess.  ]

> I would however like to ask if such a 'project-root' feature is
> absolutely needed right at startup time. I'm not sure about the overhead
> involved when loading files, which might be annoying to people who don't
> need it. OTOH, we already have vc-find-file-hook enabled by default,
> which I guess renders such questions moot...

Right, one possible approach is to try and delay the use of
project-root, as is done for VC: have a preloaded ede-hooks.el file
which is just enough to try and detect projects that use EDE, and then
only load EDE if/when opening a file in such a project.


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 12:57                                     ` Stefan Monnier
@ 2013-03-20 16:14                                       ` Davis Herring
  2013-03-20 17:41                                         ` Stefan Monnier
                                                           ` (2 more replies)
  2013-03-20 16:34                                       ` David Engster
  1 sibling, 3 replies; 62+ messages in thread
From: Davis Herring @ 2013-03-20 16:14 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eric M. Ludlam, emacs-devel, Jorgen Schaefer, John Yates

> Right, one possible approach is to try and delay the use of
> project-root, as is done for VC: have a preloaded ede-hooks.el file
> which is just enough to try and detect projects that use EDE, and then
> only load EDE if/when opening a file in such a project.

If we have VCS-based EDE project autovivification, this means that any
file under version control will load EDE.  Is that sufficiently far from
"always" to warrant the effort?

Davis

-- 
This product is sold by volume, not by mass.  If it appears too dense or
too sparse, it is because mass-energy conversion has occurred during
shipping.



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 12:57                                     ` Stefan Monnier
  2013-03-20 16:14                                       ` Davis Herring
@ 2013-03-20 16:34                                       ` David Engster
  2013-03-20 17:47                                         ` Stefan Monnier
  2013-03-20 17:49                                         ` Jorgen Schaefer
  1 sibling, 2 replies; 62+ messages in thread
From: David Engster @ 2013-03-20 16:34 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eric M. Ludlam, emacs-devel, Jorgen Schaefer, John Yates

Stefan Monnier writes:
>>> That might require splitting EIEIO, or some other approach, maybe,
>>> I don't know.
>> I don't think that's a practical approach. In EDE, a project *is* a
>> class.
>
> [ Actually, there are various reasons to split EIEIO, one of them would
>   be to try and fix the eval-and-compile mess.  ]

What do you mean by "splitting EIEIO"? Into what parts?

>> I would however like to ask if such a 'project-root' feature is
>> absolutely needed right at startup time. I'm not sure about the overhead
>> involved when loading files, which might be annoying to people who don't
>> need it. OTOH, we already have vc-find-file-hook enabled by default,
>> which I guess renders such questions moot...
>
> Right, one possible approach is to try and delay the use of
> project-root, as is done for VC: have a preloaded ede-hooks.el file
> which is just enough to try and detect projects that use EDE, and then
> only load EDE if/when opening a file in such a project.

This won't work; you cannot detect whether a file is part of a project
without the project's definition (which comes in the form of a class, as
I've already written). It's a chicken/egg thing. Yes, there are projects
which save their state in a file 'Project.ede'; these could be detected,
but that's a special case.

So again, if such a 'project-root' feature is needed at startup, EDE is
out. Separating EDE from EIEIO would mean rewriting it.

Instead, I'd vote for a very simple approach which at least takes EDE
projects into account, among other things. Roughly like this:

(defun project-root-ede (file)
  (when (and (featurep' ede)
             (with-current-buffer file
               ede-object-root-project))
    ... return EDE root ... ))

(defun project-root-vc (file)
  (when (vc-file-registered file)
    ... return root from VC ... ))

(defvar project-root-detect-functions 
          '(project-root-ede project-root-vc))

(defun project-root ()
   (run-hook-with-args-until-success
       project-root-detect-functions
       (buffer-file-name (current-buffer))))

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 16:14                                       ` Davis Herring
@ 2013-03-20 17:41                                         ` Stefan Monnier
  2013-03-20 17:48                                         ` Stefan Monnier
  2013-03-20 18:20                                         ` Bruce Korb
  2 siblings, 0 replies; 62+ messages in thread
From: Stefan Monnier @ 2013-03-20 17:41 UTC (permalink / raw)
  To: Davis Herring; +Cc: emacs-devel, Jorgen Schaefer, John Yates, Eric M. Ludlam

>> Right, one possible approach is to try and delay the use of
>> project-root, as is done for VC: have a preloaded ede-hooks.el file
>> which is just enough to try and detect projects that use EDE, and then
>> only load EDE if/when opening a file in such a project.
> If we have VCS-based EDE project autovivification, this means that any
> file under version control will load EDE.

No, not necessarily.


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 16:34                                       ` David Engster
@ 2013-03-20 17:47                                         ` Stefan Monnier
  2013-03-21  0:55                                           ` Eric M. Ludlam
  2013-03-20 17:49                                         ` Jorgen Schaefer
  1 sibling, 1 reply; 62+ messages in thread
From: Stefan Monnier @ 2013-03-20 17:47 UTC (permalink / raw)
  To: John Yates; +Cc: emacs-devel, Jorgen Schaefer, Eric M. Ludlam

>> [ Actually, there are various reasons to split EIEIO, one of them would
>> be to try and fix the eval-and-compile mess.  ]
> What do you mean by "splitting EIEIO"? Into what parts?

Sorry, I mostly meant "split eieio.el".  What parts?  Well, that's
a good question.  I think if I knew, I'd have done that already ;-)
Maybe a first split would be "all the code in eieio.el up until the end
of the first big eval-and-compile".
At least, if the aim is to get rid of those nasty eval-and-compile.

> This won't work; you cannot detect whether a file is part of a project
> without the project's definition (which comes in the form of a class, as
> I've already written). It's a chicken/egg thing.

I don't think so.  The first part of the detection is to look for the
tell-tale files (.bzr, .dir-locals, Tupfile, you name it).

The project definitions can setup some side table that can be preloaded
and used by a function that looks for those files.

Some of those files will be frequent enough that we may also want to
preload some additional predicate that checks whether we really need to
load "the rest".


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 16:14                                       ` Davis Herring
  2013-03-20 17:41                                         ` Stefan Monnier
@ 2013-03-20 17:48                                         ` Stefan Monnier
  2013-03-20 18:20                                         ` Bruce Korb
  2 siblings, 0 replies; 62+ messages in thread
From: Stefan Monnier @ 2013-03-20 17:48 UTC (permalink / raw)
  To: Davis Herring; +Cc: emacs-devel, Jorgen Schaefer, John Yates, Eric M. Ludlam

> If we have VCS-based EDE project autovivification, this means that any
> file under version control will load EDE.

In order to find a solution to the problem, you shouldn't try to find
the reasons why it will fail, but instead find how you can make it work
(including how to rephrase the problem so it can be solved).


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 16:34                                       ` David Engster
  2013-03-20 17:47                                         ` Stefan Monnier
@ 2013-03-20 17:49                                         ` Jorgen Schaefer
  1 sibling, 0 replies; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-20 17:49 UTC (permalink / raw)
  To: David Engster; +Cc: Stefan Monnier, emacs-devel

On Wed, 20 Mar 2013 17:34:09 +0100
David Engster <deng@randomsample.de> wrote:

> Instead, I'd vote for a very simple approach which at least takes EDE
> projects into account, among other things. Roughly like this:
> 
> (defun project-root-ede (file)
>   (when (and (featurep' ede)
>              (with-current-buffer file
>                ede-object-root-project))
>     ... return EDE root ... ))
> 
> (defun project-root-vc (file)
>   (when (vc-file-registered file)
>     ... return root from VC ... ))
> 
> (defvar project-root-detect-functions 
>           '(project-root-ede project-root-vc))
> 
> (defun project-root ()
>    (run-hook-with-args-until-success
>        project-root-detect-functions
>        (buffer-file-name (current-buffer))))

This sounds like an excellent idea. If you guarantee the hook to be run
in the file's buffer, you do not even need the argument.

Happy to write the code etc. if this is deemed the way to go :-)

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 16:14                                       ` Davis Herring
  2013-03-20 17:41                                         ` Stefan Monnier
  2013-03-20 17:48                                         ` Stefan Monnier
@ 2013-03-20 18:20                                         ` Bruce Korb
  2013-03-20 22:14                                           ` Stefan Monnier
  2 siblings, 1 reply; 62+ messages in thread
From: Bruce Korb @ 2013-03-20 18:20 UTC (permalink / raw)
  To: Davis Herring
  Cc: emacs-devel, John Yates, Stefan Monnier, Jorgen Schaefer,
	Eric M. Ludlam

On 03/20/13 09:14, Davis Herring wrote:
>> Right, one possible approach is to try and delay the use of
>> project-root, as is done for VC: have a preloaded ede-hooks.el file
>> which is just enough to try and detect projects that use EDE, and ...

All this is really nice for projects that allow editor hint files
to be incorporated into the project.  Otherwise, no.  Some projects
I work on absolutely insist on not having any editor hints anywhere
at all.  After all, there is one and only one correct way to format
your code, so learn it, use it and keep the hints out of the source.

Maybe just make this easier, since it doesn't work for me:

http://www.emacswiki.org/ProjectSettings
http://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 18:20                                         ` Bruce Korb
@ 2013-03-20 22:14                                           ` Stefan Monnier
  0 siblings, 0 replies; 62+ messages in thread
From: Stefan Monnier @ 2013-03-20 22:14 UTC (permalink / raw)
  To: Bruce Korb; +Cc: emacs-devel, Jorgen Schaefer, John Yates, Eric M. Ludlam

>>> Right, one possible approach is to try and delay the use of
>>> project-root, as is done for VC: have a preloaded ede-hooks.el file
>>> which is just enough to try and detect projects that use EDE, and ...
> All this is really nice for projects that allow editor hint files
> to be incorporated into the project.  Otherwise, no.

The text you quoted does not assume you make any Emacs-specific changes
to your project.


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-20 17:47                                         ` Stefan Monnier
@ 2013-03-21  0:55                                           ` Eric M. Ludlam
  2013-03-21  3:27                                             ` Stefan Monnier
  2013-03-21 16:32                                             ` A unified project root interface David Engster
  0 siblings, 2 replies; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-21  0:55 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, Jorgen Schaefer, David Engster, John Yates

On 03/20/2013 01:47 PM, Stefan Monnier wrote:
>>> [ Actually, there are various reasons to split EIEIO, one of them would
>>> be to try and fix the eval-and-compile mess.  ]
>> What do you mean by "splitting EIEIO"? Into what parts?
>
> Sorry, I mostly meant "split eieio.el".  What parts?  Well, that's
> a good question.  I think if I knew, I'd have done that already ;-)
> Maybe a first split would be "all the code in eieio.el up until the end
> of the first big eval-and-compile".
> At least, if the aim is to get rid of those nasty eval-and-compile.

This email, and browsing in eieio.el in the CEDET repository gave me an 
a-ha moment.  I think I know how to "split" eieio such that the 
eval-and-compile elements are fixed, and have a much nicer eieio.el in 
the process.  My initial experiments show I'm on the right track.

David, is there something that needs merging from Emacs to CEDET I need 
to worry about before making massive structural changes in EIEIO?

>> This won't work; you cannot detect whether a file is part of a project
>> without the project's definition (which comes in the form of a class, as
>> I've already written). It's a chicken/egg thing.
>
> I don't think so.  The first part of the detection is to look for the
> tell-tale files (.bzr, .dir-locals, Tupfile, you name it).
>
> The project definitions can setup some side table that can be preloaded
> and used by a function that looks for those files.
>
> Some of those files will be frequent enough that we may also want to
> preload some additional predicate that checks whether we really need to
> load "the rest".

I think all David is trying to say is that the EDE project detection 
system uses EIEIO classes to hold the match data.  For example, the 
class instance contains the name of the key file to look for that 
identifies the project.

If the goal is to use EDE's detection scheme and data, but not load EDE 
project classes, then we are all set already since the EDE project 
classes are not directly involved in detecting the projects.  If the 
goal is to not use EIEIO at all, then we'd end up just using a plist 
other random data structure instead of using EIEIO to do it.  This 
wouldn't be a big deal because AFAIK, these classes aren't subclassed, 
so impact would be small.

In both cases above, we'd need a simple mechanism to disable the loading 
of EDE project classes, and using a placeholder in the project cache 
instead.

Alternately, perhaps I can find out why EIEIO isn't acceptable, and fix 
that instead.

Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-21  0:55                                           ` Eric M. Ludlam
@ 2013-03-21  3:27                                             ` Stefan Monnier
  2013-03-21  4:07                                               ` Eric M. Ludlam
  2013-03-21 16:32                                             ` A unified project root interface David Engster
  1 sibling, 1 reply; 62+ messages in thread
From: Stefan Monnier @ 2013-03-21  3:27 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: Jorgen Schaefer, John Yates, David Engster, emacs-devel

> My initial experiments show I'm on the right track.
> David, is there something that needs merging from Emacs to CEDET I need to
> worry about before making massive structural changes in EIEIO?

The EIEIO in Emacs has my renaming patch (which fixes some of the
namespace issues, tho it's only a first step).

Maybe it would make sense to make this change on Emacs's side only.
And to split EIEIO from CEDET (you can distribute an "old EIEIO" for
users of CEDET on older Emacsen that came without EIEIO).

> If the goal is to use EDE's detection scheme and data, but not load EDE
> project classes, then we are all set already since the EDE project classes
> are not directly involved in detecting the projects.  If the goal is to not
> use EIEIO at all, then we'd end up just using a plist other random data
> structure instead of using EIEIO to do it.  This wouldn't be a big deal
> because AFAIK, these classes aren't subclassed, so impact would be small.

I'mnot sure I understand exactly what you're saying, but IIUC you're
saying that there's not much to do to delay EDE loading, and we could
even delay loading of EIEIO with a few code changes.

That sounds promising and confirms my intuition.

> In both cases above, we'd need a simple mechanism to disable the loading of
> EDE project classes, and using a placeholder in the project cache instead.

Sot sure what you're saying here.

> Alternately, perhaps I can find out why EIEIO isn't acceptable, and fix
> that instead.

Preloading EIEIO and EDE is not something I'm ready to do.  Even just
preloading EIEIO is not something I'm ready to do either.

I haven't started to think about why, but I'm pretty sure EDE is out of
the question for now.  For EIEIO, maybe we could take a look at what it
would entail to see under which circumstances it would be acceptable,
but first it'd need to be namespace clean.

From what you say above, it's probably easier to change EDE to not use
EIEIO for the data used for project-detection, before EDE is
actually loaded.


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-21  3:27                                             ` Stefan Monnier
@ 2013-03-21  4:07                                               ` Eric M. Ludlam
  2013-03-21 14:33                                                 ` Stefan Monnier
  2013-03-22  2:12                                                 ` Eric M. Ludlam
  0 siblings, 2 replies; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-21  4:07 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Jorgen Schaefer, John Yates, David Engster, emacs-devel

On 03/20/2013 11:27 PM, Stefan Monnier wrote:
>> My initial experiments show I'm on the right track.
>> David, is there something that needs merging from Emacs to CEDET I need to
>> worry about before making massive structural changes in EIEIO?
>
> The EIEIO in Emacs has my renaming patch (which fixes some of the
> namespace issues, tho it's only a first step).
>
> Maybe it would make sense to make this change on Emacs's side only.
> And to split EIEIO from CEDET (you can distribute an "old EIEIO" for
> users of CEDET on older Emacsen that came without EIEIO).

Hmmm, well, I managed to split EIEIO to no longer use eval-and-compile, 
and it is passing my unit tests, but not my integration tests.  I made 
CEDET branch with this change in it in case someone wants to play with it.

http://cedet.bzr.sourceforge.net/bzr/cedet/code/eieiosplit/files/head%3A/lisp/eieio/

Getting the integration tests to pass is more than I have time for 
tonight though.

>> If the goal is to use EDE's detection scheme and data, but not load EDE
>> project classes, then we are all set already since the EDE project classes
>> are not directly involved in detecting the projects.  If the goal is to not
>> use EIEIO at all, then we'd end up just using a plist other random data
>> structure instead of using EIEIO to do it.  This wouldn't be a big deal
>> because AFAIK, these classes aren't subclassed, so impact would be small.
>
> I'mnot sure I understand exactly what you're saying, but IIUC you're
> saying that there's not much to do to delay EDE loading, and we could
> even delay loading of EIEIO with a few code changes.

Correct

> That sounds promising and confirms my intuition.
>
>> Alternately, perhaps I can find out why EIEIO isn't acceptable, and fix
>> that instead.
>
> Preloading EIEIO and EDE is not something I'm ready to do.  Even just
> preloading EIEIO is not something I'm ready to do either.

Is this stating that the goal is for project detection to be part of 
Lisp code that is dumped with Emacs?

> I haven't started to think about why, but I'm pretty sure EDE is out of
> the question for now.  For EIEIO, maybe we could take a look at what it
> would entail to see under which circumstances it would be acceptable,
> but first it'd need to be namespace clean.
>
>> From what you say above, it's probably easier to change EDE to not use
> EIEIO for the data used for project-detection, before EDE is
> actually loaded.

If we are talking about what gets dumped out with Emacs, I agree.

Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-21  4:07                                               ` Eric M. Ludlam
@ 2013-03-21 14:33                                                 ` Stefan Monnier
  2013-03-22  2:12                                                 ` Eric M. Ludlam
  1 sibling, 0 replies; 62+ messages in thread
From: Stefan Monnier @ 2013-03-21 14:33 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: Jorgen Schaefer, John Yates, David Engster, emacs-devel

>> Preloading EIEIO and EDE is not something I'm ready to do.  Even just
>> preloading EIEIO is not something I'm ready to do either.
> Is this stating that the goal is for project detection to be part of Lisp
> code that is dumped with Emacs?

Yes.


        Stefan



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-21  0:55                                           ` Eric M. Ludlam
  2013-03-21  3:27                                             ` Stefan Monnier
@ 2013-03-21 16:32                                             ` David Engster
  2013-03-22  0:47                                               ` Eric M. Ludlam
  1 sibling, 1 reply; 62+ messages in thread
From: David Engster @ 2013-03-21 16:32 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: emacs-devel, Stefan Monnier, Jorgen Schaefer, John Yates

Eric M. Ludlam writes:
W> On 03/20/2013 01:47 PM, Stefan Monnier wrote:
>> Sorry, I mostly meant "split eieio.el".  What parts?  Well, that's
>> a good question.  I think if I knew, I'd have done that already ;-)
>> Maybe a first split would be "all the code in eieio.el up until the end
>> of the first big eval-and-compile".
>> At least, if the aim is to get rid of those nasty eval-and-compile.
>
> This email, and browsing in eieio.el in the CEDET repository gave me
> an a-ha moment.  I think I know how to "split" eieio such that the
> eval-and-compile elements are fixed, and have a much nicer eieio.el in
> the process.  My initial experiments show I'm on the right track.
>
> David, is there something that needs merging from Emacs to CEDET I
> need to worry about before making massive structural changes in EIEIO?

No, it's all already merged to upstream, including the renames by
Stefan.

> If the goal is to use EDE's detection scheme and data, but not load
> EDE project classes, then we are all set already since the EDE project
> classes are not directly involved in detecting the projects.  If the
> goal is to not use EIEIO at all, then we'd end up just using a plist
> other random data structure instead of using EIEIO to do it.  This
> wouldn't be a big deal because AFAIK, these classes aren't subclassed,
> so impact would be small.

Let's talk examples, then. Say we have

 (ede-project-autoload "vcs-root"
		       :name "VCS ROOT"
		       :file 'vcs-root
		       :proj-file 'ede-check-for-vcs-dirs
		       :proj-root 'ede-vcs-root-dir
		       :proj-root-dirmatch "NONE"
		       :class-sym 'ede-vcs-root-project
		       :load-type 'ede-vcs-root-load
		       :new-p nil
		       :safe-p t)

So from that we'd take the list of slots, which is practically a plist,
and would write something akin to ede-dir-to-projectfile, but using
plist-get/set instead of oref/oset?

And what would happen when `ede-check-for-vcs-dirs' returns t?  Would
that load EDE then, or would we try to go on to provide the basic
functionality (like getting the root) with a class-less version?

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-21 16:32                                             ` A unified project root interface David Engster
@ 2013-03-22  0:47                                               ` Eric M. Ludlam
  2013-03-22 20:30                                                 ` David Engster
  0 siblings, 1 reply; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-22  0:47 UTC (permalink / raw)
  To: Stefan Monnier, John Yates, emacs-devel, Jorgen Schaefer

On 03/21/2013 12:32 PM, David Engster wrote:
> Eric M. Ludlam writes:
> W>  On 03/20/2013 01:47 PM, Stefan Monnier wrote:
>>> Sorry, I mostly meant "split eieio.el".  What parts?  Well, that's
>>> a good question.  I think if I knew, I'd have done that already ;-)
>>> Maybe a first split would be "all the code in eieio.el up until the end
>>> of the first big eval-and-compile".
>>> At least, if the aim is to get rid of those nasty eval-and-compile.
>>
>> This email, and browsing in eieio.el in the CEDET repository gave me
>> an a-ha moment.  I think I know how to "split" eieio such that the
>> eval-and-compile elements are fixed, and have a much nicer eieio.el in
>> the process.  My initial experiments show I'm on the right track.
>>
>> David, is there something that needs merging from Emacs to CEDET I
>> need to worry about before making massive structural changes in EIEIO?
>
> No, it's all already merged to upstream, including the renames by
> Stefan.

Great!  Thanks.

>> If the goal is to use EDE's detection scheme and data, but not load
>> EDE project classes, then we are all set already since the EDE project
>> classes are not directly involved in detecting the projects.  If the
>> goal is to not use EIEIO at all, then we'd end up just using a plist
>> other random data structure instead of using EIEIO to do it.  This
>> wouldn't be a big deal because AFAIK, these classes aren't subclassed,
>> so impact would be small.
>
> Let's talk examples, then. Say we have
>
>   (ede-project-autoload "vcs-root"
> 		       :name "VCS ROOT"
> 		       :file 'vcs-root
> 		       :proj-file 'ede-check-for-vcs-dirs
> 		       :proj-root 'ede-vcs-root-dir
> 		       :proj-root-dirmatch "NONE"
> 		       :class-sym 'ede-vcs-root-project
> 		       :load-type 'ede-vcs-root-load
> 		       :new-p nil
> 		       :safe-p t)
>
> So from that we'd take the list of slots, which is practically a plist,
> and would write something akin to ede-dir-to-projectfile, but using
> plist-get/set instead of oref/oset?

Yes, basically.  Seems odd to swap one data type form for another, but 
there it is.  Since the class name is used as a function, no code using 
it will need to change.  Perhaps.

> And what would happen when `ede-check-for-vcs-dirs' returns t?  Would
> that load EDE then, or would we try to go on to provide the basic
> functionality (like getting the root) with a class-less version?

I think this will be a bit of a challenge.  The project detection, and 
then project hash are the key important pieces.  If the goal is to get 
something that will be dumped w/ Emacs, and Fast, we'd need to start by 
refactoring ede/files.el to split out the parts that track the 
directory-to-project associations from all the misc EDE related file 
finding routines.

Once that is working, I had originally thought we could use the 
ede-project-placeholder as a starting point since it was designed to be 
swapped out for a real project later, but that is still an EIEIO class.

Instead, probably another small list left as a buffer-local variable 
that can be tracked.  I imagine it would hold the root of the project, 
and some misc :key describing the nature of the matched project.  That 
would be used instead of ede-object for quick project detection.  I 
think it would also need a couple new hooks, including 
ede-new-project-detected-hook.  EDE would use that to actually load a 
project instead of doing so directly from the auto-loader.

Another option is to hand-craft an EIEIO object vector.  They are all 
just vectors, so if we had an EIEIO class that had a small number of 
slots (smaller than the existing placeholder object) it could be created 
by hand with (vector ... ) and used to track projects.  Once EIEIO was 
loaded, more complex code could just keep using it, but as an object.  I 
wouldn't do that if there were more than 2 or 3 slots in it though.  As 
code changed, the indices might change, and maintenance would be a pain. 
  As for a transition strategy though, it might make things easier.

As for ede-check-for-vcs-dirs, it would need to provide data to the 
auto-loader that doesn't need to be called to detect the project.  There 
is a bit of logic that says "If the :file isn't loaded yet, try this 
other thing".  That way if it is loaded, it can use one of the handy 
functions which often have caches of their own for detection and makes 
things faster.

On the flip side, perhaps this is an opportunity to simplify.  There is 
a bunch of historical baggage in the loader.  I'll bet there are some 
options that could be fixed/removed, simplifying the whole thing.

Anyway, the key is that the autoloader could be recycled into something 
EIEIO free, and a simple hook would give EDE what it needs to keep 
going, without it's current custom autoloader, and it might be possible 
to keep old registration fcns working in the process.

Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-21  4:07                                               ` Eric M. Ludlam
  2013-03-21 14:33                                                 ` Stefan Monnier
@ 2013-03-22  2:12                                                 ` Eric M. Ludlam
  2013-03-23 11:04                                                   ` EIEIO split (was: A unified project root interface) David Engster
  1 sibling, 1 reply; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-22  2:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: David Engster, emacs-devel

On 03/21/2013 12:07 AM, Eric M. Ludlam wrote:
> Hmmm, well, I managed to split EIEIO to no longer use eval-and-compile,
> and it is passing my unit tests, but not my integration tests.  I made
> CEDET branch with this change in it in case someone wants to play with it.
>
> http://cedet.bzr.sourceforge.net/bzr/cedet/code/eieiosplit/files/head%3A/lisp/eieio/
>
>
> Getting the integration tests to pass is more than I have time for
> tonight though.

I found the fix for the integration tests, and have been running on this 
branch this evening.  I also removed the eval-and-compile from the 
defclass macro.  All builds and tests seem to run fine.

I did some basic dev with it, and seems to be working fine.

If anyone has comments on this branch, or thoughts that will make it 
better, let me know.

Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-22  0:47                                               ` Eric M. Ludlam
@ 2013-03-22 20:30                                                 ` David Engster
  2013-03-23 17:10                                                   ` Eric M. Ludlam
  0 siblings, 1 reply; 62+ messages in thread
From: David Engster @ 2013-03-22 20:30 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: emacs-devel, Stefan Monnier, Jorgen Schaefer, John Yates

Eric M. Ludlam writes:
> On 03/21/2013 12:32 PM, David Engster wrote:
>> And what would happen when `ede-check-for-vcs-dirs' returns t?  Would
>> that load EDE then, or would we try to go on to provide the basic
>> functionality (like getting the root) with a class-less version?
>
> I think this will be a bit of a challenge.  The project detection, and
> then project hash are the key important pieces.  If the goal is to get
> something that will be dumped w/ Emacs, and Fast, we'd need to start
> by refactoring ede/files.el to split out the parts that track the
> directory-to-project associations from all the misc EDE related file
> finding routines.

Frankly, I don't think this is the right approach. To cite from Jorgen's
initial post which started this whole thread:

"The usual way to define a project is via the "project root", a
directory so that all files under that directory are considered part of
"the project"."

As he also stresses, this is *not* a complex problem to solve, quite the
contrary.

Therefore, I don't think it is necessary or even desirable to rewrite
the whole EDE project autodetection into a class-less version, which
then by all means tries to delay loading the "real" EDE as long as
possible. It is not necessary that an 'emacs -Q' can detect all kinds of
projects from Linux kernel trees to the Emacs source. If people need
this, they should just put 'global-ede-mode' in their init file (which
takes about 0.1 seconds on my machine) and use the full-fledged EDE.

> Instead, probably another small list left as a buffer-local variable
> that can be tracked.  I imagine it would hold the root of the project,
> and some misc :key describing the nature of the matched project.  That
> would be used instead of ede-object for quick project detection.

[...]

> On the flip side, perhaps this is an opportunity to simplify.  There
> is a bunch of historical baggage in the loader.  I'll bet there are
> some options that could be fixed/removed, simplifying the whole thing.
>
> Anyway, the key is that the autoloader could be recycled into
> something EIEIO free, and a simple hook would give EDE what it needs
> to keep going, without it's current custom autoloader, and it might be
> possible to keep old registration fcns working in the process.

I'm wondering: what is the advantage of having this class-less EDE
autoloader, compared to a new, simple package which is able to detect
simple projects and which can be overridden by EDE?

My problem is not that I don't think this couldn't work. I'm pretty sure
it would. However, it sounds like way too much work for something which
should be really simple, and which has not much benefit for EDE as a
framework; in fact, I wonder if it doesn't even raise its complexity.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* EIEIO split (was: A unified project root interface)
  2013-03-22  2:12                                                 ` Eric M. Ludlam
@ 2013-03-23 11:04                                                   ` David Engster
  0 siblings, 0 replies; 62+ messages in thread
From: David Engster @ 2013-03-23 11:04 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: Stefan Monnier, emacs-devel

Eric M. Ludlam writes:
> On 03/21/2013 12:07 AM, Eric M. Ludlam wrote:
>> Hmmm, well, I managed to split EIEIO to no longer use eval-and-compile,
>> and it is passing my unit tests, but not my integration tests.  I made
>> CEDET branch with this change in it in case someone wants to play with it.
>>
>> http://cedet.bzr.sourceforge.net/bzr/cedet/code/eieiosplit/files/head%3A/lisp/eieio/
>>
>>
>> Getting the integration tests to pass is more than I have time for
>> tonight though.
>
> I found the fix for the integration tests, and have been running on
> this branch this evening.  I also removed the eval-and-compile from
> the defclass macro.  All builds and tests seem to run fine.
>
> I did some basic dev with it, and seems to be working fine.
>
> If anyone has comments on this branch, or thoughts that will make it
> better, let me know.

I think this is a very good change and should be merged, since this will
also fix bug #13813 on our side.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-22 20:30                                                 ` David Engster
@ 2013-03-23 17:10                                                   ` Eric M. Ludlam
  2013-03-23 17:26                                                     ` Jorgen Schaefer
  0 siblings, 1 reply; 62+ messages in thread
From: Eric M. Ludlam @ 2013-03-23 17:10 UTC (permalink / raw)
  To: Stefan Monnier, John Yates, emacs-devel, Jorgen Schaefer



On 03/22/2013 04:30 PM, David Engster wrote:
> Eric M. Ludlam writes:
>> On 03/21/2013 12:32 PM, David Engster wrote:
>>> And what would happen when `ede-check-for-vcs-dirs' returns t?  Would
>>> that load EDE then, or would we try to go on to provide the basic
>>> functionality (like getting the root) with a class-less version?
>>
>> I think this will be a bit of a challenge.  The project detection, and
>> then project hash are the key important pieces.  If the goal is to get
>> something that will be dumped w/ Emacs, and Fast, we'd need to start
>> by refactoring ede/files.el to split out the parts that track the
>> directory-to-project associations from all the misc EDE related file
>> finding routines.
>
> Frankly, I don't think this is the right approach. To cite from Jorgen's
> initial post which started this whole thread:
>
> "The usual way to define a project is via the "project root", a
> directory so that all files under that directory are considered part of
> "the project"."
>
> As he also stresses, this is *not* a complex problem to solve, quite the
> contrary.
>
> Therefore, I don't think it is necessary or even desirable to rewrite
> the whole EDE project autodetection into a class-less version, which
> then by all means tries to delay loading the "real" EDE as long as
> possible. It is not necessary that an 'emacs -Q' can detect all kinds of
> projects from Linux kernel trees to the Emacs source. If people need
> this, they should just put 'global-ede-mode' in their init file (which
> takes about 0.1 seconds on my machine) and use the full-fledged EDE.

To be plain, I agree.  What Jorgen described is not the EDE project 
loader.  Here's the deal though.  EDE's project loader was once what 
Jorgen described, without all the classes and stuff.  It just detected 
the project, found the root, and moved on.

Different projects need different features though, and things evolved. 
If a simple project system is put into Emacs core, it will satisfy the 
primary use case.  Then over time the case+1 will evolve it until it is 
just as messy as the EDE one.

Case:  simple.el is 6000+ lines of code.  Everything from set-variable 
(pretty simple) to compose-mail-other-frame (what ??).

If this project concept is created as a simple thing, that's fine, but 
EDE won't be able to use it, though it could contribute.   If that's the 
overall story where simple uses need the simple project, and EDE is used 
when you need more, that seems like a fine compromise, but it won't 
simplify the plethora of project projects.  Of course, that's a good 
thing too.

Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-23 17:10                                                   ` Eric M. Ludlam
@ 2013-03-23 17:26                                                     ` Jorgen Schaefer
  2013-03-23 18:02                                                       ` Dmitry Gutov
  0 siblings, 1 reply; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-23 17:26 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: emacs-devel, Stefan Monnier, Eric M. Ludlam

On Sat, 23 Mar 2013 13:10:20 -0400
"Eric M. Ludlam" <eric@siege-engine.com> wrote:

> If this project concept is created as a simple thing, that's fine,
> but EDE won't be able to use it, though it could contribute.   If
> that's the overall story where simple uses need the simple project,
> and EDE is used when you need more, that seems like a fine
> compromise, but it won't simplify the plethora of project projects.

Let's say we create two primary API functions

- (project-root)
- (project-set-root DIR)

so that PROJECT-ROOT returns the current project root if set, and if
not, sets it to something a simple hook returns. Then, if EDE's project
system simply calls (project-set-root DIR) when it loads, we end up
with a upwards-compatible system so that some extensions can just use
P-R to find the project root, and will continue to work when EDE is in
use. If they need more functionality than P-R, they can simply
transition over to using EDE.

Am I missing something?

	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-23 17:26                                                     ` Jorgen Schaefer
@ 2013-03-23 18:02                                                       ` Dmitry Gutov
  2013-03-23 20:51                                                         ` Pascal J. Bourguignon
  0 siblings, 1 reply; 62+ messages in thread
From: Dmitry Gutov @ 2013-03-23 18:02 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel, Stefan Monnier, Eric M. Ludlam

Jorgen Schaefer <forcer@forcix.cx> writes:

> On Sat, 23 Mar 2013 13:10:20 -0400
> "Eric M. Ludlam" <eric@siege-engine.com> wrote:
>
>> If this project concept is created as a simple thing, that's fine,
>> but EDE won't be able to use it, though it could contribute.   If
>> that's the overall story where simple uses need the simple project,
>> and EDE is used when you need more, that seems like a fine
>> compromise, but it won't simplify the plethora of project projects.
>
> Let's say we create two primary API functions
>
> - (project-root)
> - (project-set-root DIR)

I think it would work better if insted of the second function, we'll
have a variable `project-root-functions', along the lines of
`completion-at-point-functions'.

It will contain some simple function by default (that will look for
.dir-locals.el, for example), and EDE, when loaded, can push its own
function on top.



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-23 18:02                                                       ` Dmitry Gutov
@ 2013-03-23 20:51                                                         ` Pascal J. Bourguignon
  2013-03-24  4:25                                                           ` Dmitry Gutov
  0 siblings, 1 reply; 62+ messages in thread
From: Pascal J. Bourguignon @ 2013-03-23 20:51 UTC (permalink / raw)
  To: emacs-devel

Dmitry Gutov <dgutov@yandex.ru> writes:

> Jorgen Schaefer <forcer@forcix.cx> writes:
>
>> On Sat, 23 Mar 2013 13:10:20 -0400
>> "Eric M. Ludlam" <eric@siege-engine.com> wrote:
>>
>>> If this project concept is created as a simple thing, that's fine,
>>> but EDE won't be able to use it, though it could contribute.   If
>>> that's the overall story where simple uses need the simple project,
>>> and EDE is used when you need more, that seems like a fine
>>> compromise, but it won't simplify the plethora of project projects.
>>
>> Let's say we create two primary API functions
>>
>> - (project-root)
>> - (project-set-root DIR)
>
> I think it would work better if insted of the second function, we'll
> have a variable `project-root-functions', along the lines of
> `completion-at-point-functions'.

Not instead, but as hooks:

(defvar *current-project-dir* nil)
(defvar *resign-current-project-hook* '())
(defvar *become-current-project-hook* '())

(defun project-set-root (dir)
   (when *current-project-dir*
     (run-hook-with-args *resign-current-project-hook* *current-project-dir*))
   (do-default-project-set-root dir) 
   (assert (eq *current-project-dir* dir))
   (run-hook-with-args *become-current-project-hook* *current-project-dir*))


> It will contain some simple function by default (that will look for
> .dir-locals.el, for example), and EDE, when loaded, can push its own
> function on top.

Indeed, (do-default-project-set-root dir) could just set 
*current-project-dir*, and allt the rest could be done in
*become-current-project-hook*.

-- 
__Pascal Bourguignon__                     http://www.informatimago.com/
A bad day in () is better than a good day in {}.




^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-23 20:51                                                         ` Pascal J. Bourguignon
@ 2013-03-24  4:25                                                           ` Dmitry Gutov
  2013-03-24 10:13                                                             ` Jorgen Schaefer
  0 siblings, 1 reply; 62+ messages in thread
From: Dmitry Gutov @ 2013-03-24  4:25 UTC (permalink / raw)
  To: Pascal J. Bourguignon; +Cc: emacs-devel

"Pascal J. Bourguignon" <pjb@informatimago.com> writes:

> Dmitry Gutov <dgutov@yandex.ru> writes:
>
>> Jorgen Schaefer <forcer@forcix.cx> writes:
>>
>>> On Sat, 23 Mar 2013 13:10:20 -0400
>>> "Eric M. Ludlam" <eric@siege-engine.com> wrote:
>>>
>>>> If this project concept is created as a simple thing, that's fine,
>>>> but EDE won't be able to use it, though it could contribute.   If
>>>> that's the overall story where simple uses need the simple project,
>>>> and EDE is used when you need more, that seems like a fine
>>>> compromise, but it won't simplify the plethora of project projects.
>>>
>>> Let's say we create two primary API functions
>>>
>>> - (project-root)
>>> - (project-set-root DIR)
>>
>> I think it would work better if insted of the second function, we'll
>> have a variable `project-root-functions', along the lines of
>> `completion-at-point-functions'.
>
> Not instead, but as hooks:
>
> (defvar *current-project-dir* nil)
> (defvar *resign-current-project-hook* '())
> (defvar *become-current-project-hook* '())

The presence of hooks would be independent of what I'm suggesting.

The idea is that `project-root' calls all functions in
`project-root-functions', and as soon as one of them returns a
meaningful value, `project-root' (being the caller) uses it to set the
value of `current-project-dir', and then probably caches it.

The difference is like between "push" and "pull" designs.

With "push" design, it harder to understand which functions and under
which circumstances should call `project-set-root'.

> (defun project-set-root (dir)
>    (when *current-project-dir*
>      (run-hook-with-args *resign-current-project-hook* *current-project-dir*))
>    (do-default-project-set-root dir) 
>    (assert (eq *current-project-dir* dir))
>    (run-hook-with-args *become-current-project-hook* *current-project-dir*))
>
>
>> It will contain some simple function by default (that will look for
>> .dir-locals.el, for example), and EDE, when loaded, can push its own
>> function on top.
>
> Indeed, (do-default-project-set-root dir) could just set 
> *current-project-dir*, and allt the rest could be done in
> *become-current-project-hook*.

Imagine you're writing a third-party library that would like to know the
project root of the current buffer. What function should it call? Just
`project-root'? Who is going to call `do-default-project-set-root'?



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-24  4:25                                                           ` Dmitry Gutov
@ 2013-03-24 10:13                                                             ` Jorgen Schaefer
  2013-04-06 13:25                                                               ` Jorgen Schaefer
  2013-12-31 20:12                                                               ` Daniel Colascione
  0 siblings, 2 replies; 62+ messages in thread
From: Jorgen Schaefer @ 2013-03-24 10:13 UTC (permalink / raw)
  To: Dmitry Gutov
  Cc: Pascal J. Bourguignon, Eric M. Ludlam, Stefan Monnier,
	David Engster, emacs-devel

On Sun, 24 Mar 2013 08:25:38 +0400
Dmitry Gutov <dgutov@yandex.ru> wrote:

> The idea is that `project-root' calls all functions in
> `project-root-functions', and as soon as one of them returns a
> meaningful value, `project-root' (being the caller) uses it to set the
> value of `current-project-dir', and then probably caches it.

I did a quick implementation of my current ideas on the topic:

https://raw.github.com/jorgenschaefer/project-el/master/project.el

Quick run-down:

- If you only want to know the project root, you call (project-root)
  and never have to worry about anything else.
- This will call functions in `project-guess-root-functions' until one
  returns a non-nil value. This value is cached for future calls.
- The default functions use the current EDE project if any, or VC
  directory markers, or ask the user; can be extended as needed.
- When an extension provides a way to change the project root, they
  can call `project-set-root', which will run
  `project-root-changed-hook' so that other extensions (e.g. EDE) can
  intercept that and adjust themselves accordingly. Or even throw an
  error.

Other extensions should be able to build on that.

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-24 10:13                                                             ` Jorgen Schaefer
@ 2013-04-06 13:25                                                               ` Jorgen Schaefer
  2013-04-06 17:13                                                                 ` Eric M. Ludlam
  2013-12-31 20:12                                                               ` Daniel Colascione
  1 sibling, 1 reply; 62+ messages in thread
From: Jorgen Schaefer @ 2013-04-06 13:25 UTC (permalink / raw)
  To: emacs-devel

On Sun, 24 Mar 2013 11:13:10 +0100
Jorgen Schaefer <forcer@forcix.cx> wrote:

> I did a quick implementation of my current ideas on the topic:
> 
> https://raw.github.com/jorgenschaefer/project-el/master/project.el
> 
> Quick run-down:
> 
> - If you only want to know the project root, you call (project-root)
>   and never have to worry about anything else.
> - This will call functions in `project-guess-root-functions' until one
>   returns a non-nil value. This value is cached for future calls.
> - The default functions use the current EDE project if any, or VC
>   directory markers, or ask the user; can be extended as needed.
> - When an extension provides a way to change the project root, they
>   can call `project-set-root', which will run
>   `project-root-changed-hook' so that other extensions (e.g. EDE) can
>   intercept that and adjust themselves accordingly. Or even throw an
>   error.
> 
> Other extensions should be able to build on that.

As the discussion died down: What would be the next step here?

Regards,
	-- Jorgen



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-04-06 13:25                                                               ` Jorgen Schaefer
@ 2013-04-06 17:13                                                                 ` Eric M. Ludlam
  2013-04-08 19:03                                                                   ` David Engster
  0 siblings, 1 reply; 62+ messages in thread
From: Eric M. Ludlam @ 2013-04-06 17:13 UTC (permalink / raw)
  To: Jorgen Schaefer; +Cc: emacs-devel

On 04/06/2013 09:25 AM, Jorgen Schaefer wrote:
> On Sun, 24 Mar 2013 11:13:10 +0100
> Jorgen Schaefer<forcer@forcix.cx>  wrote:
>
>> I did a quick implementation of my current ideas on the topic:
>>
>> https://raw.github.com/jorgenschaefer/project-el/master/project.el
>>
>> Quick run-down:
>>
>> - If you only want to know the project root, you call (project-root)
>>    and never have to worry about anything else.
>> - This will call functions in `project-guess-root-functions' until one
>>    returns a non-nil value. This value is cached for future calls.
>> - The default functions use the current EDE project if any, or VC
>>    directory markers, or ask the user; can be extended as needed.
>> - When an extension provides a way to change the project root, they
>>    can call `project-set-root', which will run
>>    `project-root-changed-hook' so that other extensions (e.g. EDE) can
>>    intercept that and adjust themselves accordingly. Or even throw an
>>    error.
>>
>> Other extensions should be able to build on that.
>
> As the discussion died down: What would be the next step here?

I am probably too close to EDE to be very helpful in solving the wider 
problem, but I can offer a branch in the CEDET repository as a testing 
ground so that any changes needed in EDE can be easily made and tested 
in our test suites.

We can remove it from CEDET for maintenance elsewhere once the initial 
development is done.  We can keep new tests around in CEDET to make sure 
EDE stays compatible.


Eric



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-04-06 17:13                                                                 ` Eric M. Ludlam
@ 2013-04-08 19:03                                                                   ` David Engster
  0 siblings, 0 replies; 62+ messages in thread
From: David Engster @ 2013-04-08 19:03 UTC (permalink / raw)
  To: Eric M. Ludlam; +Cc: emacs-devel, Jorgen Schaefer

Eric M. Ludlam writes:
> On 04/06/2013 09:25 AM, Jorgen Schaefer wrote:
>> On Sun, 24 Mar 2013 11:13:10 +0100
>> Jorgen Schaefer<forcer@forcix.cx>  wrote:
>>
>
>>> I did a quick implementation of my current ideas on the topic:
>>>
>>> https://raw.github.com/jorgenschaefer/project-el/master/project.el
>>>
>>> Quick run-down:
>>>
>>> - If you only want to know the project root, you call (project-root)
>>>    and never have to worry about anything else.
>>> - This will call functions in `project-guess-root-functions' until one
>>>    returns a non-nil value. This value is cached for future calls.
>>> - The default functions use the current EDE project if any, or VC
>>>    directory markers, or ask the user; can be extended as needed.
>>> - When an extension provides a way to change the project root, they
>>>    can call `project-set-root', which will run
>>>    `project-root-changed-hook' so that other extensions (e.g. EDE) can
>>>    intercept that and adjust themselves accordingly. Or even throw an
>>>    error.
>>>
>>> Other extensions should be able to build on that.
>>
>> As the discussion died down: What would be the next step here?
>
> I am probably too close to EDE to be very helpful in solving the wider
> problem, but I can offer a branch in the CEDET repository as a testing
> ground so that any changes needed in EDE can be easily made and tested
> in our test suites.
>
> We can remove it from CEDET for maintenance elsewhere once the initial
> development is done.  We can keep new tests around in CEDET to make
> sure EDE stays compatible.

I don't think there are any changes necessary in EDE. All Jorgen's code
does is to determine the project's root directory for the current file,
and EDE is one possibility to provide this information, among others.

I don't have a problem with this approach, besides a small hunch that
soon people will add more features to 'project-root', and one day it may
look a bit like EDE. Unsurprisingly, I still think for general project
definitions EDE is the right choice.

-David



^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: A unified project root interface
  2013-03-24 10:13                                                             ` Jorgen Schaefer
  2013-04-06 13:25                                                               ` Jorgen Schaefer
@ 2013-12-31 20:12                                                               ` Daniel Colascione
  1 sibling, 0 replies; 62+ messages in thread
From: Daniel Colascione @ 2013-12-31 20:12 UTC (permalink / raw)
  To: Jorgen Schaefer, Dmitry Gutov
  Cc: Pascal J. Bourguignon, emacs-devel, Stefan Monnier, David Engster,
	Eric M. Ludlam

On 03/24/2013 03:13 AM, Jorgen Schaefer wrote:
> On Sun, 24 Mar 2013 08:25:38 +0400
> Dmitry Gutov <dgutov@yandex.ru> wrote:
>
>> The idea is that `project-root' calls all functions in
>> `project-root-functions', and as soon as one of them returns a
>> meaningful value, `project-root' (being the caller) uses it to set the
>> value of `current-project-dir', and then probably caches it.
>
> I did a quick implementation of my current ideas on the topic:
>
> https://raw.github.com/jorgenschaefer/project-el/master/project.el

After the feature freeze, can we please get something like this (or a 
refactored auto autoloaded EIEIO and EDE-light) into Emacs?



^ permalink raw reply	[flat|nested] 62+ messages in thread

end of thread, other threads:[~2013-12-31 20:12 UTC | newest]

Thread overview: 62+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-09 16:44 A unified project root interface Jorgen Schaefer
2013-03-09 17:12 ` Fabian Ezequiel Gallina
2013-03-10  5:38 ` Stefan Monnier
2013-03-10 10:06   ` Jorgen Schaefer
2013-03-11 18:57   ` Lluís
2013-03-12 23:28     ` Eric M. Ludlam
2013-03-12 23:42       ` Jorgen Schaefer
2013-03-13  2:02         ` Eric M. Ludlam
2013-03-13 18:03       ` David Engster
2013-03-13 19:11         ` Sudish Joseph
2013-03-16  0:47         ` Eric M. Ludlam
2013-03-16 14:18           ` David Engster
2013-03-16 15:02             ` Jorgen Schaefer
2013-03-16 22:27               ` Phil Hagelberg
2013-03-16 22:59               ` David Engster
2013-03-16 23:16                 ` Jorgen Schaefer
2013-03-17 17:40                   ` David Engster
2013-03-17 18:18                     ` Jorgen Schaefer
2013-03-18 22:50                       ` David Engster
2013-03-19  1:57                         ` John Yates
2013-03-19  7:18                           ` David Engster
2013-03-19 12:23                             ` Eric M. Ludlam
2013-03-19 13:06                             ` Stefan Monnier
2013-03-19 19:09                               ` David Engster
2013-03-20  3:21                                 ` Stefan Monnier
2013-03-20  4:48                                   ` Leo Liu
2013-03-20  7:04                                     ` joakim
2013-03-20  7:05                                     ` David Engster
2013-03-20  7:13                                   ` David Engster
2013-03-20 12:57                                     ` Stefan Monnier
2013-03-20 16:14                                       ` Davis Herring
2013-03-20 17:41                                         ` Stefan Monnier
2013-03-20 17:48                                         ` Stefan Monnier
2013-03-20 18:20                                         ` Bruce Korb
2013-03-20 22:14                                           ` Stefan Monnier
2013-03-20 16:34                                       ` David Engster
2013-03-20 17:47                                         ` Stefan Monnier
2013-03-21  0:55                                           ` Eric M. Ludlam
2013-03-21  3:27                                             ` Stefan Monnier
2013-03-21  4:07                                               ` Eric M. Ludlam
2013-03-21 14:33                                                 ` Stefan Monnier
2013-03-22  2:12                                                 ` Eric M. Ludlam
2013-03-23 11:04                                                   ` EIEIO split (was: A unified project root interface) David Engster
2013-03-21 16:32                                             ` A unified project root interface David Engster
2013-03-22  0:47                                               ` Eric M. Ludlam
2013-03-22 20:30                                                 ` David Engster
2013-03-23 17:10                                                   ` Eric M. Ludlam
2013-03-23 17:26                                                     ` Jorgen Schaefer
2013-03-23 18:02                                                       ` Dmitry Gutov
2013-03-23 20:51                                                         ` Pascal J. Bourguignon
2013-03-24  4:25                                                           ` Dmitry Gutov
2013-03-24 10:13                                                             ` Jorgen Schaefer
2013-04-06 13:25                                                               ` Jorgen Schaefer
2013-04-06 17:13                                                                 ` Eric M. Ludlam
2013-04-08 19:03                                                                   ` David Engster
2013-12-31 20:12                                                               ` Daniel Colascione
2013-03-20 17:49                                         ` Jorgen Schaefer
2013-03-19  7:33                         ` Jorgen Schaefer
2013-03-17  8:08                 ` joakim
2013-03-12 15:34   ` Sudish Joseph
2013-03-12 16:51     ` Dmitry Gutov
2013-03-12 18:23   ` Ted Zlatanov

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