-(defun riece-insinuate-addon (addon)
- (require addon) ;implicit dependency
- (funcall (intern (concat (symbol-name addon) "-insinuate")))
- (if riece-debug
- (message "Add-on %S is insinuated" addon)))
-
-(defun riece-enable-addon (addon)
- (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
- (if (null enabled)
- (if riece-debug
- (message "Add-on %S doesn't support enable/disable" addon))
- (if (symbol-value enabled)
- (if riece-debug
- (message "Can't enable add-on %S" addon))
- (funcall (intern (concat (symbol-name addon) "-enable")))
- (if riece-debug
- (message "Add-on %S enabled" addon))))))
-
-(defun riece-disable-addon (addon)
- (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
- (if (null enabled)
- (if riece-debug
- (message "Add-on %S doesn't support enable/disable" addon))
- (if (symbol-value enabled)
- (progn
- (funcall (intern (concat (symbol-name addon) "-disable")))
- (if riece-debug
- (message "Add-on %S disabled" addon)))
- (if riece-debug
- (message "Can't disable add-on %S" addon))))))
+(defun riece-resolve-addons (addons)
+ ;; Add files in riece-addon-directory to addons.
+ (if (file-directory-p riece-addon-directory)
+ (setq addons (nconc
+ addons
+ (mapcar
+ (lambda (name)
+ (unless (file-directory-p
+ (expand-file-name name riece-addon-directory))
+ (intern (file-name-sans-extension name))))
+ (directory-files riece-addon-directory nil "\\`[^.]")))))
+ ;; Sort & uniquify.
+ (setq addons (sort addons (lambda (symbol1 symbol2)
+ (string-lessp (symbol-name symbol1)
+ (symbol-name symbol2)))))
+ (let ((pointer addons))
+ (while pointer
+ (if (memq (car pointer) (cdr pointer))
+ (setcar pointer nil))
+ (setq pointer (cdr pointer)))
+ (delq nil addons))
+ ;; Build & resolve dependencies.
+ (riece-sort-addon-dependencies
+ (riece-load-and-build-addon-dependencies addons)))
+
+(defun riece-insinuate-addon-1 (addon verbose)
+ (if (get addon 'riece-addon-insinuated)
+ (if verbose
+ (message "Add-on %S is already insinuated" addon))
+ (require addon)
+ (funcall (intern (concat (symbol-name addon) "-insinuate")))
+ (put addon 'riece-addon-insinuated t)
+ (if verbose
+ (message "Add-on %S is insinuated" addon))
+ (unless (get addon 'riece-addon-default-disabled)
+ (riece-enable-addon addon t))))
+
+(defun riece-insinuate-addon (addon &optional verbose)
+ (unless (assq addon riece-addon-dependencies)
+ (setq riece-addons (cons addon riece-addons)
+ riece-save-variables-are-dirty t
+ riece-addon-dependencies
+ (riece-resolve-addons
+ (cons addon (mapcar #'car riece-addon-dependencies)))))
+ (let ((pointer riece-addon-dependencies)
+ addons)
+ (while pointer
+ (unless (get (car (car pointer)) 'riece-addon-insinuated)
+ (setq addons (cons (car (car pointer)) addons)))
+ (if (eq (car (car pointer)) addon)
+ (setq pointer nil)
+ (setq pointer (cdr pointer))))
+ (setq addons (nreverse addons))
+ (if (and (> (length addons) 1)
+ (eq verbose 'ask)
+ (not (y-or-n-p (format "%s will be insinuated. Continue? "
+ (mapconcat #'symbol-name addons ", ")))))
+ (error "Insinuate operation was cancelled"))
+ (while addons
+ (riece-insinuate-addon-1 (car addons) verbose)
+ (setq addons (cdr addons)))))
+
+(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))
+ (uninstall (intern-soft (concat (symbol-name addon) "-uninstall"))))
+ (if entry
+ (if (cdr entry)
+ (if (= (length (cdr entry)) 1)
+ (error "%S depends on %S" (car (cdr entry)) addon)
+ (error "%s depend on %S"
+ (mapconcat #'symbol-name (cdr entry) ", ")
+ addon))
+ (riece-disable-addon addon verbose)
+ (if (and uninstall
+ (fboundp uninstall))
+ (funcall uninstall))
+ (setq riece-addon-dependencies
+ (delq entry riece-addon-dependencies))
+ (put addon 'riece-addon-insinuated nil)
+ (setq riece-addons (delq addon riece-addons)
+ riece-save-variables-are-dirty t
+ riece-addon-dependencies
+ (riece-resolve-addons
+ (delq addon (mapcar #'car riece-addon-dependencies))))))
+ (if verbose
+ (message "Add-on %S is uninstalled" addon)))))
+
+(defun riece-enable-addon (addon &optional verbose)
+ (unless (get addon 'riece-addon-insinuated)
+ (error "Add-on %S is not insinuated" addon))
+ (if (get addon 'riece-addon-enabled)
+ (if verbose
+ (message "Add-on %S is already enabled" addon))
+ (let ((enable (intern-soft (concat (symbol-name addon) "-enable"))))
+ (if (and enable
+ (fboundp enable))
+ (funcall enable))
+ (put addon 'riece-addon-enabled t)
+ (if verbose
+ (message "Add-on %S enabled" addon)))))
+
+(defun riece-disable-addon (addon &optional verbose)
+ (unless (get addon 'riece-addon-insinuated)
+ (error "Add-on %S is not insinuated" addon))
+ (if (not (get addon 'riece-addon-enabled))
+ (if verbose
+ (message "Add-on %S is already disabled" addon))
+ (let ((disable (intern-soft (concat (symbol-name addon) "-disable"))))
+ (if (and disable
+ (fboundp disable))
+ (funcall disable))
+ (put addon 'riece-addon-enabled nil)
+ (if verbose
+ (message "Add-on %S disabled" addon)))))
+
+(put 'riece-addon-list-mode 'font-lock-defaults
+ '(riece-addon-list-font-lock-keywords t))