emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/vc-git.el,v


From: Alexandre Julliard
Subject: [Emacs-diffs] Changes to emacs/lisp/vc-git.el,v
Date: Sun, 13 Apr 2008 18:07:01 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Alexandre Julliard <julliard>   08/04/13 18:07:01

Index: vc-git.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/vc-git.el,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- vc-git.el   11 Apr 2008 15:17:58 -0000      1.51
+++ vc-git.el   13 Apr 2008 18:07:00 -0000      1.52
@@ -310,17 +310,35 @@
      (vc-git-file-type-as-string old-perm new-perm)
      (vc-git-rename-as-string state extra))))
 
-;; Variable used to keep the intermediate results for vc-git-status.
-(defvar vc-git-status-result nil)
-
-(defun vc-git-after-dir-status-stage2 (update-function)
+(defun vc-git-after-dir-status-stage (stage files update-function)
+  "Process sentinel for the various dir-status stages."
+  (let (remaining next-stage result)
   (goto-char (point-min))
+    (case stage
+      ('update-index
+       (setq next-stage (if (vc-git--empty-db-p) 'ls-files-added
+                          (if files 'ls-files-up-to-date 'diff-index))))
+      ('ls-files-added
+       (setq next-stage 'ls-files-unknown)
+       (while (re-search-forward "\\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} 
0\t\\([^\0]+\\)\0" nil t)
+         (let ((new-perm (string-to-number (match-string 1) 8))
+               (name (match-string 2)))
+           (push (list name 'added (vc-git-create-extra-fileinfo 0 new-perm)) 
result))))
+      ('ls-files-up-to-date
+       (setq next-stage 'diff-index)
+       (while (re-search-forward "\\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} 
0\t\\([^\0]+\\)\0" nil t)
+         (let ((perm (string-to-number (match-string 1) 8))
+               (name (match-string 2)))
+           (push (list name 'up-to-date (vc-git-create-extra-fileinfo perm 
perm)) result))))
+      ('ls-files-unknown
+       (when files (setq next-stage 'ls-files-ignored))
   (while (re-search-forward "\\([^\0]*?\\)\0" nil t 1)
-    (push (list (match-string 1) 'unregistered (vc-git-create-extra-fileinfo 0 
0)) vc-git-status-result))
-  (funcall update-function (nreverse vc-git-status-result)))
-
-(defun vc-git-after-dir-status-stage1 (update-function)
-  (goto-char (point-min))
+         (push (list (match-string 1) 'unregistered 
(vc-git-create-extra-fileinfo 0 0)) result)))
+      ('ls-files-ignored
+       (while (re-search-forward "\\([^\0]*?\\)\0" nil t 1)
+         (push (list (match-string 1) 'ignored (vc-git-create-extra-fileinfo 0 
0)) result)))
+      ('diff-index
+       (setq next-stage 'ls-files-unknown)
   (while (re-search-forward
           ":\\([0-7]\\{6\\}\\) \\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} 
[0-9a-f]\\{40\\} 
\\(\\([ADMUT]\\)\0\\([^\0]+\\)\\|\\([CR]\\)[0-9]*\0\\([^\0]+\\)\0\\([^\0]+\\)\\)\0"
          nil t 1)
@@ -331,43 +349,50 @@
           (new-name (match-string 8)))
       (if new-name  ; copy or rename
           (if (eq ?C (string-to-char state))
-              (push (list new-name 'added (vc-git-create-extra-fileinfo 
old-perm new-perm 'copy name)) vc-git-status-result)
-            (push (list name 'removed (vc-git-create-extra-fileinfo 0 0 
'rename new-name)) vc-git-status-result)
-            (push (list new-name 'added (vc-git-create-extra-fileinfo old-perm 
new-perm 'rename name)) vc-git-status-result))
-        (push (list name (vc-git--state-code state) 
(vc-git-create-extra-fileinfo old-perm new-perm)) vc-git-status-result))))
-  (erase-buffer)
-  (vc-git-command (current-buffer) 'async nil "ls-files" "-z" "-o"
-                 "--directory" "--no-empty-directory" "--exclude-standard")
-  (vc-exec-after
-   `(vc-git-after-dir-status-stage2 (quote ,update-function))))
+                   (push (list new-name 'added (vc-git-create-extra-fileinfo 
old-perm new-perm 'copy name)) result)
+                 (push (list name 'removed (vc-git-create-extra-fileinfo 0 0 
'rename new-name)) result)
+                 (push (list new-name 'added (vc-git-create-extra-fileinfo 
old-perm new-perm 'rename name)) result))
+             (push (list name (vc-git--state-code state) 
(vc-git-create-extra-fileinfo old-perm new-perm)) result))))))
+    (when result
+      (setq result (nreverse result))
+      (when files
+        (dolist (entry result) (setq files (delete (car entry) files)))
+        (unless files (setq next-stage nil))))
+    (when (or result (not next-stage)) (funcall update-function result 
next-stage))
+    (when next-stage (vc-git-dir-status-goto-stage next-stage files 
update-function))))
 
-(defun vc-git-after-dir-status-stage1-empty-db (update-function)
-  (goto-char (point-min))
-  (while (re-search-forward "\\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} 
0\t\\([^\0]+\\)\0" nil t)
-    (let ((new-perm (string-to-number (match-string 1) 8))
-          (name (match-string 2)))
-      (push (list name 'added (vc-git-create-extra-fileinfo 0 new-perm)) 
vc-git-status-result)))
+(defun vc-git-dir-status-goto-stage (stage files update-function)
   (erase-buffer)
-  (vc-git-command (current-buffer) 'async nil "ls-files" "-z" "-o"
-                 "--directory" "--no-empty-directory" "--exclude-standard")
+  (case stage
+    ('update-index
+     (if files
+         (vc-git-command (current-buffer) 'async files "add" "--refresh" "--")
+       (vc-git-command (current-buffer) 'async nil "update-index" 
"--refresh")))
+    ('ls-files-added
+     (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-c" "-s" 
"--"))
+    ('ls-files-up-to-date
+     (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-c" "-s" 
"--"))
+    ('ls-files-unknown
+     (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-o"
+                     "--directory" "--no-empty-directory" "--exclude-standard" 
"--"))
+    ('ls-files-ignored
+     (vc-git-command (current-buffer) 'async files "ls-files" "-z" "-o" "-i"
+                     "--directory" "--no-empty-directory" "--exclude-standard" 
"--"))
+    ('diff-index
+     (vc-git-command (current-buffer) 'async files "diff-index" "-z" "-M" 
"HEAD" "--")))
   (vc-exec-after
-   `(vc-git-after-dir-status-stage2 (quote ,update-function))))
+   `(vc-git-after-dir-status-stage (quote ,stage) (quote ,files) (quote 
,update-function))))
 
 (defun vc-git-dir-status (dir update-function)
-  "Return a list of conses (file . state) for DIR."
+  "Return a list of (FILE STATE EXTRA) entries for DIR."
   ;; Further things that would have to be fixed later:
   ;; - how to handle unregistered directories
   ;; - how to support vc-status on a subdir of the project tree
-  (set (make-local-variable 'vc-git-status-result) nil)
-  (if (vc-git--empty-db-p)
-      (progn
-       (vc-git-command (current-buffer) 'async nil "ls-files" "-z" "-c" "-s")
-       (vc-exec-after
-        `(vc-git-after-dir-status-stage1-empty-db 
-          (quote ,update-function))))
-    (vc-git-command (current-buffer) 'async nil "diff-index" "-z" "-M" "HEAD")
-    (vc-exec-after
-     `(vc-git-after-dir-status-stage1 (quote ,update-function)))))
+  (vc-git-dir-status-goto-stage 'update-index nil update-function))
+
+(defun vc-git-dir-status-files (dir files default-state update-function)
+  "Return a list of (FILE STATE EXTRA) entries for FILES in DIR."
+  (vc-git-dir-status-goto-stage 'update-index files update-function))
 
 (defun vc-git-status-extra-headers (dir)
   (let ((str (with-output-to-string




reply via email to

[Prev in Thread] Current Thread [Next in Thread]