;;; -*- Emacs-Lisp -*-

(defvar riece-modules
  (cons 'riece-compat
	(cons (if (featurep 'xemacs)
		  'riece-xemacs
		'riece-emacs)
	      '(riece-globals
		riece-options
		riece-version
		riece-coding
		riece-complete
		riece-addon

		riece-mode
		;; riece-identity -+-> riece-channel
		;;                 +-> riece-user
		riece-identity
		riece-channel
		riece-user

		riece-misc
		riece-signal

		;; riece-layout ---> riece-display
		riece-layout
		riece-display
		riece-server

		;; riece-channel -+-> riece-naming
		;; riece-user    -+
		riece-naming
		riece-message

		;; riece-filter calls riece-{handle,000,200,300,400,500}
		riece-filter
		riece-handle
		riece-000
		riece-200
		riece-300
		riece-400
		riece-500

		riece-commands
		riece-irc
		riece

		;; add-ons
		riece-ctcp
		riece-highlight
		riece-log
		riece-mini
		riece-rdcc
		riece-url
		riece-unread
		riece-doctor
		riece-alias
		riece-skk-kakutei
		riece-foolproof
		riece-guess
		riece-history
		riece-button
		riece-keyword
		riece-menu
		riece-icon
		riece-async
		riece-lsdb
		riece-xface
		riece-ctlseq
		riece-ignore
		riece-hangman
		riece-biff
		riece-kakasi
		riece-yank))))

(defun riece-compile-modules (modules)
  (let ((load-path (cons nil load-path)))
    (while modules
      (let ((source (expand-file-name
		     (concat (symbol-name (car modules)) ".el"))))
	(if (file-newer-than-file-p source (concat source "c"))
	    (condition-case error
		(byte-compile-file source)
	      (error))))
      (setq modules (cdr modules)))))

(defun riece-install-modules (modules dest just-print)
  (unless (or just-print (file-exists-p dest))
    (make-directory dest t))
  (while modules
    (let ((name (symbol-name (car modules))))
      (princ (format "%s.el -> %s\n" name dest))
      (unless just-print
	(copy-file (expand-file-name (concat name ".el"))
		   (expand-file-name (concat name ".el") dest)
		   t t))
      (princ (format "%s.elc -> %s\n" name dest))
      (unless just-print
	(if (file-exists-p (expand-file-name (concat name ".elc")))
	    (copy-file (expand-file-name (concat name ".elc"))
		       (expand-file-name (concat name ".elc") dest)
		       t t)
	  (princ (format "(%s was not successfully compiled, ignored)\n"
			 name)))))
    (setq modules (cdr modules))))

(defun riece-install-just-print-p ()
  (let ((flag (getenv "MAKEFLAGS"))
	case-fold-search)
    (if flag
	(string-match "^\\(\\(--[^ ]+ \\)+-\\|[^ =-]\\)*n" flag))))

(defun riece-compile ()
  (riece-compile-modules riece-modules))

(defun riece-install ()
  (riece-install-modules
   riece-modules
   (expand-file-name "riece" (car command-line-args-left))
   (riece-install-just-print-p)))

(defun riece-compile-package ()
  (setq autoload-package-name "riece")
  (add-to-list 'command-line-args-left ".")
  (batch-update-directory)
  (add-to-list 'command-line-args-left ".")
  (Custom-make-dependencies)
  (riece-compile-modules
   (append riece-modules
	   '(auto-autoloads custom-load))))

(defun riece-install-package ()
  (riece-install-modules
   (append riece-modules
	   '(auto-autoloads custom-load))
   (expand-file-name "riece"
		     (expand-file-name "lisp" (car command-line-args-left)))
   (riece-install-just-print-p)))

(defun riece-test ()
  (let ((load-path (cons (expand-file-name "test") (cons nil load-path)))
	(files (directory-files "test" t "^test-.*\\.el$"))
        suite)
    (require 'lunit)
    (setq suite (lunit-make-test-suite))
    (while files
      (when (file-regular-p (car files))
	(load-file (car files))
	(lunit-test-suite-add-test
	 suite
	 (lunit-make-test-suite-from-class
	  (intern (file-name-sans-extension
		   (file-name-nondirectory (car files)))))))
      (setq files (cdr files)))
    (lunit-report suite (car command-line-args-left))))
