comparison lisp/vc-git.el @ 96524:d620ef3acfdc

* vc-git.el (vc-git-registered): Return true for removed files. (vc-git-print-log, vc-git-log-view-mode): Print a single log for all the files instead of one per file. (vc-git-previous-revision): Add support for project-wide previous revision when specified file is nil.
author Alexandre Julliard <julliard@winehq.org>
date Sat, 05 Jul 2008 18:42:07 +0000
parents 5b7442d7d9ce
children f534da0cc0ea
comparison
equal deleted inserted replaced
96523:090433f48c5f 96524:d620ef3acfdc
130 (defun vc-git-registered (file) 130 (defun vc-git-registered (file)
131 "Check whether FILE is registered with git." 131 "Check whether FILE is registered with git."
132 (when (vc-git-root file) 132 (when (vc-git-root file)
133 (with-temp-buffer 133 (with-temp-buffer
134 (let* ((dir (file-name-directory file)) 134 (let* ((dir (file-name-directory file))
135 (name (file-relative-name file dir))) 135 (name (file-relative-name file dir))
136 (and (ignore-errors 136 (str (ignore-errors
137 (when dir (cd dir)) 137 (when dir (cd dir))
138 (vc-git--out-ok "ls-files" "-c" "-z" "--" name)) 138 (vc-git--out-ok "ls-files" "-c" "-z" "--" name)
139 (let ((str (buffer-string))) 139 ;; if result is empty, use ls-tree to check for deleted file
140 (and (> (length str) (length name)) 140 (when (eq (point-min) (point-max))
141 (string= (substring str 0 (1+ (length name))) 141 (vc-git--out-ok "ls-tree" "--name-only" "-z" "HEAD" "--" name))
142 (concat name "\0"))))))))) 142 (buffer-string))))
143 (and str
144 (> (length str) (length name))
145 (string= (substring str 0 (1+ (length name)))
146 (concat name "\0")))))))
143 147
144 (defun vc-git--state-code (code) 148 (defun vc-git--state-code (code)
145 "Convert from a string to a added/deleted/modified state." 149 "Convert from a string to a added/deleted/modified state."
146 (case (string-to-char code) 150 (case (string-to-char code)
147 (?M 'edited) 151 (?M 'edited)
451 ;; the command. 455 ;; the command.
452 (vc-setup-buffer buffer) 456 (vc-setup-buffer buffer)
453 ;; If the buffer exists from a previous invocation it might be 457 ;; If the buffer exists from a previous invocation it might be
454 ;; read-only. 458 ;; read-only.
455 (let ((inhibit-read-only t)) 459 (let ((inhibit-read-only t))
456 ;; XXX `log-view-mode' needs to have something to identify where 460 (with-current-buffer
457 ;; the log for each individual file starts. It seems that by 461 buffer
458 ;; default git does not output this info. So loop here and call 462 (vc-git-command buffer 'async files
459 ;; "git rev-list" on each file separately to make sure that each
460 ;; file gets a "File:" header before the corresponding
461 ;; log. Maybe there is a way to do this with one command...
462 (dolist (file flist)
463 (with-current-buffer
464 buffer
465 (insert "File: " (file-name-nondirectory file) "\n"))
466 (vc-git-command buffer 'async (file-relative-name file)
467 "rev-list" "--pretty" "HEAD" "--"))))) 463 "rev-list" "--pretty" "HEAD" "--")))))
468 464
469 (defvar log-view-message-re) 465 (defvar log-view-message-re)
470 (defvar log-view-file-re) 466 (defvar log-view-file-re)
471 (defvar log-view-font-lock-keywords) 467 (defvar log-view-font-lock-keywords)
468 (defvar log-view-per-file-logs)
472 469
473 (define-derived-mode vc-git-log-view-mode log-view-mode "Git-Log-View" 470 (define-derived-mode vc-git-log-view-mode log-view-mode "Git-Log-View"
474 (require 'add-log) ;; we need the faces add-log 471 (require 'add-log) ;; we need the faces add-log
475 ;; Don't have file markers, so use impossible regexp. 472 ;; Don't have file markers, so use impossible regexp.
476 (set (make-local-variable 'log-view-file-re) "^File:[ \t]+\\(.+\\)") 473 (set (make-local-variable 'log-view-file-re) "\\`a\\`")
474 (set (make-local-variable 'log-view-per-file-logs) nil)
477 (set (make-local-variable 'log-view-message-re) 475 (set (make-local-variable 'log-view-message-re)
478 "^commit *\\([0-9a-z]+\\)") 476 "^commit *\\([0-9a-z]+\\)")
479 (set (make-local-variable 'log-view-font-lock-keywords) 477 (set (make-local-variable 'log-view-font-lock-keywords)
480 (append 478 (append
481 `((,log-view-message-re (1 'change-log-acknowledgement)) 479 `((,log-view-message-re (1 'change-log-acknowledgement)))
482 (,log-view-file-re (1 'change-log-file-face)))
483 ;; Handle the case: 480 ;; Handle the case:
484 ;; user: foo@bar 481 ;; user: foo@bar
485 '(("^Author:[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)" 482 '(("^Author:[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
486 (1 'change-log-email)) 483 (1 'change-log-email))
487 ;; Handle the case: 484 ;; Handle the case:
575 572
576 ;;; MISCELLANEOUS 573 ;;; MISCELLANEOUS
577 574
578 (defun vc-git-previous-revision (file rev) 575 (defun vc-git-previous-revision (file rev)
579 "Git-specific version of `vc-previous-revision'." 576 "Git-specific version of `vc-previous-revision'."
580 (let ((default-directory (file-name-directory (expand-file-name file))) 577 (if file
581 (file (file-name-nondirectory file))) 578 (let ((default-directory (file-name-directory (expand-file-name file)))
582 (vc-git-symbolic-commit 579 (file (file-name-nondirectory file)))
583 (with-temp-buffer 580 (vc-git-symbolic-commit
584 (and 581 (with-temp-buffer
585 (vc-git--out-ok "rev-list" "-2" rev "--" file) 582 (and
586 (goto-char (point-max)) 583 (vc-git--out-ok "rev-list" "-2" rev "--" file)
587 (bolp) 584 (goto-char (point-max))
588 (zerop (forward-line -1)) 585 (bolp)
589 (not (bobp)) 586 (zerop (forward-line -1))
590 (buffer-substring-no-properties 587 (not (bobp))
591 (point) 588 (buffer-substring-no-properties
592 (1- (point-max)))))))) 589 (point)
590 (1- (point-max)))))))
591 (with-temp-buffer
592 (and
593 (vc-git--out-ok "rev-parse" (concat rev "^"))
594 (buffer-substring-no-properties (point-min) (+ (point-min) 40))))))
593 595
594 (defun vc-git-next-revision (file rev) 596 (defun vc-git-next-revision (file rev)
595 "Git-specific version of `vc-next-revision'." 597 "Git-specific version of `vc-next-revision'."
596 (let* ((default-directory (file-name-directory 598 (let* ((default-directory (file-name-directory
597 (expand-file-name file))) 599 (expand-file-name file)))