aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/vc-git.el
diff options
context:
space:
mode:
authorChong Yidong2010-10-31 23:13:42 -0400
committerChong Yidong2010-10-31 23:13:42 -0400
commit98cfec0d6935f25a54852caaa33112ea1ca4634b (patch)
tree95822bce29eaee01ee15f79a24405489e2eaf8d5 /lisp/vc-git.el
parent6aad7ea061dac5966904f6a6b4f36816d9c87d10 (diff)
downloademacs-98cfec0d6935f25a54852caaa33112ea1ca4634b.tar.gz
emacs-98cfec0d6935f25a54852caaa33112ea1ca4634b.zip
Backport VC improvements from trunk.
* vc/log-edit.el (log-edit-rewrite-fixes): New var. (log-edit-author): New dynamic var. (log-edit-changelog-ours-p, log-edit-insert-changelog-entries): Use it to return the author if different from committer. (log-edit-insert-changelog): Use them to add Author: and Fixes headers. * vc/vc-hooks.el (vc-default-mode-line-string): Doc fix. * vc/vc.el (vc-deduce-backend): New fun. Handle diff buffers. (vc-root-diff, vc-print-root-log, vc-log-incoming) (vc-log-outgoing): Use it. (vc-diff-internal): Set diff-vc-backend. * vc/diff-mode.el (diff-vc-backend): New var. * vc/vc.el (vc-diff-internal): Set `revert-buffer-function' buffer-locally to lambda that re-runs the vc diff command. (Bug#6447) * vc/log-view.el (log-view-mode-map): Bind revert-buffer. Make 'g' (AKA revert-buffer) rerun VC log, log-incoming and log-outgoing commands. * vc/vc.el (vc-log-internal-common): Add a new argument and use it to create a buffer local revert-buffer-function variable. (vc-print-log-internal, vc-log-incoming, vc-log-outgoing): Pass a revert-buffer-function lambda. Improve VC create/retrieve tag/branch. * vc.el (vc-create-tag): Do not read the directory name for VCs with repository revision granularity. Adjust the tag/branch prompt. Reset VC properties. (vc-retrieve-tag): Do not read the directory name for VCs with repository revision granularity. Reset VC properties. Add optional support for resetting VC properties. * vc-dispatcher.el (vc-resynch-window): Add new optional argument, call vc-file-clearprops when true. (vc-resynch-buffer): Add new optional argument, pass it down. (vc-resynch-buffers-in-directory): Likewise. Improve support for special markup in the VC commit message. * vc-mtn.el (vc-mtn-checkin): Support Author: and Date: markup. * vc-hg.el (vc-hg-checkin): Add support for Date:. * vc-git.el (vc-git-checkin): * vc-bzr.el (vc-bzr-checkin): Likewise. Add support for vc-log-incoming, improve vc-log-outgoing for Git. * vc-git.el (vc-git-log-view-mode): Fix font lock for incoming/outgoing logs. (vc-git-log-outgoing, vc-git-log-incoming): New functions. * vc-git.el (vc-git-log-outgoing): Use the same format as the short log. (vc-git-log-incoming): Likewise. Run "git fetch" before the log command Add bindings for vc-log-incoming and vc-log-outgoing. * vc-hooks.el (vc-prefix-map): Add bindings for vc-log-incoming and vc-log-outgoing. * vc-dir.el (vc-dir-menu-map): Add menu bindings for vc-log-incoming and vc-log-outgoing. Improve state updating for VC tag commands. * vc.el (vc-create-tag, vc-retrieve-tag): Call vc-resynch-buffer to update the state of all buffers in the directory. * vc-dir.el (vc-dir): Don't pop-up-windows. (Bug#6204) * vc.el (vc-checkin, vc-modify-change-comment): Adjust to new vc-start/finish-logentry. (vc-find-conflicted-file): New command. (vc-transfer-file): Adjust to new vc-checkin. (vc-next-action): Improve scoping. * vc-git.el (vc-git-checkin): Use log-edit-extract-headers. (vc-git-commits-coding-system): Rename from git-commits-coding-system. * vc-dispatcher.el (vc-log-edit): Shorten names for log-edit-show-files. * vc-bzr.el (vc-bzr-checkin): Use log-edit-extract-headers. (vc-bzr-conflicted-files): New function. * log-edit.el (log-edit-summary, log-edit-header) (log-edit-unknown-header): New faces. (log-edit-headers-alist): New var. (log-edit-header-contents-regexp): New const. (log-edit-match-to-eoh): New function. (log-edit-font-lock-keywords): Use them. (log-edit): Insert a "Summary:" header as default. (log-edit-mode): Mark font-lock rules as case-insensitive. (log-edit-done): Cleanup headers. (log-edit-extract-headers): New function to replace it. * vc-dispatcher.el (vc-finish-logentry): Don't mess so badly with the windows/frames. * vc-bzr.el (vc-bzr-shelve-apply): Don't use *vc-bzr-shelve*. * vc-dir.el (vc-dir-kill-line): New command. (vc-dir-mode-map): Bind it to C-k. (vc-dir-headers): Abbreviate the working dir. * vc-git.el (vc-git-revision-table): Include remote branches. New VC methods: vc-log-incoming and vc-log-outgoing. * vc.el (vc-print-log-setup-buttons, vc-log-internal-common) (vc-incoming-outgoing-internal, vc-log-incoming, vc-log-outgoing): New functions. (vc-print-log-internal): Just call vc-log-internal-common. (vc-log-view-type): New permanent local variable. * vc-hooks.el (vc-menu-map): Bind vc-log-incoming and vc-log-outgoing. * vc-bzr.el (vc-bzr-log-view-mode): Use vc-log-view-type instead of the dynamic bound vc-short-log. (vc-bzr-log-incoming, vc-bzr-log-outgoing): New functions. * vc-git.el (vc-git-log-outgoing): New function. (vc-git-log-view-mode): Use vc-log-view-type instead of the dynamic bound vc-short-log. * vc-hg.el (vc-hg-log-view-mode): Use vc-log-view-type instead of the dynamic bound vc-short-log. Highlight the tag. (vc-hg-log-incoming, vc-hg-log-outgoing): New functions. (vc-hg-outgoing, vc-hg-incoming, vc-hg-outgoing-mode): (vc-hg-incoming-mode): Remove. (vc-hg-extra-menu-map): Do not bind vc-hg-incoming and vc-hg-outgoing. Fix default-directory for vc-root-diff. * vc.el (vc-root-diff): Bind default-directory to the root directory for the diff command. * vc-hg.el (vc-hg-push, vc-hg-pull): Use `apply' when calling `vc-hg-command' with a list of flags. * vc-bzr.el (vc-bzr-log-edit-mode): Add --fixes support to log-edit-before-checkin-process. * vc.el (vc-modify-change-comment): Pass MODE to vc-start-logentry. * vc-bzr.el, vc-hg.el (log-edit-mode): Declare. * vc-dispatcher.el (vc-start-logentry): Doc fix. (log-view-process-buffer, log-edit-extra-flags): Declare. Add special markup processing for commit logs. * log-edit.el (log-edit): Add new argument MODE. Use that mode when non-nil instead of the log-view-mode. * vc.el (vc-default-log-edit-mode): New function. * vc-dispatcher.el (vc-log-edit): Add a mode argument, pass it to log-edit. Support for shelving snapshots and for showing shelves. * vc-bzr.el (vc-bzr-shelve-show, vc-bzr-shelve-show-at-point) (vc-bzr-shelve-apply-and-keep-at-point, vc-bzr-shelve-snapshot): New functions. (vc-bzr-shelve-map, vc-bzr-shelve-menu-map) (vc-bzr-extra-menu-map): Map them.
Diffstat (limited to 'lisp/vc-git.el')
-rw-r--r--lisp/vc-git.el58
1 files changed, 46 insertions, 12 deletions
diff --git a/lisp/vc-git.el b/lisp/vc-git.el
index 24062a0f4f6..4383e609adb 100644
--- a/lisp/vc-git.el
+++ b/lisp/vc-git.el
@@ -118,7 +118,7 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches."
118 :version "23.1" 118 :version "23.1"
119 :group 'vc) 119 :group 'vc)
120 120
121(defvar git-commits-coding-system 'utf-8 121(defvar vc-git-commits-coding-system 'utf-8
122 "Default coding system for git commits.") 122 "Default coding system for git commits.")
123 123
124;;; BACKEND PROPERTIES 124;;; BACKEND PROPERTIES
@@ -171,7 +171,14 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches."
171 171
172(defun vc-git-state (file) 172(defun vc-git-state (file)
173 "Git-specific version of `vc-state'." 173 "Git-specific version of `vc-state'."
174 ;; FIXME: This can't set 'ignored yet 174 ;; FIXME: This can't set 'ignored or 'conflict yet
175 ;; The 'ignored state could be detected with `git ls-files -i -o
176 ;; --exclude-standard` It also can't set 'needs-update or
177 ;; 'needs-merge. The rough equivalent would be that upstream branch
178 ;; for current branch is in fast-forward state i.e. current branch
179 ;; is direct ancestor of corresponding upstream branch, and the file
180 ;; was modified upstream. But we can't check that without a network
181 ;; operation.
175 (if (not (vc-git-registered file)) 182 (if (not (vc-git-registered file))
176 'unregistered 183 'unregistered
177 (vc-git--call nil "add" "--refresh" "--" (file-relative-name file)) 184 (vc-git--call nil "add" "--refresh" "--" (file-relative-name file))
@@ -541,11 +548,16 @@ or an empty string if none."
541(defun vc-git-unregister (file) 548(defun vc-git-unregister (file)
542 (vc-git-command nil 0 file "rm" "-f" "--cached" "--")) 549 (vc-git-command nil 0 file "rm" "-f" "--cached" "--"))
543 550
551(declare-function log-edit-extract-headers "log-edit" (headers string))
544 552
545(defun vc-git-checkin (files rev comment) 553(defun vc-git-checkin (files rev comment)
546 (let ((coding-system-for-write git-commits-coding-system)) 554 (let ((coding-system-for-write vc-git-commits-coding-system))
547 (vc-git-command nil 0 files "commit" 555 (apply 'vc-git-command nil 0 files
548 "-m" comment "--only" "--"))) 556 (nconc (list "commit" "-m")
557 (log-edit-extract-headers '(("Author" . "--author")
558 ("Date" . "--date"))
559 comment)
560 (list "--only" "--")))))
549 561
550(defun vc-git-find-revision (file rev buffer) 562(defun vc-git-find-revision (file rev buffer)
551 (let* (process-file-side-effects 563 (let* (process-file-side-effects
@@ -580,7 +592,7 @@ or an empty string if none."
580 "Get change log associated with FILES. 592 "Get change log associated with FILES.
581Note that using SHORTLOG requires at least Git version 1.5.6, 593Note that using SHORTLOG requires at least Git version 1.5.6,
582for the --graph option." 594for the --graph option."
583 (let ((coding-system-for-read git-commits-coding-system)) 595 (let ((coding-system-for-read vc-git-commits-coding-system))
584 ;; `vc-do-command' creates the buffer, but we need it before running 596 ;; `vc-do-command' creates the buffer, but we need it before running
585 ;; the command. 597 ;; the command.
586 (vc-setup-buffer buffer) 598 (vc-setup-buffer buffer)
@@ -600,25 +612,46 @@ for the --graph option."
600 (when start-revision (list start-revision)) 612 (when start-revision (list start-revision))
601 '("--"))))))) 613 '("--")))))))
602 614
615(defun vc-git-log-outgoing (buffer remote-location)
616 (interactive)
617 (vc-git-command
618 buffer 0 nil
619 "log"
620 "--no-color" "--graph" "--decorate" "--date=short"
621 "--pretty=tformat:%d%h %ad %s" "--abbrev-commit"
622 (concat (if (string= remote-location "")
623 "@{upstream}"
624 remote-location)
625 "..HEAD")))
626
627(defun vc-git-log-incoming (buffer remote-location)
628 (interactive)
629 (vc-git-command nil 0 nil "fetch")
630 (vc-git-command
631 buffer 0 nil
632 "log"
633 "--no-color" "--graph" "--decorate" "--date=short"
634 "--pretty=tformat:%d%h %ad %s" "--abbrev-commit"
635 (concat "HEAD.." (if (string= remote-location "")
636 "@{upstream}"
637 remote-location))))
638
603(defvar log-view-message-re) 639(defvar log-view-message-re)
604(defvar log-view-file-re) 640(defvar log-view-file-re)
605(defvar log-view-font-lock-keywords) 641(defvar log-view-font-lock-keywords)
606(defvar log-view-per-file-logs) 642(defvar log-view-per-file-logs)
607 643
608;; Dynamically bound.
609(defvar vc-short-log)
610
611(define-derived-mode vc-git-log-view-mode log-view-mode "Git-Log-View" 644(define-derived-mode vc-git-log-view-mode log-view-mode "Git-Log-View"
612 (require 'add-log) ;; We need the faces add-log. 645 (require 'add-log) ;; We need the faces add-log.
613 ;; Don't have file markers, so use impossible regexp. 646 ;; Don't have file markers, so use impossible regexp.
614 (set (make-local-variable 'log-view-file-re) "\\`a\\`") 647 (set (make-local-variable 'log-view-file-re) "\\`a\\`")
615 (set (make-local-variable 'log-view-per-file-logs) nil) 648 (set (make-local-variable 'log-view-per-file-logs) nil)
616 (set (make-local-variable 'log-view-message-re) 649 (set (make-local-variable 'log-view-message-re)
617 (if vc-short-log 650 (if (not (eq vc-log-view-type 'long))
618 "^\\(?:[*/\\| ]+ \\)?\\(?: ([^)]+)\\)?\\([0-9a-z]+\\) \\([-a-z0-9]+\\) \\(.*\\)" 651 "^\\(?:[*/\\| ]+ \\)?\\(?: ([^)]+)\\)?\\([0-9a-z]+\\) \\([-a-z0-9]+\\) \\(.*\\)"
619 "^commit *\\([0-9a-z]+\\)")) 652 "^commit *\\([0-9a-z]+\\)"))
620 (set (make-local-variable 'log-view-font-lock-keywords) 653 (set (make-local-variable 'log-view-font-lock-keywords)
621 (if vc-short-log 654 (if (not (eq vc-log-view-type 'long))
622 '( 655 '(
623 ;; Same as log-view-message-re, except that we don't 656 ;; Same as log-view-message-re, except that we don't
624 ;; want the shy group for the tag name. 657 ;; want the shy group for the tag name.
@@ -681,7 +714,8 @@ or BRANCH^ (where \"^\" can be repeated)."
681 (with-temp-buffer 714 (with-temp-buffer
682 (vc-git-command t nil nil "for-each-ref" "--format=%(refname)") 715 (vc-git-command t nil nil "for-each-ref" "--format=%(refname)")
683 (goto-char (point-min)) 716 (goto-char (point-min))
684 (while (re-search-forward "^refs/\\(heads\\|tags\\)/\\(.*\\)$" nil t) 717 (while (re-search-forward "^refs/\\(heads\\|tags\\|remotes\\)/\\(.*\\)$"
718 nil t)
685 (push (match-string 2) table))) 719 (push (match-string 2) table)))
686 table)) 720 table))
687 721