emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] /srv/bzr/emacs/trunk r106971: Fix package.el dependency ha


From: Chong Yidong
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r106971: Fix package.el dependency handling so that `require' calls work.
Date: Sat, 28 Jan 2012 16:14:24 +0800
User-agent: Bazaar (2.3.1)

------------------------------------------------------------
revno: 106971
fixes bug(s): http://debbugs.gnu.org/10593
committer: Chong Yidong <address@hidden>
branch nick: trunk
timestamp: Sat 2012-01-28 16:14:24 +0800
message:
  Fix package.el dependency handling so that `require' calls work.
  
  * lisp/emacs-lisp/package.el (package-maybe-load-descriptor): New
  function, split from package-maybe-load-descriptor.
  (package-maybe-load-descriptor): Use it.
  (package-download-transaction): Fully load required packages
  inside the loop, so that `require' calls work.
  (package-install): No need to call package-initialize now.
modified:
  lisp/ChangeLog
  lisp/emacs-lisp/package.el
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2012-01-28 05:02:02 +0000
+++ b/lisp/ChangeLog    2012-01-28 08:14:24 +0000
@@ -1,5 +1,14 @@
 2012-01-28  Chong Yidong  <address@hidden>
 
+       * emacs-lisp/package.el (package-maybe-load-descriptor): New
+       function, split from package-maybe-load-descriptor.
+       (package-maybe-load-descriptor): Use it.
+       (package-download-transaction): Fully load required packages
+       inside the loop, so that `require' calls work (Bug#10593).
+       (package-install): No need to call package-initialize now.
+
+2012-01-28  Chong Yidong  <address@hidden>
+
        * tooltip.el (tooltip-mode): Doc fix.
        (tooltip-use-echo-area): Mark as obsolete (Bug#6595).
 

=== modified file 'lisp/emacs-lisp/package.el'
--- a/lisp/emacs-lisp/package.el        2012-01-05 09:46:05 +0000
+++ b/lisp/emacs-lisp/package.el        2012-01-28 08:14:24 +0000
@@ -382,30 +382,37 @@
 In each valid package subdirectory, this function loads the
 description file containing a call to `define-package', which
 updates `package-alist' and `package-obsolete-alist'."
-  (let ((all (memq 'all package-load-list))
-       (regexp (concat "\\`" package-subdirectory-regexp "\\'"))
-       name version force)
+  (let ((regexp (concat "\\`" package-subdirectory-regexp "\\'")))
     (dolist (dir (cons package-user-dir package-directory-list))
       (when (file-directory-p dir)
        (dolist (subdir (directory-files dir))
-         (when (and (file-directory-p (expand-file-name subdir dir))
-                    (string-match regexp subdir))
-           (setq name    (intern (match-string 1 subdir))
-                 version (match-string 2 subdir)
-                 force   (assq name package-load-list))
-           (when (cond
-                  ((null force)
-                   all) ; not in package-load-list
-                  ((null (setq force (cadr force)))
-                   nil) ; disabled
-                  ((eq force t)
-                   t)
-                  ((stringp force) ; held
-                   (version-list-= (version-to-list version)
-                                   (version-to-list force)))
-                  (t
-                   (error "Invalid element in `package-load-list'")))
-             (package-load-descriptor dir subdir))))))))
+         (when (string-match regexp subdir)
+           (package-maybe-load-descriptor (match-string 1 subdir)
+                                          (match-string 2 subdir)
+                                          dir)))))))
+
+(defun package-maybe-load-descriptor (name version dir)
+  "Maybe load a specific package from directory DIR.
+NAME and VERSION are the package's name and version strings.
+This function checks `package-load-list', before actually loading
+the package by calling `package-load-descriptor'."
+  (let ((force (assq (intern name) package-load-list))
+       (subdir (concat name "-" version)))
+    (and (file-directory-p (expand-file-name subdir dir))
+        ;; Check `package-load-list':
+        (cond ((null force)
+               (memq 'all package-load-list))
+              ((null (setq force (cadr force)))
+               nil) ; disabled
+              ((eq force t)
+               t)
+              ((stringp force) ; held
+               (version-list-= (version-to-list version)
+                               (version-to-list force)))
+              (t
+               (error "Invalid element in `package-load-list'")))
+        ;; Actually load the descriptor:
+        (package-load-descriptor dir subdir))))
 
 (defsubst package-desc-vers (desc)
   "Extract version from a package description vector."
@@ -861,7 +868,13 @@
                                 (package-desc-doc desc)
                                 (package-desc-reqs desc)))
        (t
-       (error "Unknown package kind: %s" (symbol-name kind)))))))
+       (error "Unknown package kind: %s" (symbol-name kind))))
+      ;; If package A depends on package B, then A may `require' B
+      ;; during byte compilation.  So we need to activate B before
+      ;; unpacking A.
+      (package-maybe-load-descriptor (symbol-name elt) v-string
+                                    package-user-dir)
+      (package-activate elt (version-to-list v-string)))))
 
 (defvar package--initialized nil)
 
@@ -889,9 +902,7 @@
             (symbol-name name)))
     (package-download-transaction
      (package-compute-transaction (list name)
-                                 (package-desc-reqs (cdr pkg-desc)))))
-  ;; Try to activate it.
-  (package-initialize))
+                                 (package-desc-reqs (cdr pkg-desc))))))
 
 (defun package-strip-rcs-id (str)
   "Strip RCS version ID from the version string STR.


reply via email to

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