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

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

[nongnu] elpa/opam-switch-mode 55d1add5f7 4/4: Merge pull request #14 fr


From: ELPA Syncer
Subject: [nongnu] elpa/opam-switch-mode 55d1add5f7 4/4: Merge pull request #14 from ProofGeneral/improve
Date: Mon, 10 Jul 2023 10:01:58 -0400 (EDT)

branch: elpa/opam-switch-mode
commit 55d1add5f7ca0fb61c9a659fe78e70187c17e40d
Merge: 5d7efc2acc 92e9974663
Author: Erik Martin-Dorel <erik@martin-dorel.org>
Commit: GitHub <noreply@github.com>

    Merge pull request #14 from ProofGeneral/improve
    
    Improve opam-switch-mode and fix bugs #12, #13
---
 NEWS.md             |  5 +++++
 opam-switch-mode.el | 52 ++++++++++++++++++++++++++++++++++++----------------
 2 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/NEWS.md b/NEWS.md
index 6fc856860a..c2d2ccf28d 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -14,9 +14,14 @@ The format is based on [Keep a 
Changelog](https://keepachangelog.com/en/1.0.0/).
 ### Fixed
 
 - **README.md**: Markdown badges
+- (opam-switch--reset-env) unexpectedly cleared exec-path, closes 
[#13](https://github.com/ProofGeneral/opam-switch-mode/issues/13)
+- (opam-switch--get-current-switch) returned "_opam" for local switches
+- (opam-switch--set-env) raised "No opam-root directory in PATH" for local 
switches, closes 
[#12](https://github.com/ProofGeneral/opam-switch-mode/issues/12)
 
 ### Changed
 
+- Replace menu-bar's name (s/Opam-switch/OPSW/) so it matches mode-bar's name
+
 ### Removed
 
 ## [1.1] - 2023-06-20
diff --git a/opam-switch-mode.el b/opam-switch-mode.el
index 05b3a4d193..bd4cf3d1ce 100644
--- a/opam-switch-mode.el
+++ b/opam-switch-mode.el
@@ -208,28 +208,32 @@ The variable `exec-path' is saved in addition to 
environment variables."
        (mapcar (lambda (x) (list (car x) (getenv (car x)))) opam-env))
   (setq opam-switch--saved-exec-path exec-path))
 
-(defun opam-switch--set-env (opam-env)
+(defun opam-switch--set-env (opam-env previous-prefix)
   "Set a new opam environment.
 Environment variables in OPAM-ENV are put into the environment of
 the current Emacs session.  The variable `exec-path' is changed to
 match the environment PATH.
 
-It is unclear which value in variable `exec-path' corresponds to a
-previously set opam switch and also which entry in the PATH
+It's not that clear which value in variable `exec-path' corresponds to
+a previously set opam switch and also which entry in the PATH
 environment variable in OPAM-ENV corresponds to the new switch.
-Therefore this function uses the following heuristic.  First all
-entries in variable `exec-path' that match `(opam-switch--root)' are deleted.
-Then, the first entry for PATH that maches `(opam-switch--root)' is added at 
the
-front of variable `exec-path'."
+Therefore this function uses the following heuristic.
+First, all entries in variable `exec-path' that match
+PREVIOUS-PREFIX or `(opam-switch--root)' are deleted.
+Then, the first entry for PATH that matches the new switch prefix
+is added at the front of variable `exec-path'."
   (let ((new-bin-dir
          (seq-find
-          (lambda (dir) (string-prefix-p (opam-switch--root) dir))
+          (lambda (dir) (string-prefix-p 
(opam-switch--get-current-switch-prefix-from opam-env) dir))
           (parse-colon-path (cadr (assoc "PATH" opam-env))))))
     (unless new-bin-dir
-      (error "No opam-root directory in PATH"))
+      (error "No OPAM_SWITCH_PREFIX directory in PATH"))
     (mapc (lambda (x) (setenv (car x) (cadr x))) opam-env)
     (setq exec-path
-          (seq-remove (lambda (dir) (string-prefix-p (opam-switch--root) dir)) 
exec-path))
+          (seq-remove
+           (lambda (dir) (or (string-prefix-p (opam-switch--root) dir)
+                             (and previous-prefix (string-prefix-p 
previous-prefix dir))))
+           exec-path))
     (push new-bin-dir exec-path)))
 
 (defun opam-switch--reset-env ()
@@ -238,15 +242,30 @@ Reset variable `exec-path' and all environment variables 
to the values
 they had in this Emacs session before the first chosen opam
 switch overwrote them."
   (mapc (lambda (x) (setenv (car x) (cadr x))) opam-switch--saved-env)
-  (setq exec-path opam-switch--saved-exec-path)
+  (when opam-switch--saved-exec-path
+    ;; it's nil if one enables `opam-switch-mode'
+    ;; but does not call `opam-switch-set-switch'
+    ;; cf. https://github.com/ProofGeneral/opam-switch-mode/issues/13
+    (setq exec-path opam-switch--saved-exec-path))
   (setq opam-switch--saved-env nil)
   (setq opam-switch--saved-exec-path nil))
 
+(defun opam-switch--get-current-switch-prefix ()
+  "Return prefix of current switch or nil."
+  (getenv "OPAM_SWITCH_PREFIX"))
+
+(defun opam-switch--get-current-switch-prefix-from (opam-env)
+  "Return prefix of next switch from `opam-env'."
+  (cadr (assoc "OPAM_SWITCH_PREFIX" opam-env)))
+
 (defun opam-switch--get-current-switch ()
   "Return name of current switch or \"<none>\"."
-  (let ((current-switch (getenv "OPAM_SWITCH_PREFIX")))
+  (let ((current-switch (opam-switch--get-current-switch-prefix)))
     (if current-switch
-         (file-name-nondirectory current-switch)
+        (if (string-prefix-p (opam-switch--root) current-switch)
+            (file-name-nondirectory current-switch)
+          ;; else current-switch is local
+          (directory-file-name (file-name-directory current-switch)))
       "<none>")))
 
 ;;;###autoload
@@ -287,15 +306,16 @@ not any other shells outside Emacs."
   (if (equal switch-name "")
       (opam-switch--reset-env)
     (let ((output-string (opam-switch--command-as-string "env" switch-name t))
+          (prefix (opam-switch--get-current-switch-prefix))
           opam-env)
       (unless output-string
         (error
-         "Command 'opam env %s' failed - probably because of invalid opam 
switch \"%s\""
+         "Command 'opam env --switch=%s' failed - probably because of invalid 
opam switch \"%s\""
          switch-name switch-name))
       (setq opam-env (car (read-from-string output-string)))
       (unless opam-switch--saved-env
         (opam-switch--save-current-env opam-env))
-      (opam-switch--set-env opam-env)))
+      (opam-switch--set-env opam-env prefix)))
   (run-hooks 'opam-switch-change-opam-switch-hook))
 
 (define-obsolete-function-alias 'opam-switch--set-switch
@@ -341,7 +361,7 @@ is automatically created by `define-minor-mode'."
     opam-switch-mode-map
     "opam mode menu"
     ;; FIXME: Use `:filter'?
-    (cons "Opam-switch"
+    (cons "OPSW"
           (opam-switch--menu-items))))
 
 ;;;###autoload



reply via email to

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