Fixed.
[riece] / lisp / riece-addon.el
index 7181353..eee7d64 100644 (file)
@@ -28,6 +28,7 @@
 (require 'riece-options)
 (require 'riece-compat)
 (require 'riece-misc)
+(require 'riece-addon-modules)
 
 (defgroup riece-addon-list nil
   "Add-on listing."
       (setq pointer (cdr pointer)))
     (delq nil addons))
   ;; Build & resolve dependencies.
-  (riece-resolve-addon-dependencies
+  (riece-sort-addon-dependencies
    (riece-load-and-build-addon-dependencies addons)))
 
 (defun riece-insinuate-addon (addon &optional verbose)
   (if (get addon 'riece-addon-insinuated)
       (if verbose
-         (message "Add-on %S is alread insinuated" addon))
+         (message "Add-on %S is already insinuated" addon))
     (funcall (intern (concat (symbol-name addon) "-insinuate")))
     (put addon 'riece-addon-insinuated t)
     (if verbose
        (message "Add-on %S is insinuated" addon))))
 
+(defun riece-uninstall-addon (addon &optional verbose)
+  (if (not (get addon 'riece-addon-insinuated))
+      (if verbose
+         (message "Add-on %S is not insinuated" addon))
+    (let ((entry (assq addon riece-addon-dependencies))
+         (enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
+      (if entry
+         (if (cdr entry)
+             (if (= (length (cdr entry)) 1)
+                 (error "%S depends %S" (car (cdr entry)) addon)
+               (error "%s depends %S" (mapconcat #'identity (cdr entry) ",")
+                      addon))
+           (if (and enabled
+                    (symbol-value enabled))
+               (riece-disable-addon addon verbose))
+           (funcall (or (intern-soft (concat (symbol-name addon)
+                                             "-uninstall"))
+                        #'ignore))
+           (setq riece-addon-dependencies
+                 (delq entry riece-addon-dependencies))
+           (put addon 'riece-addon-insinuated nil)))
+      (if verbose
+         (message "Add-on %S is uninstalled" addon)))))
+
 (defun riece-enable-addon (addon &optional verbose)
   (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
     (if (null enabled)
@@ -255,32 +280,45 @@ All normal editing commands are turned off."
   (riece-addon-list-mode)
   (let ((inhibit-read-only t)
        buffer-read-only
-       (pointer (sort (copy-sequence riece-addons)
-                      (lambda (symbol1 symbol2)
-                                 (string-lessp (symbol-name symbol1)
-                                               (symbol-name symbol2)))))
-       enabled description point)
+       (pointer riece-addon-dependencies)
+       module-description-alist
+       description enabled point)
+    (while pointer
+      
+      (setq description (intern-soft (concat (symbol-name (car (car pointer)))
+                                            "-description"))
+           module-description-alist
+           (cons (cons (car (car pointer))
+                       (if description
+                           (symbol-value description)
+                         "(no description)"))
+                 module-description-alist)
+           pointer (cdr pointer)))
+    (setq pointer riece-addon-modules)
+    (while pointer
+      (unless (assq (car (car pointer))
+                   module-description-alist)
+       (setq module-description-alist
+             (cons (car pointer) module-description-alist)))
+      (setq pointer (cdr pointer)))
     (erase-buffer)
     (riece-kill-all-overlays)
+    (setq pointer module-description-alist)
     (while pointer
-      (setq enabled (intern-soft (concat (symbol-name (car pointer))
-                                        "-enabled"))
-           description (intern-soft (concat (symbol-name (car pointer))
-                                            "-description")))
+      (setq enabled (intern-soft (concat (symbol-name (car (car pointer)))
+                                        "-enabled")))
       (setq point (point))
       (insert (format "%c %S: %s\n"
-                     (if (not (featurep (car pointer)))
+                     (if (not (featurep (car (car pointer))))
                          ??
                        (if (null enabled)
                            ?!
                          (if (symbol-value enabled)
                              ?+
                            ?-)))
-                     (car pointer)
-                     (if description
-                         (symbol-value description)
-                       "(no description)")))
-      (put-text-property point (point) 'riece-addon (car pointer))
+                     (car (car pointer))
+                     (cdr (car pointer))))
+      (put-text-property point (point) 'riece-addon (car (car pointer)))
       (setq pointer (cdr pointer)))
     (insert "
 Symbols in the leftmost column:
@@ -307,9 +345,9 @@ Useful keys:
            (get-text-property (point) 'riece-addon))
        (intern-soft
         (completing-read "Add-on: "
-                         (mapcar (lambda (addon)
-                                   (list (symbol-name addon)))
-                                 riece-addons)
+                         (mapcar (lambda (dependency)
+                                   (list (symbol-name (car dependency))))
+                                 riece-addon-dependencies)
                          (lambda (pointer)
                            (let ((enabled
                                   (intern-soft (concat (car pointer)
@@ -334,9 +372,9 @@ Useful keys:
            (get-text-property (point) 'riece-addon))
        (intern-soft
         (completing-read "Add-on: "
-                         (mapcar (lambda (addon)
-                                   (list (symbol-name addon)))
-                                 riece-addons)
+                         (mapcar (lambda (dependency)
+                                   (list (symbol-name (car dependency))))
+                                 riece-addon-dependencies)
                          (lambda (pointer)
                            (let ((enabled
                                   (intern-soft (concat (car pointer)