emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] /srv/bzr/emacs/trunk r100621: Add preliminary describe-pac


From: Chong Yidong
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r100621: Add preliminary describe-package functionality, and some cleanup.
Date: Sat, 19 Jun 2010 18:36:51 -0400
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 100621
committer: Chong Yidong <address@hidden>
branch nick: trunk
timestamp: Sat 2010-06-19 18:36:51 -0400
message:
  Add preliminary describe-package functionality, and some cleanup.
  
  * help-mode.el (help-package-def): New button type.
  
  * menu-bar.el: Move package-list-packages binding here from
  package.el.
  
  * emacs-lisp/package.el: Move package-list-packages binding to
  menu-bar.el.
  (describe-package, describe-package-1, package--dir): New funs.
  (package-activate-1): Use package--dir.
  
  * emacs-lisp/package-x.el (gnus-article-buffer): Require package.
modified:
  lisp/ChangeLog
  lisp/emacs-lisp/package-x.el
  lisp/emacs-lisp/package.el
  lisp/help-mode.el
  lisp/menu-bar.el
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2010-06-19 02:39:04 +0000
+++ b/lisp/ChangeLog    2010-06-19 22:36:51 +0000
@@ -1,3 +1,17 @@
+2010-06-19  Chong Yidong  <address@hidden>
+
+       * emacs-lisp/package.el: Move package-list-packages binding to
+       menu-bar.el.
+       (describe-package, describe-package-1, package--dir): New funs.
+       (package-activate-1): Use package--dir.
+
+       * emacs-lisp/package-x.el (gnus-article-buffer): Require package.
+
+       * help-mode.el (help-package-def): New button type.
+
+       * menu-bar.el: Move package-list-packages binding here from
+       package.el.
+
 2010-06-19  Gustav HÃ¥llberg  <address@hidden>  (tiny change)
 
        * descr-text.el (describe-char): Avoid trailing whitespace.  (Bug#6423)

=== modified file 'lisp/emacs-lisp/package-x.el'
--- a/lisp/emacs-lisp/package-x.el      2010-06-17 02:08:10 +0000
+++ b/lisp/emacs-lisp/package-x.el      2010-06-19 22:36:51 +0000
@@ -31,6 +31,9 @@
 
 ;;; Code:
 
+(require 'package)
+(defvar gnus-article-buffer)
+
 ;; Note that this only works if you have the password, which you
 ;; probably don't :-).
 (defvar package-archive-upload-base nil

=== modified file 'lisp/emacs-lisp/package.el'
--- a/lisp/emacs-lisp/package.el        2010-06-17 16:41:13 +0000
+++ b/lisp/emacs-lisp/package.el        2010-06-19 22:36:51 +0000
@@ -211,7 +211,6 @@
   :version "24.1")
 
 (defvar Info-directory-list)
-(defvar gnus-article-buffer)
 (declare-function info-initialize "info" ())
 (declare-function url-http-parse-response "url-http" ())
 (declare-function lm-header "lisp-mnt" (header))
@@ -423,33 +422,35 @@
   "Extract the kind of download from an archive package description vector."
   (aref desc 3))
 
-(defun package-activate-1 (package pkg-vec)
-  (let* ((pkg-name (symbol-name package))
-        (pkg-ver-str (package-version-join (package-desc-vers pkg-vec)))
+(defun package--dir (name version-string)
+  (let* ((subdir (concat name "-" version-string))
         (dir-list (cons package-user-dir package-directory-list))
-        (pkg-dir))
+        pkg-dir)
     (while dir-list
-      (let ((subdir (expand-file-name (concat pkg-name "-" pkg-ver-str)
-                                     (car dir-list))))
-       (if (file-directory-p subdir)
-           (progn
-             (setq pkg-dir subdir)
-             (setq dir-list nil))
+      (let ((subdir-full (expand-file-name subdir (car dir-list))))
+       (if (file-directory-p subdir-full)
+           (setq pkg-dir  subdir-full
+                 dir-list nil)
          (setq dir-list (cdr dir-list)))))
+    pkg-dir))
+
+(defun package-activate-1 (package pkg-vec)
+  (let* ((name (symbol-name package))
+        (version-str (package-version-join (package-desc-vers pkg-vec)))
+        (pkg-dir (package--dir name version-str)))
     (unless pkg-dir
       (error "Internal error: could not find directory for %s-%s"
-            pkg-name pkg-ver-str))
+            name version-str))
+    ;; Add info node.
     (if (file-exists-p (expand-file-name "dir" pkg-dir))
        (progn
          ;; FIXME: not the friendliest, but simple.
          (require 'info)
          (info-initialize)
          (setq Info-directory-list (cons pkg-dir Info-directory-list))))
+    ;; Add to load path, add autoloads, and activate the package.
     (setq load-path (cons pkg-dir load-path))
-    ;; Load the autoloads and activate the package.
-    (load (expand-file-name (concat (symbol-name package) "-autoloads")
-                           pkg-dir)
-         nil t)
+    (load (expand-file-name (concat name "-autoloads") pkg-dir) nil t)
     (setq package-activated-list (cons package package-activated-list))
     ;; Don't return nil.
     t))
@@ -474,8 +475,7 @@
     (let* ((pkg-desc (assq package package-alist))
           (this-version (package-desc-vers (cdr pkg-desc)))
           (req-list (package-desc-reqs (cdr pkg-desc)))
-          ;; If the package was never activated, we want to do it
-          ;; now.
+          ;; If the package was never activated, do it now.
           (keep-going (or (not (memq package package-activated-list))
                           (package-version-compare this-version version '>))))
       (while (and req-list keep-going)
@@ -1037,7 +1037,70 @@
        package-alist))
 
 
-
+;;;; Package description buffer.
+
+;;;###autoload
+(defun describe-package (package)
+  "Display the full documentation of PACKAGE (a symbol)."
+  (interactive
+   (let* ((packages (append (mapcar 'car package-alist)
+                           (mapcar 'car package-archive-contents)))
+         (guess (function-called-at-point))
+         val)
+     (unless (memq guess packages)
+       (setq guess nil))
+     (setq packages (mapcar 'symbol-name packages))
+     (setq val
+          (completing-read (if guess
+                               (format "Describe package (default %s): "
+                                       guess)
+                             "Describe package: ")
+                           packages nil t nil nil guess))
+     (list (if (equal val "")
+              guess
+            (intern val)))))
+  (if (or (null package) (null (symbolp package)))
+      (message "You did not specify a package")
+    (help-setup-xref (list #'describe-package package)
+                    (called-interactively-p 'interactive))
+    (with-help-window (help-buffer)
+      (with-current-buffer standard-output
+       (describe-package-1 package)))))
+
+(defun describe-package-1 (package)
+  (let ((desc (cdr (assq package package-alist)))
+       version)
+    (prin1 package)
+    (princ " is ")
+    (cond
+     (desc
+      ;; This package is loaded (i.e. in `package-alist').
+      (let (pkg-dir)
+       (setq version (package-version-join (package-desc-vers desc)))
+       (if (assq package package--builtins)
+           (princ "a built-in package.\n\n")
+         (setq pkg-dir (package--dir (symbol-name package) version))
+         (if pkg-dir
+             (progn
+               (insert "a package installed in `")
+               (help-insert-xref-button (file-name-as-directory pkg-dir)
+                                        'help-package-def pkg-dir)
+               (insert "'.\n\n"))
+           ;; This normally does not happen.
+           (insert "a deleted package.\n\n")
+           (setq version nil)))))
+     (t
+      ;; An uninstalled package.
+      (setq desc (cdr (assq package package-archive-contents)))
+      (setq version (package-version-join (package-desc-vers desc)))
+      (insert "a package that is not installed.\n\n")))
+    (if version
+       (insert "      Version: " version "\n"))
+    (insert "  Description: " (package-desc-doc desc) "\n")))
+;; To do: add buttons for installing, uninstalling, etc.
+
+
+
 ;;;; Package menu mode.
 
 (defvar package-menu-mode-map
@@ -1443,11 +1506,6 @@
   (interactive)
   (package--list-packages))
 
-;; Make it appear on the menu.
-(define-key-after menu-bar-options-menu [package]
-  '(menu-item "Manage Packages" package-list-packages
-             :help "Install or uninstall additional Emacs packages"))
-
 (provide 'package)
 
 ;;; package.el ends here

=== modified file 'lisp/help-mode.el'
--- a/lisp/help-mode.el 2010-06-17 20:56:17 +0000
+++ b/lisp/help-mode.el 2010-06-19 22:36:51 +0000
@@ -244,6 +244,11 @@
                       (message "Unable to find location in file"))))
   'help-echo (purecopy "mouse-2, RET: find face's definition"))
 
+(define-button-type 'help-package-def
+  :supertype 'help-xref
+  'help-function (lambda (file) (dired file))
+  'help-echo (purecopy "mouse-2, RET: visit package directory"))
+
 
 ;;;###autoload
 (defun help-mode ()

=== modified file 'lisp/menu-bar.el'
--- a/lisp/menu-bar.el  2010-06-17 10:45:25 +0000
+++ b/lisp/menu-bar.el  2010-06-19 22:36:51 +0000
@@ -703,6 +703,10 @@
     (when need-save
       (custom-save-all))))
 
+(define-key menu-bar-options-menu [package]
+  '(menu-item "Manage Emacs Packages" package-list-packages
+             :help "Install or uninstall additional Emacs packages"))
+
 (define-key menu-bar-options-menu [save]
   `(menu-item ,(purecopy "Save Options") menu-bar-options-save
              :help ,(purecopy "Save options set from the menu above")))


reply via email to

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