diff --git a/doc/emacs/vc1-xtra.texi b/doc/emacs/vc1-xtra.texi index 655402b61ba..2bb695025db 100644 --- a/doc/emacs/vc1-xtra.texi +++ b/doc/emacs/vc1-xtra.texi @@ -303,17 +303,26 @@ Display diffs of changes to the VC fileset since the merge base of this branch and its upstream counterpart (@code{vc-diff-outgoing-base}). @item C-x v T D -Display all changes since the merge base of this branch and its upstream -counterpart (@code{vc-root-diff-outgoing-base}). +Display a diff of all changes since the merge base of this branch and +its upstream counterpart (@code{vc-root-diff-outgoing-base}). + +@item C-x v T l +Display log messages for changes to the VC fileset since the merge base +of this branch and its upstream counterpart +(@code{vc-log-outgoing-base}). + +@item C-x v T L +Display log messages for all changes since the merge base of this branch +and its upstream counterpart (@code{vc-root-log-outgoing-base}). @end table For decentralized version control systems (@pxref{VCS Repositories}), -these commands provide specialized versions of @kbd{C-x v M D} (see -@pxref{Merge Bases}) which also take into account the state of upstream -repositories. These commands are useful both when working on a single -branch and when developing features on a separate branch -(@pxref{Branches}). These two cases are conceptually distinct, and so -we will introduce them separately. +these commands provide specialized versions of @kbd{C-x v M L} and +@w{@kbd{C-x v M D}} (see @pxref{Merge Bases}) which also take into +account the state of upstream repositories. These commands are useful +both when working on a single branch and when developing features on a +separate branch (@pxref{Branches}). These two cases are conceptually +distinct, and so we will introduce them separately. First, consider working on a single branch. @dfn{Outstanding changes} are those which you haven't yet pushed upstream. This includes both @@ -340,6 +349,16 @@ include uncommitted changes in the reported diffs. Like those other commands, you can use a prefix argument to specify a particular upstream location.} +@kindex C-x v T l +@findex vc-log-outgoing-base +@kindex C-x v T L +@findex vc-root-log-outgoing-base +Type @kbd{C-x v T L} (@code{vc-root-log-outgoing-base}) to display a +summary of the same changes in the form of a revision log; this does not +include uncommitted changes. You can use @kbd{C-x v T l} +(@code{vc-log-outgoing-base}) instead to limit the display of changes to +the current VC fileset. + Second, consider developing a feature on a separate branch. Call this the @dfn{topic branch},@footnote{What we mean by a topic branch is any shorter-lived branch used for work which will later be merged into a @@ -365,7 +384,9 @@ the trunk to which the current branch will be merged. This summary is in the form of a diff of what committing and pushing all the changes, @emph{and} subsequently merging the topic branch, would do to the trunk. As above, you can use @kbd{C-x v T =} instead to limit the display of -changes to the current VC fileset. +changes to the current VC fileset. @kbd{C-x v T L} and @kbd{C-x v T l} +show the corresponding revision logs, excluding uncommitted changes as +above. This functionality relies on Emacs correctly detecting whether the current branch is a trunk or a topic branch, and in the latter case, @@ -379,8 +400,8 @@ The variables @code{vc-trunk-branch-regexps} and @code{vc-topic-branch-regexps} contain lists of regular expressions matching the names of branches that should always be considered trunk and topic branches, respectively. You can also specify prefix arguments -to @kbd{C-x v T D} and @kbd{C-x v T =}. Here is a summary of how to use -these controls: +to @kbd{C-x v T @dots{}}. Here is a summary of how to use these +controls: @enumerate @item diff --git a/etc/NEWS b/etc/NEWS index 4af778c990c..99fc1754bad 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2745,13 +2745,15 @@ include were committed and will be pushed. current VC fileset. +++ -*** New commands to report diffs of outstanding changes. +*** New commands to report information about outstanding changes. 'C-x v T =' ('vc-diff-outgoing-base') and 'C-x v T D' ('vc-root-diff-outgoing-base') report diffs of changes since the merge base with the remote branch, including uncommitted changes. -They are useful to view all outstanding (unmerged, unpushed) changes on -the current branch. -They are also available as 'T =' and 'T D' in VC-Dir buffers. +'C-x v T l' ('vc-log-outgoing-base') and 'C-x v T L' +('vc-root-log-outgoing-base') show the corresponding revision logs. +These are useful to view all outstanding (unmerged, unpushed) changes on +the current branch. They are also available as 'T =', 'T D', 'T l' and +'T L' in VC-Dir buffers. +++ *** New user option 'vc-use-incoming-outgoing-prefixes'. diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index b9176d8a2f6..5781ddc45d9 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -397,6 +397,8 @@ That is, refreshing the VC-Dir buffer also hides `up-to-date' and (define-key map (kbd "M-s a M-C-s") #'vc-dir-isearch-regexp) (define-key map "G" #'vc-dir-ignore) (define-key map "@" #'vc-revert) + (define-key map "Tl" #'vc-log-outgoing-base) + (define-key map "TL" #'vc-root-log-outgoing-base) (define-key map "T=" #'vc-diff-outgoing-base) (define-key map "TD" #'vc-root-diff-outgoing-base) diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el index a6e07e02de9..f3519465c07 100644 --- a/lisp/vc/vc-hooks.el +++ b/lisp/vc/vc-hooks.el @@ -1018,6 +1018,8 @@ In the latter case, VC mode is deactivated for this buffer." "O" #'vc-root-log-outgoing "M L" #'vc-log-mergebase "M D" #'vc-diff-mergebase + "T l" #'vc-log-outgoing-base + "T L" #'vc-root-log-outgoing-base "T =" #'vc-diff-outgoing-base "T D" #'vc-root-diff-outgoing-base "m" #'vc-merge diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index cc3aa2d7f01..770906ff6cc 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -3403,6 +3403,63 @@ When called from Lisp, optional argument FILESET overrides the fileset." nil (called-interactively-p 'interactive)))) +;;;###autoload +(defun vc-log-outgoing-base (&optional upstream-location fileset) + "Show log for the VC fileset since the merge base with UPSTREAM-LOCATION. +The merge base with UPSTREAM-LOCATION means the common ancestor of the +working revision and UPSTREAM-LOCATION. + +When unspecified, UPSTREAM-LOCATION is the outgoing base. +For a trunk branch this is always the place \\[vc-push] would push to. +For a topic branch, query the backend for an appropriate outgoing base. +See `vc-trunk-branch-regexps' and `vc-topic-branch-regexps' regarding +the difference between trunk and topic branches. + +When called interactively with a prefix argument, prompt for +UPSTREAM-LOCATION. In some version control systems, UPSTREAM-LOCATION +can be a remote branch name. + +When called interactively with a \\[universal-argument] \\[universal-argument] \ +prefix argument, always +use the place to which \\[vc-push] would push to as the outgoing base, +i.e., treat this branch as a trunk branch even if Emacs thinks it is a +topic branch. + +When called from Lisp, optional argument FILESET overrides the fileset." + (interactive (let ((fileset (vc-deduce-fileset t))) + (list (vc--maybe-read-outgoing-base (car fileset)) + fileset))) + (let* ((fileset (or fileset (vc-deduce-fileset t))) + (backend (car fileset))) + (vc-print-log-internal backend (cadr fileset) nil nil + (vc--outgoing-base-mergebase backend + upstream-location)))) + +;;;###autoload +(defun vc-root-log-outgoing-base (&optional upstream-location) + "Show log of revisions since the merge base with UPSTREAM-LOCATION. +The merge base with UPSTREAM-LOCATION means the common ancestor of the +working revision and UPSTREAM-LOCATION. + +When unspecified, UPSTREAM-LOCATION is the outgoing base. +For a trunk branch this is always the place \\[vc-push] would push to. +For a topic branch, query the backend for an appropriate outgoing base. +See `vc-trunk-branch-regexps' and `vc-topic-branch-regexps' regarding +the difference between trunk and topic branches. + +When called interactively with a prefix argument, prompt for +UPSTREAM-LOCATION. In some version control systems, UPSTREAM-LOCATION +can be a remote branch name. + +When called interactively with a \\[universal-argument] \\[universal-argument] \ +prefix argument, always +use the place to which \\[vc-push] would push to as the outgoing base, +i.e., treat this branch as a trunk branch even if Emacs thinks it is a +topic branch." + (interactive (list (vc--maybe-read-outgoing-base))) + (vc--with-backend-in-rootdir "VC revision log" + (vc-log-outgoing-base upstream-location `(,backend (,rootdir))))) + (declare-function ediff-load-version-control "ediff" (&optional silent)) (declare-function ediff-vc-internal "ediff-vers" (rev1 rev2 &optional startup-hooks))