From 69d24b40d2ed3cdfa7e79da4c729bddd381c8231 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Mon, 18 May 2015 15:49:13 +0300 Subject: [PATCH] Improve handling of the first Git revision * lisp/vc/log-view.el (log-view-toggle-entry-display): When there's no next entry, delete until the end of the buffer. (log-view-end-of-defun-1): Stop at eob. * lisp/vc/vc-annotate.el (vc-annotate-show-diff-revision-at-line-internal): Don't give up when previous-revision is nil. * lisp/vc/vc-git.el (vc-git-expanded-log-entry): End the arguments with `--' to avoid ambiguity. (vc-git-annotate-extract-revision-at-line): Exclude `^' from the returned revision string. (vc-git-annotate-time): Expect `^' before the first revision. * lisp/vc/vc-git.el (vc-git-diff): Diff against an empty tree if REV1 is nil, and REV2 is not. * lisp/vc/vc.el: Update the description of the `diff' function. --- lisp/vc/log-view.el | 9 +++++++-- lisp/vc/vc-annotate.el | 20 +++++++++----------- lisp/vc/vc-git.el | 19 ++++++++++++------- lisp/vc/vc.el | 3 ++- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/lisp/vc/log-view.el b/lisp/vc/log-view.el index 042ea131a97..19bbc45f927 100644 --- a/lisp/vc/log-view.el +++ b/lisp/vc/log-view.el @@ -404,7 +404,9 @@ This calls `log-view-expanded-log-entry-function' to do the work." (unless (and pos (log-view-inside-comment-p pos)) (error "Broken markup in `log-view-toggle-entry-display'")) (delete-region pos - (next-single-property-change pos 'log-view-comment)) + (or + (next-single-property-change pos 'log-view-comment) + (point-max))) (put-text-property beg (1+ beg) 'log-view-entry-expanded nil) (if (< opoint pos) (goto-char opoint))) @@ -469,7 +471,10 @@ It assumes that a log entry starts with a line matching ((looking-back "Show 2X entries Show unlimited entries" (line-beginning-position)) (setq looping nil) - (forward-line -1)))))) + (forward-line -1)) + ;; There are no buttons if we've turned on unlimited entries. + ((eobp) + (setq looping nil)))))) (defun log-view-end-of-defun (&optional arg) "Move forward to the next Log View entry. diff --git a/lisp/vc/vc-annotate.el b/lisp/vc/vc-annotate.el index d369c90915a..3a50c9b6a2d 100644 --- a/lisp/vc/vc-annotate.el +++ b/lisp/vc/vc-annotate.el @@ -582,17 +582,15 @@ the file in question, search for the log entry required and move point." (setq prev-rev (vc-call-backend vc-annotate-backend 'previous-revision (if filediff fname nil) rev)) - (if (not prev-rev) - (message "Cannot diff from any revision prior to %s" rev) - (vc-diff-internal - t - ;; The value passed here should follow what - ;; `vc-deduce-fileset' returns. - (list vc-annotate-backend - (if filediff - (list fname) - nil)) - prev-rev rev)))))) + (vc-diff-internal + t + ;; The value passed here should follow what + ;; `vc-deduce-fileset' returns. + (list vc-annotate-backend + (if filediff + (list fname) + nil)) + prev-rev rev))))) (defun vc-annotate-show-diff-revision-at-line () "Visit the diff of the revision at line from its previous revision." diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index cbf3da3003f..e3cd5d4e3dc 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -960,14 +960,13 @@ or BRANCH^ (where \"^\" can be repeated)." (defun vc-git-expanded-log-entry (revision) (with-temp-buffer - (apply 'vc-git-command t nil nil (list "log" revision "-1")) + (apply 'vc-git-command t nil nil (list "log" revision "-1" "--")) (goto-char (point-min)) (unless (eobp) ;; Indent the expanded log entry. (indent-region (point-min) (point-max) 2) (buffer-string)))) - (defun vc-git-region-history (file buffer lfrom lto) (vc-git-command buffer 'async nil "log" "-p" ;"--follow" ;FIXME: not supported? (format "-L%d,%d:%s" lfrom lto (file-relative-name file)))) @@ -1019,12 +1018,18 @@ or BRANCH^ (where \"^\" can be repeated)." (defun vc-git-diff (files &optional rev1 rev2 buffer async) "Get a difference report using Git between two revisions of FILES." - (let (process-file-side-effects) + (let (process-file-side-effects + (command "diff-tree")) + (if rev2 + ;; Diffing against the empty tree. + (unless rev1 (setq rev1 "4b825dc642cb6eb9a060e54bf8d69288fbee4904")) + (setq command "diff-index") + (unless rev1 (setq rev1 "HEAD"))) (if vc-git-diff-switches (apply #'vc-git-command (or buffer "*vc-diff*") (if async 'async 1) files - (if (and rev1 rev2) "diff-tree" "diff-index") + command "--exit-code" (append (vc-switches 'git 'diff) (list "-p" (or rev1 "HEAD") rev2 "--"))) @@ -1033,7 +1038,7 @@ or BRANCH^ (where \"^\" can be repeated)." (concat "diff " (mapconcat 'identity (vc-switches nil 'diff) " ")) - (or rev1 "HEAD") rev2 "--")))) + rev1 rev2 "--")))) (defun vc-git-revision-table (_files) ;; What about `files'?!? --Stef @@ -1061,7 +1066,7 @@ or BRANCH^ (where \"^\" can be repeated)." (declare-function vc-annotate-convert-time "vc-annotate" (&optional time)) (defun vc-git-annotate-time () - (and (re-search-forward "^[0-9a-f]+[^()]+(.*?\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\) \\(:?\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\) \\([-+0-9]+\\)\\)? *[0-9]+) " nil t) + (and (re-search-forward "^[0-9a-f^]+[^()]+(.*?\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\) \\(:?\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\) \\([-+0-9]+\\)\\)? *[0-9]+) " nil t) (vc-annotate-convert-time (apply #'encode-time (mapcar (lambda (match) (if (match-beginning match) @@ -1072,7 +1077,7 @@ or BRANCH^ (where \"^\" can be repeated)." (defun vc-git-annotate-extract-revision-at-line () (save-excursion (beginning-of-line) - (when (looking-at "\\([0-9a-f^][0-9a-f]+\\) \\(\\([^(]+\\) \\)?") + (when (looking-at "\\^?\\([0-9a-f]+\\) \\(\\([^(]+\\) \\)?") (let ((revision (match-string-no-properties 1))) (if (match-beginning 2) (let ((fname (match-string-no-properties 3))) diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index d5d0abe6517..1bd04e13430 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -367,7 +367,8 @@ ;; BUFFER is nil. If ASYNC is non-nil, run asynchronously. If REV1 ;; and REV2 are non-nil, report differences from REV1 to REV2. If ;; REV1 is nil, use the working revision (as found in the -;; repository) as the older revision; if REV2 is nil, use the +;; repository) as the older revision if REV2 is nil as well; +;; otherwise, diff against an empty tree. If REV2 is nil, use the ;; current working-copy contents as the newer revision. This ;; function should pass the value of (vc-switches BACKEND 'diff) to ;; the backend command. It should return a status of either 0 (no -- 2.39.5