auto-install.elをバッチモードで動かす その2

以前の案ではコンパイルに失敗すると止まったので書き直した。
バッファーにauto-install.elの出力を書き出して終了を表す文字列が表示されたらwaitループを抜ける。

(progn
  (setq install_dir (expand-file-name "#{install_dir}")
        load-path (cons install_dir load-path)
        auto-install-directory install_dir
        auto-install-save-confirm nil
        auto-install-package-name-list nil
        auto-install-install-confirm nil)
  (require 'auto-install)
  (require 'cl)
  (get-buffer-create "*Messages*")

  (defadvice auto-install-install (around replace-message-auto-install-install activate)
    (defalias 'old-message (symbol-function 'message))
    (letf* (((symbol-function 'message)
             (lambda (format-string &rest args)
 ;              (apply 'old-message (cons format-string args))
               (with-current-buffer (get-buffer "*Messages*")
                 (insert (format "%s" format-string))))))
      ad-do-it))
  (ad-activate 'auto-install-install)

  (auto-install-#{datasource} "#{package}")

  (with-current-buffer (get-buffer "*Messages*")
    (while (not (search-forward "Installation is completed." nil t))
      (goto-char (point-min))
      (sit-for 1))))

深いループでevalやapplyやfuncallするとmax-lisp-eval-depthに引っかかる。なんで。。。
これなしでmessageを呼び出す方法がわからない。