[Top][All Lists]

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

Re: defcustom :version

From: Bill Wohler
Subject: Re: defcustom :version
Date: Tue, 28 Mar 2006 17:45:53 -0800

Richard Stallman <address@hidden> wrote:

>     How would you like me to proceed for this release then? To just use
>     comments as Reiner suggested, or to use a :package-version keyword and
>     extend custom-handle-keyword to allow it?
> Please try implementing the extension, and see how simple and safe it is.


I think it's both simple and safe to add a :package-version keyword and
create a lookup table to map the package version to the Emacs version as
you asked.

The symbol lookup code took 62 ms before the changes, and 87 ms after
the changes (28%). As I added mappings between MH-E and Emacs versions,
the times slipped to 90 ms or an additional 3%. Given that the display
of the customization buffer takes an additional 103 seconds, I don't
think we have to worry too much here.

I welcome your comments on the names and implementation, as well as a
go-ahead to check in the changes. Once that is done, I'll update NEWS
and the manual appropriately.

Here is how MH-E would tap into the new functionality:

  (add-to-list 'customize-package-emacs-version-alist
               '(MH-E ("6.0" "22.1") ("6.1" "22.1") ("7.0" "22.1")
                      ("7.1" "22.1") ("7.2" "22.1") ("7.3" "22.1")
                      ("7.4" "22.1") ("8.0" "22.1")))


  (defgroup mh-e nil
    "Emacs interface to the MH mail system.
  MH is the Rand Mail Handler. Other implementations include nmh
  and GNU mailutils."
    :link '(custom-manual "(mh-e)Top")
    :group 'mail
    :package-version '(MH-E "8.0"))

Here's a ChangeLog entry to give you context and diffs to the

        * custom.el (defcustom, custom-handle-keyword): Add
        :package-version keyword.
        (custom-add-package-version): New function. Sets value of new
        property 'custom-package-version from :package-version keyword.

        * cus-edit.el (customize-package-emacs-version-alist): New
        (customize-changed-options): Add check for custom-package-version.
        (customize-package-emacs-version): New function to look up Emacs
        version corresponding to the given package version.

Index: custom.el
RCS file: /cvsroot/emacs/emacs/lisp/custom.el,v
retrieving revision 1.123
diff -u -r1.123 custom.el
--- custom.el   21 Mar 2006 16:44:09 -0000      1.123
+++ custom.el   29 Mar 2006 00:54:57 -0000
@@ -268,6 +268,12 @@
         VALUE should be a string specifying that the variable was
         first introduced, or its default value was changed, in Emacs
         version VERSION.
+        VALUE should be a list with the form (PACKAGE VERSION)
+        specifying that the variable was first introduced, or its
+        default value was changed, in PACKAGE version VERSION. This
+        keyword takes priority over :version. The PACKAGE and VERSION
+        must appear in `customize-package-emacs-version-alist'.
 :tag LABEL
         Use LABEL, a string, instead of the item's name, to label the item
         in customization menus and buffers.
@@ -489,6 +495,8 @@
         (custom-add-to-group value symbol type))
        ((eq keyword :version)
         (custom-add-version symbol value))
+       ((eq keyword :package-version)
+        (custom-add-package-version symbol value))
        ((eq keyword :link)
         (custom-add-link symbol value))
        ((eq keyword :load)
@@ -540,6 +548,10 @@
   "To the custom option SYMBOL add the version VERSION."
   (put symbol 'custom-version (purecopy version)))
+(defun custom-add-package-version (symbol version)
+  "To the custom option SYMBOL add the package version VERSION."
+  (put symbol 'custom-package-version (purecopy version)))
 (defun custom-add-load (symbol load)
   "To the custom option SYMBOL add the dependency LOAD.
 LOAD should be either a library file name, or a feature name."

Index: cus-edit.el
RCS file: /cvsroot/emacs/emacs/lisp/cus-edit.el,v
retrieving revision 1.289
diff -u -r1.289 cus-edit.el
--- cus-edit.el 21 Mar 2006 16:44:10 -0000      1.289
+++ cus-edit.el 29 Mar 2006 00:59:18 -0000
@@ -1079,6 +1079,13 @@
 (defvar customize-changed-options-previous-release "21.1"
   "Version for `customize-changed-options' to refer back to by default.")
+(defvar customize-package-emacs-version-alist nil
+  "Alist that maps packages to alists of package to Emacs versions.
+Packages are symbols. Versions are strings.
+For example:
+  '((MH-E (\"7.4\" \"22.1\") (\"8.0\" \"22.1\"))
+    (Gnus (\"5.11\" \"22.1\")))")
 (defalias 'customize-changed 'customize-changed-options)
@@ -1119,7 +1126,12 @@
   (let (found)
      (lambda (symbol)
-       (let ((version (get symbol 'custom-version)))
+        (let* ((package-version (get symbol 'custom-package-version))
+               (version
+                (or (and package-version
+                         (customize-package-emacs-version symbol
+                                                          package-version))
+                    (get symbol 'custom-version))))
         (if version
             (when (customize-version-lessp since-version version)
               (if (or (get symbol 'custom-group)
@@ -1135,6 +1147,31 @@
       (error "No user option defaults have been changed since Emacs %s"
+(defun customize-package-emacs-version (symbol package-version)
+  "Return Emacs version of SYMBOL.
+PACKAGE is looked up in the associated list
+`customize-package-emacs-version-alist' to find the version of
+Emacs that is associated with it."
+  (let (package-versions emacs-version)
+    ;; Use message instead of error since we want user to be able to
+    ;; see the rest of the symbols even if a package author has
+    ;; botched things up.
+    (cond ((not (listp package-version))
+           (message "package-version value incorrect for %s" symbol))
+          ((setq package-versions (assq (car package-version)
+                                        customize-package-emacs-version-alist))
+           (setq emacs-version
+                 (cadr (assoc (cadr package-version) package-versions)))
+           (unless emacs-version
+             (message "Package version of %s not found in %s" symbol
+                      "customize-package-emacs-version-alist")))
+          (t
+           (message "Package %s neglected to update %s"
+                    (car package-version)
+                    "customize-package-emacs-version-alist")))
+    emacs-version))
 (defun customize-version-lessp (version1 version2)
   ;; Why are the versions strings, and given that they are, why aren't
   ;; they converted to numbers and compared as such here?  -- fx

Bill Wohler <address@hidden>  http://www.newt.com/wohler/  GnuPG ID:610BD9AD
Maintainer of comp.mail.mh FAQ and MH-E. Vote Libertarian!
If you're passed on the right, you're in the wrong lane.

reply via email to

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