emacs-diffs
[Top][All Lists]
Advanced

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

scratch/pkg ec637f1d0b8 2/2: More package lock stuff


From: Gerd Moellmann
Subject: scratch/pkg ec637f1d0b8 2/2: More package lock stuff
Date: Mon, 4 Sep 2023 04:48:42 -0400 (EDT)

branch: scratch/pkg
commit ec637f1d0b82a6c5faccd99311730bea5dd1536b
Author: Gerd Moellmann <gerd.moellmann@gmail.com>
Commit: Gerd Moellmann <gerd.moellmann@gmail.com>

    More package lock stuff
    
    * lisp/emacs-lisp/pkg.el (pkg--internal-symbols,
      pkg--external-symbols): New functions.
    (without-package-locks, with-unlocked-packages): New macros.
    (rename-package): Check package locks.
    * src/pkg.c (pkg_check_package_lock): New.
    (pkg_intern_symbol1): Use it.
    (init_pkg_once, syms_of_pkg): New var enable-packge-locks.
---
 lisp/emacs-lisp/pkg.el | 28 +++++++++++++++++++++++++++-
 src/pkg.c              | 16 ++++++++++++++--
 2 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/lisp/emacs-lisp/pkg.el b/lisp/emacs-lisp/pkg.el
index 494cf0eb437..6962421f61e 100644
--- a/lisp/emacs-lisp/pkg.el
+++ b/lisp/emacs-lisp/pkg.el
@@ -45,6 +45,11 @@
 ;;                               Helpers
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(defun pkg--check-package-lock (package)
+  (when (and (package-locked-p package)
+             enable-package-locks)
+    (error "Package %s is locked" (package-name package))))
+
 (defun pkg--check-disjoint (&rest args)
   "Check whether all given arguments specify disjoint sets of symbols.
 Each argument is of the form (:key . set)."
@@ -179,7 +184,7 @@ BUFFER must be either a buffer object or the name of an 
existing buffer."
                      (if (bufferp buffer)
                          buffer
                        (get-buffer buffer))))
-
+
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;                                  Macros
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -255,6 +260,26 @@ normally, or else if an explcit return occurs the value it 
transfers."
          ,var
         ,result-form))))
 
+(defun pkg--internal-symbols (package)
+  (let (syms)
+    (do-symbols (sym (pkg--package-or-lose package))
+      (when (eq (symbol-package sym) *emacs-user-package*)
+        (push sym syms)))
+    syms))
+
+(defun pkg--external-symbols (package)
+  (let (syms)
+    (do-external-symbols (sym (pkg--package-or-lose package))
+      (when (eq (symbol-package sym) *emacs-user-package*)
+        (push sym syms)))
+    syms))
+
+(cl-defmacro without-package-locks (&body body)
+  `(let ((enable-package-locks nil))
+     (progn ,@body)))
+
+(cl-defmacro with-unlocked-packages ((&rest _packages) &body body)
+  )
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;                        Basic stuff
@@ -452,6 +477,7 @@ Value is the renamed package object."
         (new-name (pkg--stringify-name new-name "package name"))
         (new-nicknames (pkg--stringify-names new-nicknames
                                              "package nickname")))
+    (pkg--check-package-lock package)
     (unless (package-%name package)
       (error "Package is deleted"))
     (pkg--remove-from-registry package)
diff --git a/src/pkg.c b/src/pkg.c
index d39f71c7e1a..110f7b08856 100644
--- a/src/pkg.c
+++ b/src/pkg.c
@@ -286,6 +286,14 @@ pkg_remove_symbol (Lisp_Object symbol, Lisp_Object package)
   Fremhash (symbol, PACKAGE_SYMBOLS (package));
 }
 
+static void
+pkg_check_package_lock (Lisp_Object package)
+{
+  if (!NILP (Venable_package_locks))
+    if (!NILP (XPACKAGE (package)->lock))
+      error ("Package %s is locked", SDATA (XPACKAGE (package)->name));
+}
+
 /* Intern a symbol with name NAME to PACKAGE.  If a symbol with name
    NAME is already accessible in PACKAGE, return that symbol.
 
@@ -315,8 +323,7 @@ pkg_intern_symbol1 (const Lisp_Object name, Lisp_Object 
package,
     symbol = existing_symbol;
   else
     {
-      if (!NILP (XPACKAGE (package)->lock))
-       error ("Package %s is locked", SDATA (XPACKAGE (package)->name));
+      pkg_check_package_lock (package);
       symbol = Fmake_symbol (name);
     }
 
@@ -988,6 +995,9 @@ init_pkg_once (void)
   staticpro (&Vsymbol_packages);
   Vsymbol_packages = Qnil;
 
+  staticpro (&Venable_package_locks);
+  Venable_package_locks = Qt;
+
   pkg_define_builtin_symbols ();
 }
 
@@ -1033,6 +1043,8 @@ syms_of_pkg (void)
   DEFVAR_LISP_NOPRO ("symbol-packages", Vsymbol_packages,
                     doc: /* */);
   Fmake_variable_buffer_local (Qsymbol_packages);
+  DEFVAR_LISP_NOPRO ("enable-package-locks", Venable_package_locks,
+                    doc: /* */);
 
   Fprovide (Qsymbol_packages, Qnil);
 }



reply via email to

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