From: Dan Nicolaescu <dann@ics.uci.edu>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: VC command for showing outgoing changes
Date: Sun, 6 Dec 2009 00:33:42 -0800 (PST) [thread overview]
Message-ID: <200912060833.nB68XgjU025891@godzilla.ics.uci.edu> (raw)
In-Reply-To: <jwvd42tnp2z.fsf-monnier+emacs@gnu.org> (Stefan Monnier's message of "Sat, 05 Dec 2009 15:53:03 -0500")
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> >> Here's a patch that implements the generic vc-incoming, vc-outgoing and
> >> implements the backend specific functions for bzr, hg and partially for
> >> git (no incoming and outgoing is not quite right).
>
> I'd call them vc-log-incoming and vc-log-outgoing, to make it clear that
> it shows this info in the form of a changelog (we could also have
> vc-diff-incoming, vc-diff-outgoing, for example).
OK.
> [ Another option might be to specify the `outgoing' or `incoming' as
> arguments to vc-print-log or vc-diff. Basically your `vc-(in|out)going'
> is like (vc-print-log from-upstream to working-revision). ]
That looks like it would make vc-print-log more complex and would make
this feature harder to find.
How about key bindings?
> > +(defun vc-outgoing-internal (backend remote-location)
> > + (let ((buff-name "*vc-outgoing*"))
> > + (vc-call-backend backend 'outgoing buff-name remote-location)
> > + (pop-to-buffer buff-name)
> > + (vc-exec-after
> > + `(let ((inhibit-read-only t)
> > + (vc-log-view-type 'outgoing))
> > + (vc-call-backend ',backend 'log-view-mode)
> > + (set (make-local-variable 'log-view-vc-backend) ',backend)
> > + (set (make-local-variable 'log-view-vc-fileset) nil)
> > + (shrink-window-if-larger-than-buffer)
> > + (setq vc-sentinel-movepoint (point))
> > + (set-buffer-modified-p nil)))))
>
> The redundancy between these two functions is bad. Worse: there's
It's mostly an effect of how this was done: I just did outgoing, and
before sending this email copied + replaced outgoing->incoming as it was
the quickest way to get it done.
> redundancy between this duplicate code and vc-print-log-internal as
> well, some of what is different is a bug:
> (vc-call-backend ',backend 'log-view-mode) should be called before
> `vc-exec-after', as seen in vc-print-log-internal.
That change came after I wrote vc-outgoing-internal...
> Also incoming/outgoing will probably want to obey vc-log-short-style, so
> we really want to use as much of vc-print-log-internal as possible here.
It won't work: outgoing/incoming are project wide, so the directory vs
file logic used for vc-log-short-style does not apply.
> > -(defvar vc-short-log)
> > +(defvar log-view-type)
>
> > (define-derived-mode vc-hg-log-view-mode log-view-mode "Hg-Log-View"
> > (require 'add-log) ;; we need the add-log faces
> > (set (make-local-variable 'log-view-file-re) "\\`a\\`")
> > (set (make-local-variable 'log-view-per-file-logs) nil)
> > (set (make-local-variable 'log-view-message-re)
> > - (if vc-short-log
> > + (if (eq log-view-type 'short)
> > "^\\([0-9]+\\)\\(?:\\[.*\\]\\)? +\\([0-9a-z]\\{12\\}\\) +\\(\\(?:[0-9]+\\)-\\(?:[0-9]+\\)-\\(?:[0-9]+\\) \\(?:[0-9]+\\):\\(?:[0-9]+\\) \\(?:[-+0-9]+\\)\\) +\\(.*\\)$"
> j
> Ah, so that's why you use dynamic-scoping for log-view-type, so it's
> available while setting up the major-mode.
>
> Hmm...
Exactly it's ugly, and it was already used by the short log mechanism.
> And there's another related problem:
>
> > + (if (memq log-view-type '(short outgoing))
This part is gone now, I let git use the default (i.e. long) log format.
> This is becoming very ad-hoc. I think the right answer is to let the
> print-log backend operation set something up that the log-view-mode
> operation can use subsequently. I.e. remove `log-view-mode' from the
> generic part of the code, and let the backend set some permanent-local
> variable in `print-log' to tell the subsequent `log-view-mode' which
> kind of log to expect.
Now there's a permanent-local variable `log-view-type', the values used
for it are 'long 'short 'log-outgoing 'log-incoming. Currently only
'short is used in any logic.
It would be nice if log-view-mode had an optional parameter to pass
this info. But maybe adding optional arguments to major modes is a big no-no.
> We could still define a generic `log-view-type' or `log-view-format'
> variable for it, tho. The idea is that the generic part of the code may
> want to use it, e.g. to display it in the mode-line (and let button-2
> run a command that changes the format to something else). But it should
> be set by the backend's `print-log' operation rather than by the
> generic code.
Why should the backend set this? It looks more cumbersome if all
backends had to take care of doing it.
Here's an updated patch.
OK?
Index: log-view.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/log-view.el,v
retrieving revision 1.64
diff -u -3 -p -r1.64 log-view.el
--- log-view.el 4 Dec 2009 16:34:27 -0000 1.64
+++ log-view.el 6 Dec 2009 08:03:22 -0000
@@ -238,6 +238,11 @@ The match group number 1 should match th
(defvar log-view-vc-backend nil
"Set this to the VC backend that created the current log.")
+(defvar log-view-type nil
+ "Set this to differentiate the different types of logs.")
+(put 'log-view-type 'permanent-local t)
+
+
;;;;
;;;; Actual code
;;;;
Index: vc.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/vc.el,v
retrieving revision 1.745
diff -u -3 -p -r1.745 vc.el
--- vc.el 3 Dec 2009 19:12:55 -0000 1.745
+++ vc.el 6 Dec 2009 08:03:24 -0000
@@ -341,6 +341,16 @@
;; backend does not support limiting the number of entries to show
;; it should return `limit-unsupported'.
;;
+;; * log-outgoing (backend remote-location)
+;;
+;; Insert in BUFFER the revision log for the changes that will be
+;; sent when performing a push operation to REMOTE-LOCATION.
+;;
+;; * log-incoming (backend remote-location)
+;;
+;; Insert in BUFFER the revision log for the changes that will be
+;; received when performing a pull operation from REMOTE-LOCATION.
+;;
;; - log-view-mode ()
;;
;; Mode to use for the output of print-log. This defaults to
@@ -1878,6 +1891,8 @@ Not all VC backends support short logs!"
(memq 'directory vc-log-short-style)
(memq 'file vc-log-short-style)))))
+ (with-current-buffer (get-buffer-create "*vc-change-log*")
+ (set (make-local-variable 'log-view-type) (if vc-short-log 'short 'long)))
(setq pl-return (vc-call-backend backend 'print-log files "*vc-change-log*"
vc-short-log limit))
(pop-to-buffer "*vc-change-log*")
@@ -1913,6 +1928,22 @@ Not all VC backends support short logs!"
(setq vc-sentinel-movepoint (point))
(set-buffer-modified-p nil)))))
+(defun vc-incoming-outgoing-internal (backend remote-location buffer-name type)
+ (with-current-buffer (get-buffer-create buffer-name)
+ (set (make-local-variable 'log-view-type) type))
+ (vc-call-backend backend type buffer-name remote-location)
+ (pop-to-buffer buffer-name)
+ (let ((inhibit-read-only t))
+ (vc-call-backend backend 'log-view-mode)
+ (set (make-local-variable 'log-view-vc-backend) backend)
+ (set (make-local-variable 'log-view-vc-fileset) nil))
+ (vc-exec-after
+ `(let ((inhibit-read-only t))
+ (shrink-window-if-larger-than-buffer)
+ (goto-char (point-min))
+ (setq vc-sentinel-movepoint (point))
+ (set-buffer-modified-p nil))))
+
;;;###autoload
(defun vc-print-log (&optional working-revision limit)
"List the change log of the current fileset in a window.
@@ -1965,6 +1996,32 @@ If WORKING-REVISION is non-nil, leave th
(vc-print-log-internal backend (list rootdir) working-revision limit)))
;;;###autoload
+(defun vc-log-incoming (&optional remote-location)
+ "Show a log of changes that will be received with a pull operation from REMOTE-LOCATION."
+ (interactive "sRemote location (empty for default): ")
+ (let ((backend
+ (cond ((derived-mode-p 'vc-dir-mode) vc-dir-backend)
+ ((derived-mode-p 'dired-mode) (vc-responsible-backend default-directory))
+ (vc-mode (vc-backend buffer-file-name))))
+ rootdir working-revision)
+ (unless backend
+ (error "Buffer is not version controlled"))
+ (vc-incoming-outgoing-internal backend remote-location "*vc-incoming*" 'log-incoming)))
+
+;;;###autoload
+(defun vc-log-outgoing (&optional remote-location)
+ "Show a log of changes that will be sent with a push operation to REMOTE-LOCATION."
+ (interactive "sRemote location (empty for default): ")
+ (let ((backend
+ (cond ((derived-mode-p 'vc-dir-mode) vc-dir-backend)
+ ((derived-mode-p 'dired-mode) (vc-responsible-backend default-directory))
+ (vc-mode (vc-backend buffer-file-name))))
+ rootdir working-revision)
+ (unless backend
+ (error "Buffer is not version controlled"))
+ (vc-incoming-outgoing-internal backend remote-location "*vc-outgoing*" 'log-outgoing)))
+
+;;;###autoload
(defun vc-revert ()
"Revert working copies of the selected fileset to their repository contents.
This asks for confirmation if the buffer contents are not identical
Index: vc-hg.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/vc-hg.el,v
retrieving revision 1.107
diff -u -3 -p -r1.107 vc-hg.el
--- vc-hg.el 18 Nov 2009 19:12:26 -0000 1.107
+++ vc-hg.el 6 Dec 2009 08:03:24 -0000
@@ -239,18 +239,18 @@ If nil, use the value of `vc-diff-switch
(defvar log-view-file-re)
(defvar log-view-font-lock-keywords)
(defvar log-view-per-file-logs)
-(defvar vc-short-log)
+(defvar log-view-type)
(define-derived-mode vc-hg-log-view-mode log-view-mode "Hg-Log-View"
(require 'add-log) ;; we need the add-log faces
(set (make-local-variable 'log-view-file-re) "\\`a\\`")
(set (make-local-variable 'log-view-per-file-logs) nil)
(set (make-local-variable 'log-view-message-re)
- (if vc-short-log
+ (if (eq log-view-type 'short)
"^\\([0-9]+\\)\\(?:\\[.*\\]\\)? +\\([0-9a-z]\\{12\\}\\) +\\(\\(?:[0-9]+\\)-\\(?:[0-9]+\\)-\\(?:[0-9]+\\) \\(?:[0-9]+\\):\\(?:[0-9]+\\) \\(?:[-+0-9]+\\)\\) +\\(.*\\)$"
"^changeset:[ \t]*\\([0-9]+\\):\\(.+\\)"))
(set (make-local-variable 'log-view-font-lock-keywords)
- (if vc-short-log
+ (if (eq log-view-type 'short)
(append `((,log-view-message-re
(1 'log-view-message-face)
(2 'log-view-message-face)
@@ -567,21 +567,11 @@ REV is the revision to check out into WO
`("Hg-incoming"
["Pull selected" vc-hg-pull]))
-(defun vc-hg-outgoing ()
- (interactive)
- (let ((bname "*Hg outgoing*")
- (vc-short-log nil))
- (vc-hg-command bname 1 nil "outgoing" "-n")
- (pop-to-buffer bname)
- (vc-hg-outgoing-mode)))
+(defun vc-hg-log-incoming (buffer remote-location)
+ (vc-hg-command buffer 1 nil "incoming" "-n" remote-location))
-(defun vc-hg-incoming ()
- (interactive)
- (let ((bname "*Hg incoming*")
- (vc-short-log nil))
- (vc-hg-command bname 0 nil "incoming" "-n")
- (pop-to-buffer bname)
- (vc-hg-incoming-mode)))
+(defun vc-hg-log-outgoing (buffer remote-location)
+ (vc-hg-command buffer 1 nil "outgoing" "-n" remote-location))
(declare-function log-view-get-marked "log-view" ())
Index: vc-git.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/vc-git.el,v
retrieving revision 1.102
diff -u -3 -p -r1.102 vc-git.el
--- vc-git.el 3 Dec 2009 04:08:12 -0000 1.102
+++ vc-git.el 6 Dec 2009 08:03:25 -0000
@@ -560,25 +560,30 @@ If nil, use the value of `vc-diff-switch
"--pretty" "HEAD" "--")))
(when limit 'limit-unsupported))))
+(defun vc-git-log-outgoing (buffer remote-location)
+ (interactive)
+ (vc-git-command
+ buffer 0 nil
+ "log" (if (string= remote-location "")
+ "origin/master..HEAD"
+ remote-location)))
+
(defvar log-view-message-re)
(defvar log-view-file-re)
(defvar log-view-font-lock-keywords)
(defvar log-view-per-file-logs)
-;; Dynamically bound.
-(defvar vc-short-log)
-
(define-derived-mode vc-git-log-view-mode log-view-mode "Git-Log-View"
(require 'add-log) ;; we need the faces add-log
;; Don't have file markers, so use impossible regexp.
(set (make-local-variable 'log-view-file-re) "\\`a\\`")
(set (make-local-variable 'log-view-per-file-logs) nil)
(set (make-local-variable 'log-view-message-re)
- (if vc-short-log
+ (if (eq log-view-type 'short)
"^\\(?:[*/\\| ]+ \\)?\\([0-9a-z]+\\) \\([-a-z0-9]+\\) \\(.*\\)"
"^commit *\\([0-9a-z]+\\)"))
(set (make-local-variable 'log-view-font-lock-keywords)
- (if vc-short-log
+ (if (memq log-view-type '(short outgoing))
(append
`((,log-view-message-re
(1 'change-log-acknowledgement)
Index: vc-bzr.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/vc-bzr.el,v
retrieving revision 1.89
diff -u -3 -p -r1.89 vc-bzr.el
--- vc-bzr.el 3 Dec 2009 08:53:06 -0000 1.89
+++ vc-bzr.el 6 Dec 2009 08:03:26 -0000
@@ -453,7 +453,6 @@ REV non-nil gets an error."
(defvar log-view-font-lock-keywords)
(defvar log-view-current-tag-function)
(defvar log-view-per-file-logs)
-(defvar vc-short-log)
(define-derived-mode vc-bzr-log-view-mode log-view-mode "Bzr-Log-View"
(remove-hook 'log-view-mode-hook 'vc-bzr-log-view-mode) ;Deactivate the hack.
@@ -461,13 +460,13 @@ REV non-nil gets an error."
(set (make-local-variable 'log-view-per-file-logs) nil)
(set (make-local-variable 'log-view-file-re) "\\`a\\`")
(set (make-local-variable 'log-view-message-re)
- (if vc-short-log
+ (if (eq log-view-type 'short)
"^ +\\([0-9]+\\) \\(.*?\\)[ \t]+\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\}\\)\\( \\[merge\\]\\)?"
"^ *\\(?:revno: \\([0-9.]+\\)\\|merged: .+\\)"))
(set (make-local-variable 'log-view-font-lock-keywords)
;; log-view-font-lock-keywords is careful to use the buffer-local
;; value of log-view-message-re only since Emacs-23.
- (if vc-short-log
+ (if (eq log-view-type 'short)
(append `((,log-view-message-re
(1 'log-view-message-face)
(2 'change-log-name)
@@ -500,6 +499,14 @@ REV non-nil gets an error."
(list vc-bzr-log-switches)
vc-bzr-log-switches)))))
+(defun vc-bzr-log-incoming (buffer remote-location)
+ (apply 'vc-bzr-command "missing" buffer 'async nil
+ (list "--theirs-only" (unless (string= remote-location "") remote-location))))
+
+(defun vc-bzr-log-outgoing (buffer remote-location)
+ (apply 'vc-bzr-command "missing" buffer 'async nil
+ (list "--mine-only" (unless (string= remote-location "") remote-location))))
+
(defun vc-bzr-show-log-entry (revision)
"Find entry for patch name REVISION in bzr change log buffer."
(goto-char (point-min))
next prev parent reply other threads:[~2009-12-06 8:33 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-13 20:24 VC command for showing outgoing changes Dan Nicolaescu
2009-10-13 20:52 ` Stefan Monnier
2009-10-13 21:15 ` Dan Nicolaescu
2009-10-13 21:24 ` Giorgos Keramidas
2009-10-14 2:10 ` Stefan Monnier
2009-12-05 19:45 ` Dan Nicolaescu
2009-12-05 19:52 ` Dan Nicolaescu
2009-12-05 20:53 ` Stefan Monnier
2009-12-05 21:35 ` Stefan Monnier
2009-12-06 3:28 ` Dan Nicolaescu
2009-12-06 8:33 ` Dan Nicolaescu [this message]
2009-12-07 1:40 ` Stefan Monnier
2009-12-07 9:06 ` Dan Nicolaescu
2010-01-01 18:56 ` Dan Nicolaescu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200912060833.nB68XgjU025891@godzilla.ics.uci.edu \
--to=dann@ics.uci.edu \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).