Mercurial > emacs
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))) |