]> git.eshelyaron.com Git - emacs.git/commitdiff
More package lock stuff
authorGerd Moellmann <gerd.moellmann@gmail.com>
Mon, 4 Sep 2023 08:46:56 +0000 (10:46 +0200)
committerGerd Moellmann <gerd.moellmann@gmail.com>
Mon, 4 Sep 2023 08:46:56 +0000 (10:46 +0200)
* 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
src/pkg.c

index 494cf0eb437b1b8e90716abd011d01b424c8d644..6962421f61e8b8d4d63a4a6a71d0ed03e6c34660 100644 (file)
 ;;                               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))))
-\f
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;                                  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)
+  )
 \f
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;                        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)
index d39f71c7e1ad1365bc6e495978285b668645ebc8..110f7b08856ace8e1d2951bbc7864e7602603bff 100644 (file)
--- 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);
 }