]> git.eshelyaron.com Git - emacs.git/commitdiff
(vc-git--empty-db-p)
authorDan Nicolaescu <dann@ics.uci.edu>
Sat, 22 Mar 2008 17:33:52 +0000 (17:33 +0000)
committerDan Nicolaescu <dann@ics.uci.edu>
Sat, 22 Mar 2008 17:33:52 +0000 (17:33 +0000)
(vc-git-after-dir-status-stage1-empty-db): New functions.
(vc-git-dir-status, vc-git-after-dir-status-stage1, vc-git-state):
Add support for empty repositories.

lisp/ChangeLog
lisp/vc-git.el

index f7bacf9b31b502ab29ad1c51c09a34a2bdf6baec..353bf47b5e8e7bd3235211b0f4809fec7ec60ff0 100644 (file)
@@ -1,3 +1,10 @@
+2008-03-22  Alexandre Julliard  <julliard@winehq.org>
+
+       * vc-git.el (vc-git--empty-db-p)
+       (vc-git-after-dir-status-stage1-empty-db): New functions.
+       (vc-git-dir-status, vc-git-after-dir-status-stage1, vc-git-state):
+       Add support for empty repositories.
+
 2008-03-22  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * vc-git.el (vc-git-annotate-extract-revision-at-line):
index 36d17ad4a75ccb9d820b126797d480b266fa0739..82c006771695bbc09b5e60f2ccdeace9c3384d36 100644 (file)
     (if (and diff (string-match ":[0-7]\\{6\\} [0-7]\\{6\\} [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} \\([ADMU]\\)\0[^\0]+\0"
                                 diff))
        (if (string= (match-string 1 diff) "A") 'added 'edited)
-      'up-to-date)))
+      (if (vc-git--empty-db-p) 'added 'up-to-date))))
 
 (defun vc-git--ls-files-state (state &rest args)
   "Set state to STATE on all files found with git-ls-files ARGS."
   (vc-exec-after
    `(vc-git-after-dir-status-stage2 (quote ,update-function) ,status-buffer)))
 
+(defun vc-git-after-dir-status-stage1-empty-db (update-function status-buffer)
+  (goto-char (point-min))
+  (while (re-search-forward "\\([^\0]*?\\)\0" nil t 1)
+    (push (cons (match-string 1) 'added) 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) ,status-buffer)))
+
 (defun vc-git-dir-status (dir update-function status-buffer)
   "Return a list of conses (file . state) for DIR."
   ;; Further things that would have to be fixed later:
-  ;; - support for an empty repository (with no initial commit)
   ;; - how to handle unregistered directories
   ;; - how to support vc-status on a subdir of the project tree
   (with-current-buffer
     (set (make-local-variable 'vc-git-status-result) nil)
     (cd dir)
     (erase-buffer)
-    (vc-git-command (current-buffer) 'async nil "diff-index" "-z" "HEAD")
-    (vc-exec-after
-     `(vc-git-after-dir-status-stage1 (quote ,update-function) ,status-buffer))
+    (if (vc-git--empty-db-p)
+        (progn
+          (vc-git-command (current-buffer) 'async nil "ls-files" "-z" "-c")
+          (vc-exec-after
+           `(vc-git-after-dir-status-stage1-empty-db (quote ,update-function) ,status-buffer)))
+      (vc-git-command (current-buffer) 'async nil "diff-index" "-z" "HEAD")
+      (vc-exec-after
+       `(vc-git-after-dir-status-stage1 (quote ,update-function) ,status-buffer)))
     (current-buffer)))
 
 ;;; STATE-CHANGING FUNCTIONS
@@ -482,6 +496,10 @@ or BRANCH^ (where \"^\" can be repeated)."
 The difference to vc-do-command is that this function always invokes `git'."
   (apply 'vc-do-command buffer okstatus "git" file-or-list flags))
 
+(defun vc-git--empty-db-p ()
+  "Check if the git db is empty (no commit done yet)."
+  (not (eq 0 (vc-git--call nil "rev-parse" "--verify" "HEAD"))))
+
 (defun vc-git--call (buffer command &rest args)
   ;; We don't need to care the arguments.  If there is a file name, it
   ;; is always a relative one.  This works also for remote