emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/projectile 99b7ff27d1 2/4: Allow changing of project type


From: ELPA Syncer
Subject: [nongnu] elpa/projectile 99b7ff27d1 2/4: Allow changing of project type precendence
Date: Fri, 11 Feb 2022 04:58:34 -0500 (EST)

branch: elpa/projectile
commit 99b7ff27d1b9b328914bdfcb5caac6fb08c0e184
Author: lWarne <laurencewarne@gmail.com>
Commit: Bozhidar Batsov <bozhidar@batsov.dev>

    Allow changing of project type precendence
    
    Allow changing of project type precendence in
    projectile-update-project-type.
---
 projectile.el           | 30 ++++++++++++++++++---------
 test/projectile-test.el | 54 +++++++++++++++++++++++++++++++++----------------
 2 files changed, 57 insertions(+), 27 deletions(-)

diff --git a/projectile.el b/projectile.el
index a3399db58f..1e987c9b56 100644
--- a/projectile.el
+++ b/projectile.el
@@ -2729,7 +2729,8 @@ test/impl/other files as below:
 
 (cl-defun projectile-update-project-type
     (project-type
-     &key (marker-files nil marker-files-specified)
+     &key precedence
+     (marker-files nil marker-files-specified)
      (project-file nil project-file-specified)
      (compilation-dir nil compilation-dir-specified)
      (configure nil configure-specified)
@@ -2745,10 +2746,14 @@ test/impl/other files as below:
      (related-files-fn nil related-files-fn-specified))
     "Update an existing projectile project type.
 
-Non-nil passed items will override existing values for the project type given
-by PROJECT-TYPE.  Raise an error if PROJECT-TYPE is not already registered
-with projectile.  The arguments to this function are as for
-projectile-register-project-type:
+Passed items will override existing values for the project type given
+by PROJECT-TYPE.  nil can be used to remove a project type attribute.  Raise
+an error if PROJECT-TYPE is not already registered with projectile.  This
+function may also take the keyword argument PRECEDENCE which when set to ‘high’
+will make projectile prioritise this project type over other clashing project
+types, and a value of ‘low’ will make projectile prefer (all) other project
+types by default.  Otherwise, the arguments to this function are as for
+`projectile-register-project-type':
 
 A project type is defined by PROJECT-TYPE, a set of MARKER-FILES,
 and optional keyword arguments:
@@ -2800,11 +2805,16 @@ test/impl/other files as below:
       (cl-flet* ((project-filter (p) (eq project-type (car p)))
                  (project-map (p) (if (project-filter p) project-type-elt p)))
         (setq projectile-project-types
-              (mapcar (lambda (p) (if (eq project-type (car p))
-                                      project-type-elt
-                                    p))
-                      projectile-project-types))
-      (error "No existing project found for: %s" project-type)))
+              (if precedence
+                  (let ((filtered-types
+                       (cl-remove-if #'project-filter 
projectile-project-types)))
+                    (setq projectile-project-type-cache (make-hash-table))
+                    (cond ((eq precedence 'high)
+                           (cons project-type-elt filtered-types))
+                          ((eq precedence 'low)
+                           (append filtered-types (list project-type-elt)))
+                          (t (error "Precendence must be one of '(high 
low)"))))
+                (mapcar #'project-map projectile-project-types))))))
 
 (defun projectile-cabal-project-p ()
   "Check if a project contains *.cabal files but no stack.yaml file."
diff --git a/test/projectile-test.el b/test/projectile-test.el
index c3e544e86d..bd86763e55 100644
--- a/test/projectile-test.el
+++ b/test/projectile-test.el
@@ -185,23 +185,23 @@ Just delegates OPERATION and ARGS for all operations 
except for`shell-command`'.
 
 (describe "projectile-update-project-type"
   :var ((mock-projectile-project-types
-           '((foo marker-files "marker-file"
-                  project-file "project-file"
-                  compilation-dir "compilation-dir"
-                  configure-command "configure"
-                  compile-command "compile"
-                  test-command "test"
-                  install-command "install"
-                  package-command "package"
-                  run-command "run"))))
+         '((foo marker-files ("marker-file")
+                project-file "project-file"
+                compilation-dir "compilation-dir"
+                configure-command "configure"
+                compile-command "compile"
+                test-command "test"
+                install-command "install"
+                package-command "package"
+                run-command "run"))))
   (it "Updates existing project type in projectile-project-types"
     (let ((projectile-project-types mock-projectile-project-types))
       (projectile-update-project-type
        'foo
-       :marker-files "marker-file2"
+       :marker-files '("marker-file2")
        :test-suffix "suffix")
       (expect projectile-project-types :to-equal
-              '((foo marker-files "marker-file2"
+              '((foo marker-files ("marker-file2")
                      project-file "project-file"
                      compilation-dir "compilation-dir"
                      configure-command "configure"
@@ -215,10 +215,10 @@ Just delegates OPERATION and ARGS for all operations 
except for`shell-command`'.
     (let ((projectile-project-types mock-projectile-project-types))
       (projectile-update-project-type
        'foo
-       :marker-files "marker-file2"
+       :marker-files '("marker-file2")
        :test-suffix nil)
       (expect projectile-project-types :to-equal
-              '((foo marker-files "marker-file2"
+              '((foo marker-files ("marker-file2")
                      project-file "project-file"
                      compilation-dir "compilation-dir"
                      configure-command "configure"
@@ -233,7 +233,7 @@ Just delegates OPERATION and ARGS for all operations except 
for`shell-command`'.
           (dummy-val "foo"))
       (projectile-update-project-type
        'foo
-       :marker-files dummy-val
+       :marker-files (list dummy-val)
        :project-file dummy-val
        :compilation-dir dummy-val
        :configure dummy-val
@@ -248,7 +248,7 @@ Just delegates OPERATION and ARGS for all operations except 
for`shell-command`'.
        :test-dir dummy-val
        :related-files-fn dummy-val)
       (expect projectile-project-types :to-equal
-              `((foo marker-files ,dummy-val
+              `((foo marker-files (,dummy-val)
                      project-file ,dummy-val
                      compilation-dir ,dummy-val
                      configure-command ,dummy-val
@@ -266,9 +266,29 @@ Just delegates OPERATION and ARGS for all operations 
except for`shell-command`'.
     (let ((projectile-project-types mock-projectile-project-types))
       (expect (projectile-update-project-type
                'bar
-               :marker-files "marker-file"
+               :marker-files '("marker-file")
                :test-suffix "suffix")
-              :to-throw))))
+              :to-throw)))
+  (it "changes project type precendence"
+    (let ((projectile-project-types
+           '((foo marker-files ("foo"))
+             (bar marker-files ("foo")))))
+      (projectile-test-with-sandbox
+        (projectile-test-with-files
+            ("projectA/" "projectA/foo")
+          (spy-on 'projectile-project-root
+            :and-return-value
+            (file-truename (expand-file-name "projectA")))
+          (expect (projectile-project-type) :to-equal 'foo)
+          (projectile-update-project-type 'bar :precedence 'high)
+          (expect (projectile-project-type) :to-equal 'bar)
+          (projectile-update-project-type 'bar :precedence 'low)
+          (expect (projectile-project-type) :to-equal 'foo)))))
+  (it "errors if :precendence not valid"
+    (let ((projectile-project-types '((bar marker-files ("foo")))))
+      (expect
+       (projectile-update-project-type 'bar :precedence 'invalid-symbol)
+       :to-throw))))
 
 (describe "projectile-project-type"
   (it "detects the type of Projectile's project"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]