emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: VC command for showing outgoing changes


From: Dan Nicolaescu
Subject: Re: VC command for showing outgoing changes
Date: Sun, 6 Dec 2009 00:33:42 -0800 (PST)

Stefan Monnier <address@hidden> 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))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]