;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; * registered (file) OK
;; * state (file) OK
;; - state-heuristic (file) NOT NEEDED
-;; - dir-state (dir) OK
;; * working-revision (file) OK
;; - latest-on-branch-p (file) NOT NEEDED
-;; * checkout-model (file) OK
+;; * checkout-model (files) OK
;; - workfile-unchanged-p (file) OK
;; - mode-line-string (file) OK
-;; - dired-state-info (file) OK
+;; - prettify-state-info (file) OK
;; STATE-CHANGING FUNCTIONS
;; * create-repo () OK
;; * register (files &optional rev comment) OK
;; * print-log (files &optional buffer) OK
;; - log-view-mode () OK
;; - show-log-entry (revision) OK
-;; - wash-log (file) COULD BE SUPPORTED
-;; - logentry-check () NOT NEEDED
;; - comment-history (file) ??
;; - update-changelog (files) COULD BE SUPPORTED
;; * diff (file &optional rev1 rev2 buffer) OK
-;; - revision-completion-table (files) NEEDED?
+;; - revision-completion-table (files) OK
;; - annotate-command (file buf &optional rev) OK
;; - annotate-time () OK
;; - annotate-current-time () NOT NEEDED
;; - find-file-hook () NOT NEEDED
;; - find-file-not-found-hook () NOT NEEDED
-(eval-when-compile (require 'cl) (require 'vc) (require 'grep))
+(eval-when-compile
+ (require 'cl)
+ (require 'vc)
+ (require 'grep))
(defvar git-commits-coding-system 'utf-8
"Default coding system for git commits.")
;;; BACKEND PROPERTIES
-(defun vc-git-revision-granularity ()
- 'repository)
+(defun vc-git-revision-granularity () 'repository)
+(defun vc-git-checkout-model (files) 'implicit)
;;; STATE-QUERYING FUNCTIONS
(defun vc-git-state (file)
"Git-specific version of `vc-state'."
;; FIXME: This can't set 'ignored yet
- (vc-git--call nil "add" "--refresh" "--" (file-relative-name file))
- (let ((diff (vc-git--run-command-string file "diff-index" "-z" "HEAD" "--")))
- (if (and diff (string-match ":[0-7]\\{6\\} [0-7]\\{6\\} [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} \\([ADMUT]\\)\0[^\0]+\0"
- diff))
- (vc-git--state-code (match-string 1 diff))
- (if (vc-git--empty-db-p) 'added 'up-to-date))))
+ (if (not (vc-git-registered file))
+ 'unregistered
+ (vc-git--call nil "add" "--refresh" "--" (file-relative-name file))
+ (let ((diff (vc-git--run-command-string file "diff-index" "-z" "HEAD" "--")))
+ (if (and diff (string-match ":[0-7]\\{6\\} [0-7]\\{6\\} [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} \\([ADMUT]\\)\0[^\0]+\0"
+ diff))
+ (vc-git--state-code (match-string 1 diff))
+ (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-file-setprop file 'vc-state state))
(setq start (point))))))
-(defun vc-git-dir-state (dir)
- "Git-specific version of `dir-state'."
- (vc-git--ls-files-state 'up-to-date "-c")
- (vc-git--ls-files-state 'edited "-m")
- (vc-git--ls-files-state 'removed "-d")
- (vc-git--ls-files-state 'ignored "-o" "-i" "--exclude-standard")
- (vc-git--ls-files-state nil "-o" "--exclude-standard"))
-
(defun vc-git-working-revision (file)
"Git-specific version of `vc-working-revision'."
(let ((str (with-output-to-string
(match-string 2 str)
str)))
-(defun vc-git-checkout-model (file)
- 'implicit)
-
(defun vc-git-workfile-unchanged-p (file)
(eq 'up-to-date (vc-git-state file)))
'face 'font-lock-type-face))
(defun vc-git-status-printer (info)
- "Pretty-printer for the vc-status-fileinfo structure."
- (let* ((state (vc-status-fileinfo->state info))
- (extra (vc-status-fileinfo->extra info))
+ "Pretty-printer for the vc-dir-fileinfo structure."
+ (let* ((state (if (vc-dir-fileinfo->directory info)
+ 'DIRECTORY
+ (vc-dir-fileinfo->state info)))
+ (extra (vc-dir-fileinfo->extra info))
(old-perm (when extra (vc-git-extra-fileinfo->old-perm extra)))
(new-perm (when extra (vc-git-extra-fileinfo->new-perm extra))))
(insert
" "
- (propertize (format "%c" (if (vc-status-fileinfo->marked info) ?* ? ))
+ (propertize (format "%c" (if (vc-dir-fileinfo->marked info) ?* ? ))
'face 'font-lock-type-face)
" "
(propertize
'mouse-face 'highlight)
" " (vc-git-permissions-as-string old-perm new-perm)
" "
- (propertize (vc-git-escape-file-name (vc-status-fileinfo->name info))
+ (propertize (vc-git-escape-file-name (vc-dir-fileinfo->name info))
'face 'font-lock-function-name-face
'mouse-face 'highlight)
(vc-git-file-type-as-string old-perm new-perm)
"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
+ ;; - how to support vc-dir on a subdir of the project tree
(vc-git-dir-status-goto-stage 'update-index nil update-function))
(defun vc-git-dir-status-files (dir files default-state update-function)