summaryrefslogtreecommitdiffstats
path: root/emacs.d/nxhtml/util/udev-ecb.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs.d/nxhtml/util/udev-ecb.el')
-rw-r--r--emacs.d/nxhtml/util/udev-ecb.el229
1 files changed, 229 insertions, 0 deletions
diff --git a/emacs.d/nxhtml/util/udev-ecb.el b/emacs.d/nxhtml/util/udev-ecb.el
new file mode 100644
index 0000000..be3b35f
--- /dev/null
+++ b/emacs.d/nxhtml/util/udev-ecb.el
@@ -0,0 +1,229 @@
+;;; udev-ecb.el --- Get ECB sources and set it up
+;;
+;; Author: Lennart Borgman (lennart O borgman A gmail O com)
+;; Created: 2008-08-25T04:02:37+0200 Mon
+(defconst udev-ecb:version "0.2");; Version:
+;; Last-Updated:
+;; URL:
+;; Keywords:
+;; Compatibility:
+;;
+;; Features that might be required by this library:
+;;
+;; None
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;;
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Change log:
+;;
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
+;; Floor, Boston, MA 02110-1301, USA.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Code:
+
+
+(eval-when-compile (require 'udev nil t))
+
+(defgroup udev-ecb nil
+ "Customization group for udev-ecb."
+ :group 'nxhtml)
+
+(defcustom udev-ecb-dir "~/.emacs.d/udev/ecb-cvs/"
+ "Directory where to put CVS ECB sources."
+ :type 'directory
+ :group 'udev-ecb)
+
+(defun udev-ecb-cvs-dir ()
+ "Return cvs root directory."
+ (file-name-as-directory (expand-file-name "ecb" udev-ecb-dir)))
+
+(defvar udev-ecb-miss-cedet nil)
+
+(defun udev-ecb-load-ecb ()
+ "Load fetched ECB."
+ (setq udev-ecb-miss-cedet nil)
+ (unless (featurep 'ecb)
+ (add-to-list 'load-path (udev-ecb-cvs-dir))
+ (let ((msg nil))
+ (unless (or msg (featurep 'cedet)) (setq msg "CEDET is not loaded"))
+ (unless (or msg (locate-library "semantic")) (setq msg "can't find CEDET Semantic"))
+ (unless (or msg (locate-library "eieio")) (setq msg "can't find CEDET eieio"))
+ (if msg
+ (progn
+ (setq udev-ecb-miss-cedet (format "Can't load ECB because %s." msg))
+ (ourcomments-warning udev-ecb-miss-cedet))
+ (require 'ecb nil t)))))
+
+(defcustom udev-ecb-load-ecb nil
+ "To load or not to load ECB..."
+ :type 'boolean
+ :require 'udev-ecb
+ :set (lambda (sym val)
+ (set-default sym val)
+ (when val
+ (udev-ecb-load-ecb)))
+ ;; ecb-activate, ecb-customize-most-important to menu
+ :set-after '(udev-cedet-load-cedet)
+ :group 'udev-ecb)
+
+(defvar udev-ecb-steps
+ '(udev-ecb-fetch
+ udev-ecb-fix-bad-files
+ udev-ecb-fetch-diff
+ udev-ecb-check-diff
+ udev-ecb-install
+ ))
+
+(defun udev-ecb-buffer-name (mode)
+ "Return a name for current compilation buffer ignoring MODE."
+ (udev-buffer-name "*Updating ECB %s*" udev-ecb-update-buffer mode))
+
+(defvar udev-ecb-update-buffer nil)
+
+(defun udev-ecb-has-cedet ()
+ (cond
+ ((not (and (locate-library "semantic")
+ (locate-library "eieio")))
+ (message (propertize "CEDET must be installed and loaded first"
+ 'face 'secondary-selection))
+ nil)
+ ((not (featurep 'cedet))
+ (message (propertize "CEDET must be loaded first"
+ 'face 'secondary-selection))
+ nil)
+ (t t)))
+
+(defun udev-ecb-setup-when-finished (log-buffer)
+ (require 'cus-edit)
+ (let ((inhibit-read-only t))
+ (with-current-buffer log-buffer
+ (widen)
+ (goto-char (point-max))
+ (insert "\n\nYou must restart Emacs to load ECB properly.\n")
+ (let ((load-ecb-saved-value (get 'udev-ecb-load-ecb 'saved-value))
+ (here (point))
+ )
+ (if load-ecb-saved-value
+ (insert "You have setup to load ECB the next time you start Emacs.\n\n")
+ (insert (propertize "Warning:" 'face 'compilation-warning)
+ " You have not setup to load ECB the next time you start Emacs.\n\n"))
+ (insert-button " Setup "
+ 'face 'custom-button
+ 'action (lambda (btn)
+ (interactive)
+ (customize-group-other-window 'udev-ecb)))
+ (insert " Setup to load ECB from fetched sources when starting Emacs.")))))
+
+;;;###autoload
+(defun udev-ecb-update ()
+ "Fetch and install ECB from the devel sources.
+To determine where to store the sources see `udev-ecb-dir'.
+For how to start ECB see `udev-ecb-load-ecb'."
+ (interactive)
+ (when (udev-ecb-has-cedet)
+ (let* ((has-it (file-exists-p (udev-ecb-cvs-dir)))
+ (prompt (if has-it
+ "Do you want to update ECB from devel sources? "
+ "Do you want to install ECB from devel sources? ")))
+ (when (y-or-n-p prompt)
+ (setq udev-ecb-update-buffer (get-buffer-create "*Update ECB*"))
+ (udev-call-first-step udev-ecb-update-buffer udev-ecb-steps
+ "Starting updating ECB from development sources"
+ 'udev-ecb-setup-when-finished)))))
+
+;;;###autoload
+(defun udev-ecb-customize-startup ()
+ "Customize ECB dev nXhtml startup group."
+ (interactive)
+ (if (file-exists-p (udev-ecb-cvs-dir))
+ (customize-group-other-window 'udev-ecb)
+ (message (propertize "You must fetch ECB from nXhtml first"
+ 'face 'secondary-selection))))
+
+(defun udev-ecb-fetch (log-buffer)
+ "Fetch ECB sources (asynchronously)."
+ (let ((default-directory (file-name-as-directory udev-ecb-dir)))
+ (unless (file-directory-p default-directory)
+ (make-directory default-directory))
+ (with-current-buffer
+ (compilation-start
+ "cvs -z3 -d:pserver:anonymous@ecb.cvs.sourceforge.net:/cvsroot/ecb co -P ecb"
+ 'compilation-mode
+ 'udev-ecb-buffer-name)
+ (current-buffer))))
+
+;;(udev-ecb-fix-bad-files nil)
+(defun udev-ecb-fix-bad-files (log-buffer)
+ "Change files that can not be compiled."
+ (let* ((bad-file (expand-file-name "ecb/ecb-advice-test.el" udev-ecb-dir))
+ (bad-file-buffer (find-buffer-visiting bad-file))
+ (this-log-buf (get-buffer-create "*Fix bad ECB files*"))
+ (fixed-it nil))
+ (when (file-exists-p bad-file)
+ (with-current-buffer (find-file-noselect bad-file)
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (save-match-data
+ (while (re-search-forward "\r" nil t)
+ (setq fixed-it t)
+ (replace-match ""))))
+ (basic-save-buffer)
+ (with-current-buffer this-log-buf
+ (erase-buffer)
+ (if fixed-it
+ (insert "Fixed " bad-file "\n")
+ (insert "The file " bad-file " was already ok\n")))
+ (unless bad-file-buffer (kill-buffer (current-buffer)))))
+ this-log-buf))
+
+(defun udev-ecb-fetch-diff (log-buffer)
+ "Fetch diff between local ECB sources and repository."
+ (udev-fetch-cvs-diff (udev-ecb-cvs-dir) 'udev-ecb-buffer-name))
+
+(defun udev-ecb-check-diff (log-buffer)
+ "Check cvs diff output for merge conflicts."
+ (udev-check-cvs-diff (expand-file-name "your-patches.diff"
+ (udev-ecb-cvs-dir))
+ udev-ecb-update-buffer))
+
+(defun udev-ecb-install (log-buffer)
+ "Install the ECB sources just fetched.
+Note that they will not be installed in current Emacs session."
+ (udev-batch-compile "-l ecb-batch-compile.el"
+ udev-this-dir
+ 'udev-ecb-buffer-name))
+
+;;(udev-ecb-install-help (get-buffer-create "*temp online-help*"))
+(defun udev-ecb-install-help (log-buffer)
+ (let ((trc-buf (get-buffer-create "*temp online-help*")))
+ (with-current-buffer trc-buf
+ (setq default-directory (udev-ecb-cvs-dir))
+ (w32shell-with-shell "msys" (shell-command "make online-help&" trc-buf)))))
+
+(provide 'udev-ecb)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; udev-ecb.el ends here