]> git.eshelyaron.com Git - emacs.git/commitdiff
(vc-cvs-after-dir-status, vc-cvs-dir-status):
authorDan Nicolaescu <dann@ics.uci.edu>
Sun, 23 Mar 2008 00:07:33 +0000 (00:07 +0000)
committerDan Nicolaescu <dann@ics.uci.edu>
Sun, 23 Mar 2008 00:07:33 +0000 (00:07 +0000)
New functions to implement vc-status support.

lisp/ChangeLog
lisp/vc-cvs.el

index 0cb6857f2501ff92f6f671eb1b1e527d9657775c..d1460466f074a8c522a96228a246a9ec1c3af9cb 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-23  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc-cvs.el (vc-cvs-after-dir-status, vc-cvs-dir-status):
+       New functions to implement vc-status support.
+
 2008-03-22  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * vc.el (vc-status-prepare-status-buffer): New function.
index f75b3f4ebf54584ff4b83a820c04682e5c73bd96..98051b65430dc5a1fa894f30415fedcb36ad8c64 100644 (file)
@@ -864,6 +864,72 @@ state."
            (vc-cvs-parse-entry file t))))
       (forward-line 1))))
 
+;; XXX Experimental function for the vc-dired replacement.
+(defun vc-cvs-after-dir-status (update-function status-buffer)
+  ;; Heavily inspired by vc-cvs-parse-status. AKA a quick hack.
+  ;; It needs a lot of testing.
+  (let ((status nil)
+       (status-str nil)
+       (file nil)
+       (result nil)
+       (subdir default-directory))
+    (goto-char (point-min))
+    (while
+       ;; Look for either a file entry, an unregistered file, or a
+       ;; directory change.
+       (re-search-forward
+        "\\(^=+\n\\([^=c?\n].*\n\\|\n\\)+\\)\\|\\(\\(^?? .*\n\\)+\\)\\|\\(^cvs status: Examining .*\n\\)"
+        nil t)
+      ;; XXX: get rid of narrowing here.
+      (narrow-to-region (match-beginning 0) (match-end 0))
+      (goto-char (point-min))
+      ;; The subdir
+      (when (looking-at "cvs status: Examining \\(.+\\)")
+       (setq subdir (expand-file-name (match-string 1))))
+      ;; Unregistered files
+      (while (looking-at "? \\(.*\\)")
+       (setq file (file-relative-name 
+                   (expand-file-name (match-string 1) subdir)))
+       (push (cons file 'unregistered) result)
+       (forward-line 1))
+      ;; A file entry.
+      (when (re-search-forward "^File: " nil t)
+       (cond
+        ((looking-at "no file") nil)
+        ((re-search-forward "\\=\\([^ \t]+\\)" nil t)
+         (setq file (file-relative-name 
+                     (expand-file-name (match-string 1) subdir)))
+         (if (not (re-search-forward "\\=[ \t]+Status: \\(.*\\)" nil t))
+             (push (cons file 'unregistered) result)
+           (setq status-str (match-string 1))
+           (setq status
+                 (cond
+                  ((string-match "Up-to-date" status-str) 'up-to-date)
+                  ((string-match "Locally Modified" status-str) 'edited)
+                  ((string-match "Needs Merge" status-str) 'needs-merge)
+                  ((string-match "Needs \\(Checkout\\|Patch\\)" status-str)
+                   'needs-patch)
+                  ((string-match "Locally Added" status-str) 'added)
+                  (t 'edited)))
+           (unless (eq status 'up-to-date)
+             (push (cons file status) result))))))
+      (goto-char (point-max))
+      (widen))
+      ;; Remove the temporary buffer.
+      (kill-buffer (current-buffer))
+      (funcall update-function result status-buffer)))
+
+;; XXX Experimental function for the vc-dired replacement.
+(defun vc-cvs-dir-status (dir update-function status-buffer)
+  "Create a list of conses (file . state) for DIR."
+  (with-current-buffer
+      (get-buffer-create (expand-file-name " *VC-cvs* tmp status" dir))
+    (erase-buffer)
+    (vc-cvs-command (current-buffer) 'async dir "status")
+    (vc-exec-after
+     `(vc-cvs-after-dir-status (quote ,update-function) ,status-buffer))
+    (current-buffer)))
+
 (defun vc-cvs-get-entries (dir)
   "Insert the CVS/Entries file from below DIR into the current buffer.
 This function ensures that the correct coding system is used for that,