diff --git a/etc/NEWS b/etc/NEWS index 9cf3c626449..0ecd911633c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1809,6 +1809,12 @@ This replaces and generalizes the old 'vc-annotate-parent-rev'. --- *** vc-dav.el is now obsolete. +--- +*** The 'log-incoming' and 'log-outgoing' functions are deprecated. +Backend authors should implement the 'incoming-revision' and 'mergebase' +backend functions instead. These are jointly sufficient to support the +'C-x v I' and 'C-x v O' commands. + ** Diff mode +++ diff --git a/lisp/vc/vc-bzr.el b/lisp/vc/vc-bzr.el index 392c2b04377..f345a1b2779 100644 --- a/lisp/vc/vc-bzr.el +++ b/lisp/vc/vc-bzr.el @@ -816,6 +816,7 @@ If LIMIT is non-nil, show no more than this many entries." (indent-region (match-end 0) (point-max) 2) (buffer-substring (match-end 0) (point-max))))) +;; FIXME: Implement `vc-bzr-mergebase' and then delete this. (defun vc-bzr-log-incoming (buffer remote-location) (apply #'vc-bzr-command "missing" buffer 'async nil (list "--theirs-only" (and (not (string-empty-p remote-location)) @@ -832,6 +833,7 @@ If LIMIT is non-nil, show no more than this many entries." (and (re-search-forward "^revision-id: " nil t) (buffer-substring (point) (pos-eol))))) +;; FIXME: Implement `vc-bzr-mergebase' and then delete this. (defun vc-bzr-log-outgoing (buffer remote-location) (apply #'vc-bzr-command "missing" buffer 'async nil (list "--mine-only" (and (not (string-empty-p remote-location)) diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index f460eafacbf..a0f64163470 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -70,8 +70,7 @@ ;; - get-change-comment (files rev) OK ;; HISTORY FUNCTIONS ;; * print-log (files buffer &optional shortlog start-revision limit) OK -;; * log-outgoing (buffer remote-location) OK -;; * log-incoming (buffer remote-location) OK +;; * incoming-revision (remote-location) OK ;; - log-search (buffer pattern) OK ;; - log-view-mode () OK ;; - show-log-entry (revision) OK @@ -1577,41 +1576,12 @@ If LIMIT is a revision string, use it as an end-revision." (list "-p")) '("--"))))))) -(defun vc-git-log-outgoing (buffer remote-location) - (vc-setup-buffer buffer) - (apply #'vc-git-command buffer 'async nil - `("log" - "--no-color" "--graph" "--decorate" "--date=short" - ,(format "--pretty=tformat:%s" (car vc-git-root-log-format)) - "--abbrev-commit" - ,@(ensure-list vc-git-shortlog-switches) - ,(concat (if (string-empty-p remote-location) - "@{upstream}" - remote-location) - "..HEAD")))) - -(defun vc-git--fetch-incoming (remote-location) +(defun vc-git-incoming-revision (remote-location) (vc-git-command nil 0 nil "fetch" (and (not (string-empty-p remote-location)) ;; Extract remote from "remote/branch". (replace-regexp-in-string "/.*" "" - remote-location)))) - -(defun vc-git-log-incoming (buffer remote-location) - (vc-setup-buffer buffer) - (vc-git--fetch-incoming remote-location) - (apply #'vc-git-command buffer 'async nil - `("log" - "--no-color" "--graph" "--decorate" "--date=short" - ,(format "--pretty=tformat:%s" (car vc-git-root-log-format)) - "--abbrev-commit" - ,@(ensure-list vc-git-shortlog-switches) - ,(concat "HEAD.." (if (string-empty-p remote-location) - "@{upstream}" - remote-location))))) - -(defun vc-git-incoming-revision (remote-location) - (vc-git--fetch-incoming remote-location) + remote-location))) (ignore-errors ; in order to return nil if no such branch (with-output-to-string (vc-git-command standard-output 0 nil diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el index e1527935861..04a85fadd92 100644 --- a/lisp/vc/vc-hg.el +++ b/lisp/vc/vc-hg.el @@ -1458,6 +1458,7 @@ This runs the command \"hg summary\"." (nreverse result)) "\n")))) +;; FIXME: Resolve issue with `vc-hg-mergebase' and then delete this. (defun vc-hg-log-incoming (buffer remote-location) (vc-setup-buffer buffer) (vc-hg-command buffer 1 nil "incoming" "-n" @@ -1475,12 +1476,23 @@ This runs the command \"hg summary\"." (and (not (string-empty-p output)) output))) +;; FIXME: Resolve issue with `vc-hg-mergebase' and then delete this. (defun vc-hg-log-outgoing (buffer remote-location) (vc-setup-buffer buffer) (vc-hg-command buffer 1 nil "outgoing" "-n" (and (not (string-empty-p remote-location)) remote-location))) +;; FIXME: This works only when both rev1 and rev2 have already been pulled. +;; That means it can't do the work +;; `vc-default-log-incoming' and `vc-default-log-outgoing' need it to do. +(defun vc-hg-mergebase (rev1 &optional rev2) + (or (vc-hg--run-log "{node}" + (format "last(ancestors(%s) and ancestors(%s))" + rev1 (or rev2 "tip")) + nil) + (error "No common ancestor for merge base"))) + (defvar vc-hg-error-regexp-alist '(("^M \\(.+\\)" 1 nil nil 0)) "Value of `compilation-error-regexp-alist' in *vc-hg* buffers.") diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 67b7fbd9232..f51bd2b85b3 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -347,15 +347,17 @@ ;; revision shown, rather than the working revision, which is normally ;; the case). Not all backends support this. ;; -;; * log-outgoing (buffer remote-location) +;; - log-outgoing (buffer remote-location) (DEPRECATED) ;; ;; Insert in BUFFER the revision log for the changes that will be ;; sent when performing a push operation to REMOTE-LOCATION. +;; Deprecated: implement incoming-revision and mergebase instead. ;; -;; * log-incoming (buffer remote-location) +;; - log-incoming (buffer remote-location) (DEPRECATED) ;; ;; Insert in BUFFER the revision log for the changes that will be ;; received when performing a pull operation from REMOTE-LOCATION. +;; Deprecated: implement incoming-revision and mergebase instead. ;; ;; * incoming-revision (remote-location) ;; @@ -3252,6 +3254,16 @@ In some version control systems REMOTE-LOCATION can be a remote branch name." (vc-incoming-outgoing-internal backend (or remote-location "") "*vc-incoming*" 'log-incoming))) +(defun vc-default-log-incoming (_backend buffer remote-location) + (vc--with-backend-in-rootdir "" + (let ((incoming (or (vc-call-backend backend + 'incoming-revision + remote-location) + (user-error "No incoming revision -- local-only branch?")))) + (vc-call-backend backend 'print-log (list rootdir) buffer t + (vc-call-backend backend 'mergebase incoming) + incoming)))) + ;;;###autoload (defun vc-log-outgoing (&optional remote-location) "Show log of changes that will be sent with a push operation to REMOTE-LOCATION. @@ -3264,6 +3276,16 @@ In some version control systems REMOTE-LOCATION can be a remote branch name." (vc-incoming-outgoing-internal backend (or remote-location "") "*vc-outgoing*" 'log-outgoing))) +(defun vc-default-log-outgoing (_backend buffer remote-location) + (vc--with-backend-in-rootdir "" + (let ((incoming (or (vc-call-backend backend + 'incoming-revision + remote-location) + (user-error "No incoming revision -- local-only branch?")))) + (vc-call-backend backend 'print-log (list rootdir) buffer t + (vc-call-backend backend 'mergebase incoming) + "")))) + ;;;###autoload (defun vc-log-search (pattern) "Search the VC log of changes for PATTERN and show log of matching changes. diff --git a/test/lisp/vc/vc-tests/vc-tests.el b/test/lisp/vc/vc-tests/vc-tests.el index 632a6a792bd..e8aaa070018 100644 --- a/test/lisp/vc/vc-tests/vc-tests.el +++ b/test/lisp/vc/vc-tests/vc-tests.el @@ -69,8 +69,8 @@ ;; HISTORY FUNCTIONS ;; ;; * print-log (files buffer &optional shortlog start-revision limit) -;; * log-outgoing (backend remote-location) -;; * log-incoming (backend remote-location) +;; - log-outgoing (backend remote-location) +;; - log-incoming (backend remote-location) ;; - log-view-mode () ;; - show-log-entry (revision) ;; - comment-history (file)