# HG changeset patch # User Dan Nicolaescu # Date 1206207232 0 # Node ID c73e70274c0cd155d59e56ddad0b343f7ad21566 # Parent 9a34bf3a43638445535cc754611a50cf04a4cdc3 (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. diff -r 9a34bf3a4363 -r c73e70274c0c lisp/ChangeLog --- a/lisp/ChangeLog Sat Mar 22 17:21:48 2008 +0000 +++ b/lisp/ChangeLog Sat Mar 22 17:33:52 2008 +0000 @@ -1,3 +1,10 @@ +2008-03-22 Alexandre Julliard + + * 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 * vc-git.el (vc-git-annotate-extract-revision-at-line): diff -r 9a34bf3a4363 -r c73e70274c0c lisp/vc-git.el --- a/lisp/vc-git.el Sat Mar 22 17:21:48 2008 +0000 +++ b/lisp/vc-git.el Sat Mar 22 17:33:52 2008 +0000 @@ -149,7 +149,7 @@ (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." @@ -229,10 +229,19 @@ (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 @@ -241,9 +250,14 @@ (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 @@ 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