;;; This mode checks in files after they have been saved; this is ;;; useful for keeping environments sync'd ;; http://www.cse.unsw.edu.au/~sjw/non-cvs/code/auto-vc.el (require 'vc) (defvar auto-vc-file-regexp-alist nil "If a file matches any regexp in this list, it will be auto-vc'd. If the assoc of the regexp is true, batches are delayed for that file.") (defvar auto-vc-follow-links t "Follow symbolic links when checking a file.") (defvar auto-vc-batch-commits nil "Commit files in batches") (defvar auto-vc-commit-queue nil) (defun auto-vc-queue-add (filename) (add-to-list 'auto-vc-commit-queue filename)) (defun auto-vc-queue-flush () (interactive) (setq auto-vc-commit-queue (delete nil (mapcar 'auto-vc-commit-file auto-vc-commit-queue)))) (defun auto-vc-toggle-batch () (interactive) (let ((old-batch auto-vc-batch-commits)) (if old-batch (auto-vc-queue-flush-one (auto-vc-buffer-to-filename (current-buffer)))) (setq auto-vc-batch-commits (not old-batch)))) (defun auto-vc-queue-flush-one (filename) (when (member filename auto-vc-commit-queue) (if (auto-vc-commit-file filename) (setq auto-vc-commit-queue (delete filename auto-vc-commit-queue))))) (defun auto-vc-buffer-to-filename (buffer) (let ((filename (buffer-file-name buffer))) (if auto-vc-follow-links (file-truename filename) filename))) (defun auto-vc-required-p (filename) (let ((value nil)) (dolist (elt auto-vc-file-regexp-list value) (if (string-match (car elt) filename) (setq value t))))) (defun auto-vc-filename-batch (filename) (let ((value nil)) (dolist (elt auto-vc-file-regexp-list value) (if (string-match (car elt) filename) (setq value (cdr elt)))))) ;;; Does the commit; returns nil on success (defun auto-vc-commit-file (filename) (if (condition-case err (vc-next-action-on-file filename nil "Auto-checkin") (error (progn (message (format "Auto-commit error: %s" (error-message-string err))) nil))) nil filename)) (defun auto-vc-after-save () (let* ((buffer (current-buffer)) (filename (auto-vc-buffer-to-filename buffer))) (when (auto-vc-required-p filename) (if auto-vc-batch-commits (auto-vc-queue-add filename) (auto-vc-commit-file filename))))) (defun auto-vc-after-kill () (let* ((buffer (current-buffer)) (filename (auto-vc-buffer-to-filename buffer))) (when (auto-vc-required-p filename) (auto-vc-queue-flush-one filename)))) (defun auto-vc-check-file () (let ((filename (auto-vc-buffer-to-filename (current-buffer)))) (when (auto-vc-required-p filename) (if (not (vc-registered filename)) (vc-register nil "Automatic registration")) (make-local-variable 'auto-vc-batch-commits) (setq auto-vc-batch-commits (or auto-vc-batch-commits (auto-vc-filename-batch filename))) (add-hook 'after-save-hook 'auto-vc-after-save nil t) (add-hook 'kill-buffer-hook 'auto-vc-after-kill nil t)))) (add-hook 'find-file-hooks 'auto-vc-check-file) (provide 'auto-vc)