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: Sat, 5 Dec 2009 11:52:33 -0800 (PST)

Dan Nicolaescu <address@hidden> writes:

  > Stefan Monnier <address@hidden> writes:
  > 
  >   > > It would be nice to have a VC command for showing the outgoing changes
  >   > > for distributed VC systems (i.e. the log of the changes that will be
  >   > > pushed when you do a VC push).
  >   > > Let's call this method vc-outgoing (name suggestions are welcome).
  >   > 
  >   > I think before that we should have support for a `push' backend 
operation.
  >   > 
  >   > > vc-hg-outgoing does this, but it's only for mercurial, it would be 
good
  >   > > to have a generic method for doing such a thing.
  >   > 
  >   > Agreed.
  >   > 
  >   > > One thing we can do is to create a log-view-base-mode and have
  >   > > log-view-mode and log-view-outgoing-mode derive from this mode, and 
have
  >   > > log-view-mode and log-view-outgoing-mode define their own commands and
  >   > > key bindings.
  >   > 
  >   > Since each backend typically creates its own vc-<foo>-log-view-mode,
  >   > that tend to lead to the need for "multiple inheritance" in
  >   > define-derived-mode.  Given the lack of support for such a monster right
  >   > now, we should probably stick to something simpler, e.g. add
  >   > a log-view-outgoing binary var, behaving kind of like a minor-mode and
  >   > controlling availability of some extra bindings.
  > 
  > 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).
  > Showing diffs works.
  > What keys should we use? C-x v I  and C-x v O ?
  > This will be useful when we switch to bzr...
  > 
  > OK to check in?

Oops, sorry, this time with the diff attached.

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 5 Dec 2009 19:34:55 -0000
@@ -238,6 +238,9 @@ 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.")
+
 ;;;;
 ;;;; Actual code
 ;;;;
@@ -246,6 +249,8 @@ The match group number 1 should match th
 (define-derived-mode log-view-mode special-mode "Log-View"
   "Major mode for browsing CVS log output."
   (setq buffer-read-only t)
+  (when (boundp 'vc-log-view-type)
+    (set (make-local-variable 'log-view-type) vc-log-view-type))
   (set (make-local-variable 'font-lock-defaults) log-view-font-lock-defaults)
   (set (make-local-variable 'beginning-of-defun-function)
        'log-view-beginning-of-defun)
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       5 Dec 2009 19:34:55 -0000
@@ -341,6 +341,16 @@
 ;;   backend does not support limiting the number of entries to show
 ;;   it should return `limit-unsupported'.
 ;;
+;; * 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.
+;;
+;; * 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
@@ -1825,6 +1835,7 @@ checked out in that new branch."
   (when (file-directory-p dir) (setq dir (file-name-as-directory dir)))
   (vc-call-backend (vc-responsible-backend dir)
                   'create-tag dir name branchp)
+  (vc-resynch-buffers-in-directory dir vc-keep-workfiles t)
   (message "Making %s... done" (if branchp "branch" "tag")))
 
 ;;;###autoload
@@ -1845,6 +1856,8 @@ allowed and simply skipped)."
     (message "%s" msg)
     (vc-call-backend (vc-responsible-backend dir)
                     'retrieve-tag dir name update)
+    (when update
+      (vc-resynch-buffers-in-directory dir vc-keep-workfiles t))
     (message "%s" (concat msg "done"))))
 
 ;; Miscellaneous other entry points
@@ -1869,6 +1882,7 @@ Not all VC backends support short logs!"
   ;; buffer can be accessed by the command.
   (let ((dir-present nil)
        (vc-short-log nil)
+       vc-log-view-type
        pl-return)
     (dolist (file files)
       (when (file-directory-p file)
@@ -1877,6 +1891,7 @@ Not all VC backends support short logs!"
          (not (null (if dir-present
                         (memq 'directory vc-log-short-style)
                       (memq 'file vc-log-short-style)))))
+    (setq vc-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))
@@ -1913,6 +1928,34 @@ Not all VC backends support short logs!"
        (setq vc-sentinel-movepoint (point))
        (set-buffer-modified-p nil)))))
 
+(defun vc-incoming-internal (backend remote-location)
+  (let ((buff-name "*vc-incoming*"))
+    (vc-call-backend backend 'incoming buff-name remote-location)
+    (pop-to-buffer buff-name)
+    (vc-exec-after
+     `(let ((inhibit-read-only t)
+           (vc-log-view-type 'incoming))
+       (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)))))
+
+(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)))))
+
 ;;;###autoload
 (defun vc-print-log (&optional working-revision limit)
   "List the change log of the current fileset in a window.
@@ -1965,6 +2008,32 @@ If WORKING-REVISION is non-nil, leave th
     (vc-print-log-internal backend (list rootdir) working-revision limit)))
 
 ;;;###autoload
+(defun vc-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-internal backend remote-location)))
+
+;;;###autoload
+(defun vc-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-outgoing-internal backend remote-location)))
+
+;;;###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    5 Dec 2009 19:34:55 -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-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-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   5 Dec 2009 19:34:56 -0000
@@ -560,6 +560,16 @@ If nil, use the value of `vc-diff-switch
                          "--pretty" "HEAD" "--")))
         (when limit 'limit-unsupported))))
 
+(defun vc-git-outgoing (buffer remote-location)
+  (interactive)
+  (vc-git-command
+   buffer 0 nil
+   "log" "--date=short" "--pretty=format:%h  %ad  %s" "--abbrev-commit"
+   (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)
@@ -574,11 +584,11 @@ If nil, use the value of `vc-diff-switch
   (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 (memq log-view-type '(short outgoing))
         "^\\(?:[*/\\| ]+ \\)?\\([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   5 Dec 2009 19:34:56 -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-incoming (buffer remote-location)
+  (apply 'vc-bzr-command "missing" buffer 'async nil
+        (list "--theirs-only" (unless (string= remote-location "") 
remote-location))))
+
+(defun vc-bzr-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]