diff options
| author | Alexandre Julliard | 2008-07-05 18:42:07 +0000 |
|---|---|---|
| committer | Alexandre Julliard | 2008-07-05 18:42:07 +0000 |
| commit | 934a944e5434e1024f9901aee7152bf437d63080 (patch) | |
| tree | a6ffae98984d2b10a16cd5ce5776f9825292b96c | |
| parent | 16952f1875517eef829cc64897cd44a7c8c20c5e (diff) | |
| download | emacs-934a944e5434e1024f9901aee7152bf437d63080.tar.gz emacs-934a944e5434e1024f9901aee7152bf437d63080.zip | |
* 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.
| -rw-r--r-- | lisp/ChangeLog | 8 | ||||
| -rw-r--r-- | lisp/vc-git.el | 72 |
2 files changed, 45 insertions, 35 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2e8e4b6276d..7776d8609cf 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,11 @@ | |||
| 1 | 2008-07-05 Alexandre Julliard <julliard@winehq.org> | ||
| 2 | |||
| 3 | * vc-git.el (vc-git-registered): Return true for removed files. | ||
| 4 | (vc-git-print-log, vc-git-log-view-mode): Print a single log for | ||
| 5 | all the files instead of one per file. | ||
| 6 | (vc-git-previous-revision): Add support for project-wide previous | ||
| 7 | revision when specified file is nil. | ||
| 8 | |||
| 1 | 2008-07-05 Dan Nicolaescu <dann@ics.uci.edu> | 9 | 2008-07-05 Dan Nicolaescu <dann@ics.uci.edu> |
| 2 | 10 | ||
| 3 | * vms-patch.el, vmsproc.el, mail/vms-pmail.el: Move to obsolete dir. | 11 | * vms-patch.el, vmsproc.el, mail/vms-pmail.el: Move to obsolete dir. |
diff --git a/lisp/vc-git.el b/lisp/vc-git.el index 842d7135448..079ff5abd47 100644 --- a/lisp/vc-git.el +++ b/lisp/vc-git.el | |||
| @@ -132,14 +132,18 @@ | |||
| 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." |
| @@ -453,33 +457,26 @@ | |||
| 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_.-]+\\)" |
| @@ -577,19 +574,24 @@ or BRANCH^ (where \"^\" can be repeated)." | |||
| 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'." |