unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Dan Nicolaescu <dann@ics.uci.edu>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: VC top of the tree diff and log
Date: Sat, 29 Aug 2009 12:13:09 -0700 (PDT)	[thread overview]
Message-ID: <200908291913.n7TJD9wq003979@godzilla.ics.uci.edu> (raw)
In-Reply-To: <200907300718.n6U7I3pi027881@godzilla.ics.uci.edu> (Dan Nicolaescu's message of "Thu, 30 Jul 2009 00:18:03 -0700 (PDT)")

Dan Nicolaescu <dann@ics.uci.edu> writes:

  > Dan Nicolaescu <dann@ics.uci.edu> writes:
  > 
  >   > Stefan Monnier <monnier@iro.umontreal.ca> writes:
  >   > 
  >   >   > > Key bindings:
  >   >   > > for log we could have C-x v L  (should be intuitive given that
  >   >   > > vc-print-log uses C-x v l)
  >   >   > 
  >   >   > It might be a good idea.
  >   >   > 
  >   >   > > not sure what would be a good one for diff
  >   >   > 
  >   >   > I don't understand: why not just use the capitalized = sign?
  >   > 
  >   > Sorry, I probably use one of those antique keyboards that don't have
  >   > such a sign...
  >   > 
  >   > See what I currently have.  What do you think?
  > 
  > Here's an updated version that implements both top of the tree log and
  > diff and adds an option to show short logs.  
  > As it is now it short logs will be shown when a directory is present in
  > the fileset.  Adding `file' to `vc-log-short-style' will make C-x v l
  > show short logs for files too.
  > 
  > vc-git.el was changed to support short logs, and vc-cvs.el to ignore the
  > extra option (all vc backends need a similar change)
  > 
  > WDYT?

Ping. 

Any reason not to install this?

  > Index: vc-cvs.el
  > ===================================================================
  > RCS file: /cvsroot/emacs/emacs/lisp/vc-cvs.el,v
  > retrieving revision 1.165
  > diff -u -3 -p -r1.165 vc-cvs.el
  > --- vc-cvs.el	7 Jul 2009 15:06:03 -0000	1.165
  > +++ vc-cvs.el	30 Jul 2009 06:57:41 -0000
  > @@ -492,7 +492,7 @@ Will fail unless you have administrative
  >  ;;; History functions
  >  ;;;
  >  
  > -(defun vc-cvs-print-log (files &optional buffer)
  > +(defun vc-cvs-print-log (files &optional buffer shortlog)
  >    "Get change logs associated with FILES."
  >    ;; It's just the catenation of the individual logs.
  >    (vc-cvs-command
  > Index: vc-git.el
  > ===================================================================
  > RCS file: /cvsroot/emacs/emacs/lisp/vc-git.el,v
  > retrieving revision 1.85
  > diff -u -3 -p -r1.85 vc-git.el
  > --- vc-git.el	28 Jul 2009 08:06:40 -0000	1.85
  > +++ vc-git.el	30 Jul 2009 06:57:41 -0000
  > @@ -77,7 +77,7 @@
  >  ;; - merge-news (file)			   see `merge'
  >  ;; - steal-lock (file &optional revision)	   NOT NEEDED
  >  ;; HISTORY FUNCTIONS
  > -;; * print-log (files &optional buffer)		   OK
  > +;; * print-log (files &optional buffer shortlog)   OK
  >  ;; - log-view-mode ()				   OK
  >  ;; - show-log-entry (revision)			   OK
  >  ;; - comment-history (file)			   ??
  > @@ -460,7 +460,7 @@ If nil, use the value of `vc-diff-switch
  >  
  >  ;;; HISTORY FUNCTIONS
  >  
  > -(defun vc-git-print-log (files &optional buffer)
  > +(defun vc-git-print-log (files &optional buffer shortlog)
  >    "Get change log associated with FILES."
  >    (let ((coding-system-for-read git-commits-coding-system)
  >  	;; Support both the old print-log interface that passes a
  > @@ -474,43 +474,59 @@ If nil, use the value of `vc-diff-switch
  >      (let ((inhibit-read-only t))
  >        (with-current-buffer
  >            buffer
  > -	(vc-git-command buffer 'async files
  > -			"rev-list" "--pretty" "HEAD" "--")))))
  > +	(if shortlog
  > +	    (vc-git-command buffer 'async files
  > +			    "log" "--graph"
  > +			    "--date=short" "--pretty=format:%h  %ad  %s" "--abbrev-commit"
  > +			    "--")
  > +	  (vc-git-command buffer 'async files
  > +			  "rev-list" "--graph" "--pretty" "HEAD" "--"))))))
  >  
  >  (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)
  > -       "^commit *\\([0-9a-z]+\\)")
  > +       (if vc-short-log
  > +	 "^[*/\\| ]+ \\([0-9a-z]+\\)  \\([-a-z0-9]+\\)  \\(.*\\)"
  > +	 "^[ */\\|]+commit *\\([0-9a-z]+\\)"))
  >    (set (make-local-variable 'log-view-font-lock-keywords)
  > -       (append
  > -        `((,log-view-message-re  (1 'change-log-acknowledgement)))
  > -        ;; Handle the case:
  > -        ;; user: foo@bar
  > -        '(("^Author:[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
  > -           (1 'change-log-email))
  > -          ;; Handle the case:
  > -          ;; user: FirstName LastName <foo@bar>
  > -          ("^Author:[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
  > -           (1 'change-log-name)
  > -           (2 'change-log-email))
  > -          ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
  > -           (1 'change-log-name))
  > -          ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
  > -           (1 'change-log-name)
  > -           (2 'change-log-email))
  > -          ("^Merge: \\([0-9a-z]+\\) \\([0-9a-z]+\\)"
  > -           (1 'change-log-acknowledgement)
  > -           (2 'change-log-acknowledgement))
  > -          ("^Date:   \\(.+\\)" (1 'change-log-date))
  > -          ("^summary:[ \t]+\\(.+\\)" (1 'log-view-message))))))
  > +       (if vc-short-log
  > +	   (append
  > +	    `((,log-view-message-re
  > +	       (1 'change-log-acknowledgement)
  > +	       (2 'change-log-date))))
  > +	 (append
  > +	  `((,log-view-message-re  (1 'change-log-acknowledgement)))
  > +	  ;; Handle the case:
  > +	  ;; user: foo@bar
  > +	  '((" Author:[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
  > +	     (1 'change-log-email))
  > +	    ;; Handle the case:
  > +	    ;; user: FirstName LastName <foo@bar>
  > +	    (" Author:[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
  > +	     (1 'change-log-name)
  > +	     (2 'change-log-email))
  > +	    ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
  > +	     (1 'change-log-name))
  > +	    ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
  > +	     (1 'change-log-name)
  > +	     (2 'change-log-email))
  > +	    (" Merge: \\([0-9a-z]+\\) \\([0-9a-z]+\\)"
  > +	     (1 'change-log-acknowledgement)
  > +	     (2 'change-log-acknowledgement))
  > +	    (" Date:   \\(.+\\)" (1 'change-log-date))
  > +	    (" summary:[ \t]+\\(.+\\)" (1 'log-view-message)))))))
  > +
  >  
  >  (defun vc-git-show-log-entry (revision)
  >    "Move to the log entry for REVISION.
  > Index: vc-hooks.el
  > ===================================================================
  > RCS file: /cvsroot/emacs/emacs/lisp/vc-hooks.el,v
  > retrieving revision 1.279
  > diff -u -3 -p -r1.279 vc-hooks.el
  > --- vc-hooks.el	26 Jun 2009 23:54:00 -0000	1.279
  > +++ vc-hooks.el	30 Jul 2009 06:57:41 -0000
  > @@ -934,6 +934,7 @@ current, and kill the buffer that visits
  >      (define-key map "h" 'vc-insert-headers)
  >      (define-key map "i" 'vc-register)
  >      (define-key map "l" 'vc-print-log)
  > +    (define-key map "L" 'vc-print-root-log)
  >      (define-key map "m" 'vc-merge)
  >      (define-key map "r" 'vc-retrieve-tag)
  >      (define-key map "s" 'vc-create-tag)
  > @@ -941,6 +942,7 @@ current, and kill the buffer that visits
  >      (define-key map "v" 'vc-next-action)
  >      (define-key map "+" 'vc-update)
  >      (define-key map "=" 'vc-diff)
  > +    (define-key map "D" 'vc-root-diff)
  >      (define-key map "~" 'vc-revision-other-window)
  >      map))
  >  (fset 'vc-prefix-map vc-prefix-map)
  > @@ -969,12 +971,18 @@ current, and kill the buffer that visits
  >      (define-key map [vc-diff]
  >        '(menu-item "Compare with Base Version" vc-diff
  >  		  :help "Compare file set with the base version"))
  > +    (define-key map [vc-root-diff]
  > +      '(menu-item "Compare Tree with Base Version" vc-root-diff
  > +		  :help "Compare current tree with the base version"))
  >      (define-key map [vc-update-change-log]
  >        '(menu-item "Update ChangeLog" vc-update-change-log
  >  		  :help "Find change log file and add entries from recent version control logs"))
  >      (define-key map [vc-print-log]
  >        '(menu-item "Show History" vc-print-log
  >  		  :help "List the change log of the current file set in a window"))
  > +    (define-key map [vc-print-root-log]
  > +      '(menu-item "Show Top of the Tree History " vc-print-root-log
  > +		  :help "List the change log for the current tree in a window"))
  >      (define-key map [separator2] '("----"))
  >      (define-key map [vc-insert-header]
  >        '(menu-item "Insert Header" vc-insert-headers
  > Index: vc.el
  > ===================================================================
  > RCS file: /cvsroot/emacs/emacs/lisp/vc.el,v
  > retrieving revision 1.722
  > diff -u -3 -p -r1.722 vc.el
  > --- vc.el	23 Jul 2009 05:41:28 -0000	1.722
  > +++ vc.el	30 Jul 2009 06:57:41 -0000
  > @@ -350,11 +350,12 @@
  >  ;;
  >  ;; HISTORY FUNCTIONS
  >  ;;
  > -;; * print-log (files &optional buffer)
  > +;; * print-log (files &optional buffer shortlog)
  >  ;;
  >  ;;   Insert the revision log for FILES into BUFFER, or the *vc* buffer
  >  ;;   if BUFFER is nil.  (Note: older versions of this function expected
  >  ;;   only a single file argument.)
  > +;;   If SHORTLOG is true insert a short version of the log.
  >  ;;
  >  ;; - log-view-mode ()
  >  ;;
  > @@ -465,6 +466,9 @@
  >  ;;   `revert' operations itself, without calling the backend system.  The
  >  ;;   default implementation always returns nil.
  >  ;;
  > +;; - root (file)
  > +;;   Return the root of the VC controlled hierarchy for file.
  > +;;
  >  ;; - repository-hostname (dirname)
  >  ;;
  >  ;;   Return the hostname that the backend will have to contact
  > @@ -1594,6 +1598,33 @@ saving the buffer."
  >      (vc-diff-internal t (vc-deduce-fileset) nil nil (interactive-p))))
  >  
  >  ;;;###autoload
  > +(defun vc-root-diff (historic &optional not-urgent)
  > +  "Display diffs between file revisions.
  > +Normally this compares the currently selected fileset with their
  > +working revisions.  With a prefix argument HISTORIC, it reads two revision
  > +designators specifying which revisions to compare.
  > +
  > +The optional argument NOT-URGENT non-nil means it is ok to say no to
  > +saving the buffer."
  > +  (interactive (list current-prefix-arg t))
  > +  (if historic
  > +      ;; FIXME: this does not work right, `vc-version-diff' ends up
  > +      ;; calling `vc-deduce-fileset' to find the files to diff, and
  > +      ;; that's not what we want here, we want the diff for the VC root dir.
  > +      (call-interactively 'vc-version-diff)
  > +    (when buffer-file-name (vc-buffer-sync not-urgent))
  > +    (let ((backend
  > +	   (cond ((derived-mode-p 'vc-dir-mode)  vc-dir-backend)
  > +		 (vc-mode (vc-backend buffer-file-name))))
  > +	  rootdir working-revision)
  > +      (unless backend
  > +	(error "Buffer is not version controlled"))
  > +      (setq rootdir (vc-call-backend backend 'root default-directory))
  > +      (setq working-revision (vc-working-revision rootdir))
  > +      (vc-diff-internal
  > +       t (list backend (list rootdir) working-revision) nil nil (interactive-p)))))
  > +
  > +;;;###autoload
  >  (defun vc-revision-other-window (rev)
  >    "Visit revision REV of the current file in another window.
  >  If the current file is named `F', the revision is named `F.~REV~'.
  > @@ -1817,34 +1848,54 @@ allowed and simply skipped)."
  >  
  >  ;; Miscellaneous other entry points
  >  
  > +;; FIXME: this should be a defcustom
  > +;; FIXME: maybe add another choice:
  > +;; `root-directory' (or somesuch), which would mean show a short log
  > +;; for the root directory.
  > +(defvar vc-log-short-style '(directory)
  > +  "Whether or not to show a short log.
  > +If it contains `directory' then if the fileset contains a directory show a short log.
  > +If it contains `file' then show short logs for files.
  > +Not all VC backends support short logs!")
  > +
  >  (defun vc-print-log-internal (backend files working-revision)
  >    ;; Don't switch to the output buffer before running the command,
  >    ;; so that any buffer-local settings in the vc-controlled
  >    ;; buffer can be accessed by the command.
  > -  (vc-call-backend backend 'print-log files "*vc-change-log*")
  > -  (pop-to-buffer "*vc-change-log*")
  > -  (vc-exec-after
  > -   `(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) ',files)
  > -      
  > -      ;; FIXME: this seems to apply only to RCS/CVS, it doesn't quite
  > -      ;; belong here in the generic code.
  > -      (goto-char (point-max))
  > -      (forward-line -1)
  > -      (while (looking-at "=*\n")
  > -      	(delete-char (- (match-end 0) (match-beginning 0)))
  > -      	(forward-line -1))
  > -      (goto-char (point-min))
  > -      (when (looking-at "[\b\t\n\v\f\r ]+")
  > -      	(delete-char (- (match-end 0) (match-beginning 0))))
  > -
  > -      (shrink-window-if-larger-than-buffer)
  > -      ;; move point to the log entry for the working revision
  > -      (vc-call-backend ',backend 'show-log-entry ',working-revision)
  > -      (setq vc-sentinel-movepoint (point))
  > -      (set-buffer-modified-p nil))))
  > +  (let ((dir-present nil)
  > +	(vc-short-log nil))
  > +    (dolist (file files)
  > +      (when (file-directory-p file)
  > +	(setq dir-present t)))
  > +    (setq vc-short-log
  > +	  (not (null (if dir-present
  > +			 (memq 'directory vc-log-short-style)
  > +		       (memq 'file vc-log-short-style)))))
  > +    (vc-call-backend backend 'print-log files "*vc-change-log*" vc-short-log)
  > +    (pop-to-buffer "*vc-change-log*")
  > +    (vc-exec-after
  > +     `(let ((inhibit-read-only t)
  > +	    (vc-short-log ,vc-short-log))
  > +	(vc-call-backend ',backend 'log-view-mode)
  > +	(set (make-local-variable 'log-view-vc-backend) ',backend)
  > +	(set (make-local-variable 'log-view-vc-fileset) ',files)
  > +
  > +	;; FIXME: this seems to apply only to RCS/CVS, it doesn't quite
  > +	;; belong here in the generic code.
  > +	(goto-char (point-max))
  > +	(forward-line -1)
  > +	(while (looking-at "=*\n")
  > +	  (delete-char (- (match-end 0) (match-beginning 0)))
  > +	  (forward-line -1))
  > +	(goto-char (point-min))
  > +	(when (looking-at "[\b\t\n\v\f\r ]+")
  > +	  (delete-char (- (match-end 0) (match-beginning 0))))
  > +
  > +	(shrink-window-if-larger-than-buffer)
  > +	;; move point to the log entry for the working revision
  > +	(vc-call-backend ',backend 'show-log-entry ',working-revision)
  > +	(setq vc-sentinel-movepoint (point))
  > +	(set-buffer-modified-p nil)))))
  >  
  >  ;;;###autoload
  >  (defun vc-print-log (&optional working-revision)
  > @@ -1858,6 +1909,20 @@ If WORKING-REVISION is non-nil, leave th
  >      (vc-print-log-internal backend files working-revision)))
  >  
  >  ;;;###autoload
  > +(defun vc-print-root-log ()
  > +  "List the change log of for the current VC controlled tree in a window."
  > +  (interactive)
  > +  (let ((backend
  > +	 (cond ((derived-mode-p 'vc-dir-mode)  vc-dir-backend)
  > +	       (vc-mode (vc-backend buffer-file-name))))
  > +	rootdir working-revision)
  > +    (unless backend
  > +      (error "Buffer is not version controlled"))
  > +    (setq rootdir (vc-call-backend backend 'root default-directory))
  > +    (setq working-revision (vc-working-revision rootdir))
  > +    (vc-print-log-internal backend (list rootdir) working-revision)))
  > +
  > +;;;###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




  reply	other threads:[~2009-08-29 19:13 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-07 18:45 VC top of the tree diff and log Dan Nicolaescu
2009-07-08  2:50 ` Miles Bader
2009-07-08 21:10   ` Dan Nicolaescu
2009-07-08 23:01     ` Miles Bader
2009-07-09  0:29       ` Dan Nicolaescu
2009-07-09  3:05         ` Miles Bader
2009-07-09  3:58           ` C-x v l in a dired buffer [was: Re: VC top of the tree diff and log] Dan Nicolaescu
2009-07-09  6:48           ` VC top of the tree diff and log Dan Nicolaescu
2009-07-16 21:38       ` Dan Nicolaescu
2009-07-18 21:45         ` Juri Linkov
2009-07-11 19:51 ` Stefan Monnier
2009-07-23  5:43   ` Dan Nicolaescu
2009-07-30  7:18     ` Dan Nicolaescu
2009-08-29 19:13       ` Dan Nicolaescu [this message]
2009-08-29 21:25         ` Stefan Monnier
2009-08-29 22:47           ` Juri Linkov
2009-08-29 23:10             ` Miles Bader
2009-09-01 21:36               ` Juri Linkov
2009-09-01 22:27                 ` Juri Linkov
2009-09-04  0:04                   ` Juri Linkov
2009-09-04  2:12                   ` Stefan Monnier
2009-08-30  6:16           ` Dan Nicolaescu
2009-09-01 21:35             ` Juri Linkov
2009-09-01 22:07               ` Dan Nicolaescu
2009-09-02  4:13                 ` Miles Bader
2009-09-02  4:34                   ` Dan Nicolaescu
2009-09-04  0:05                     ` Juri Linkov
2009-09-04  0:33                       ` Miles Bader
2009-09-01 21:41         ` Juri Linkov
2009-09-01 22:46           ` Dan Nicolaescu
2009-09-04  0:06             ` Juri Linkov
2009-12-06 22:37           ` Dan Nicolaescu
2009-09-04  0:36         ` Juri Linkov
2009-09-04  3:42           ` Miles Bader

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=200908291913.n7TJD9wq003979@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).