contrib/mercurial.el
author Bryan O'Sullivan <bos@serpentine.com>
Sat, 17 Sep 2005 00:27:27 -0700
changeset 1270 fc3b41570082
parent 1246 ae96c85fb0af
child 1308 2073e5a71008
permissions -rw-r--r--
Switch to new syntax for .hgignore files. Here is the new syntax, in summary. Trailing white space is dropped. The escape character is "\". Comments start with #. Empty lines are skipped. Lines can be of the following formats: syntax: regexp # defaults following lines to non-rooted regexps syntax: glob # defaults following lines to non-rooted globs re:pattern # non-rooted regular expression glob:pattern # non-rooted glob pattern # pattern of the current default type The default pattern type is regexp, which is completely backwards compatible with the old hgignore syntax. In the dirstate class, the ignore method has been reworked to be based on the util.matcher function, by way of a new dirstate.hgignore method.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     1
;;; mercurial.el --- Emacs support for the Mercurial distributed SCM
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     2
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     3
;; Copyright (C) 2005 Bryan O'Sullivan
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     4
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     5
;; Author: Bryan O'Sullivan <bos@serpentine.com>
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     6
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
     7
;; mercurial.el is free software; you can redistribute it and/or
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
     8
;; modify it under the terms of version 2 of the GNU General Public
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
     9
;; License as published by the Free Software Foundation.
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    10
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
    11
;; mercurial.el is distributed in the hope that it will be useful, but
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    12
;; WITHOUT ANY WARRANTY; without even the implied warranty of
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    13
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    14
;; General Public License for more details.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    15
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    16
;; You should have received a copy of the GNU General Public License
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
    17
;; along with mercurial.el, GNU Emacs, or XEmacs; see the file COPYING
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    18
;; (`C-h C-l').  If not, write to the Free Software Foundation, Inc.,
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    19
;; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    20
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    21
;;; Commentary:
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    22
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
    23
;; mercurial.el builds upon Emacs's VC mode to provide flexible
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    24
;; integration with the Mercurial distributed SCM tool.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    25
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
    26
;; To get going as quickly as possible, load mercurial.el into Emacs and
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    27
;; type `C-c h h'; this runs hg-help-overview, which prints a helpful
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    28
;; usage overview.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    29
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    30
;; Much of the inspiration for mercurial.el comes from Rajesh
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    31
;; Vaidheeswarran's excellent p4.el, which does an admirably thorough
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    32
;; job for the commercial Perforce SCM product.  In fact, substantial
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    33
;; chunks of code are adapted from p4.el.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    34
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
    35
;; This code has been developed under XEmacs 21.5, and may not work as
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
    36
;; well under GNU Emacs (albeit tested under 21.4).  Patches to
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
    37
;; enhance the portability of this code, fix bugs, and add features
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    38
;; are most welcome.  You can clone a Mercurial repository for this
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    39
;; package from http://www.serpentine.com/hg/hg-emacs
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    40
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    41
;; Please send problem reports and suggestions to bos@serpentine.com.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    42
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    43

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    44
;;; Code:
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    45
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    46
(require 'advice)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    47
(require 'cl)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    48
(require 'diff-mode)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    49
(require 'easymenu)
1024
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
    50
(require 'executable)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    51
(require 'vc)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    52
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    53

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    54
;;; XEmacs has view-less, while GNU Emacs has view.  Joy.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    55
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    56
(condition-case nil
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    57
    (require 'view-less)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    58
  (error nil))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    59
(condition-case nil
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    60
    (require 'view)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    61
  (error nil))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    62
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    63

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    64
;;; Variables accessible through the custom system.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    65
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
    66
(defgroup mercurial nil
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    67
  "Mercurial distributed SCM."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    68
  :group 'tools)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    69
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    70
(defcustom hg-binary
1011
d06420c90d8b Emacs: search for hg in path before looking in funny places.
bos@serpentine.internal.keyresearch.com
parents: 1004
diff changeset
    71
    (or (executable-find "hg")
d06420c90d8b Emacs: search for hg in path before looking in funny places.
bos@serpentine.internal.keyresearch.com
parents: 1004
diff changeset
    72
	(dolist (path '("~/bin/hg" "/usr/bin/hg" "/usr/local/bin/hg"))
d06420c90d8b Emacs: search for hg in path before looking in funny places.
bos@serpentine.internal.keyresearch.com
parents: 1004
diff changeset
    73
	  (when (file-executable-p path)
d06420c90d8b Emacs: search for hg in path before looking in funny places.
bos@serpentine.internal.keyresearch.com
parents: 1004
diff changeset
    74
	    (return path))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    75
  "The path to Mercurial's hg executable."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    76
  :type '(file :must-match t)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
    77
  :group 'mercurial)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    78
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    79
(defcustom hg-mode-hook nil
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    80
  "Hook run when a buffer enters hg-mode."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    81
  :type 'sexp
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
    82
  :group 'mercurial)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    83
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    84
(defcustom hg-commit-mode-hook nil
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    85
  "Hook run when a buffer is created to prepare a commit."
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    86
  :type 'sexp
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    87
  :group 'mercurial)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    88
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    89
(defcustom hg-pre-commit-hook nil
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    90
  "Hook run before a commit is performed.
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    91
If you want to prevent the commit from proceeding, raise an error."
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    92
  :type 'sexp
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    93
  :group 'mercurial)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
    94
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
    95
(defcustom hg-log-mode-hook nil
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
    96
  "Hook run after a buffer is filled with log information."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
    97
  :type 'sexp
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
    98
  :group 'mercurial)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
    99
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   100
(defcustom hg-global-prefix "\C-ch"
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   101
  "The global prefix for Mercurial keymap bindings."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   102
  :type 'sexp
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   103
  :group 'mercurial)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   104
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   105
(defcustom hg-commit-allow-empty-message nil
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   106
  "Whether to allow changes to be committed with empty descriptions."
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   107
  :type 'boolean
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   108
  :group 'mercurial)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   109
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   110
(defcustom hg-commit-allow-empty-file-list nil
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   111
  "Whether to allow changes to be committed without any modified files."
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   112
  :type 'boolean
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   113
  :group 'mercurial)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   114
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   115
(defcustom hg-rev-completion-limit 100
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   116
  "The maximum number of revisions that hg-read-rev will offer to complete.
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   117
This affects memory usage and performance when prompting for revisions
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   118
in a repository with a lot of history."
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   119
  :type 'integer
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   120
  :group 'mercurial)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   121
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   122
(defcustom hg-log-limit 50
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   123
  "The maximum number of revisions that hg-log will display."
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   124
  :type 'integer
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   125
  :group 'mercurial)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   126
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   127
(defcustom hg-update-modeline t
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   128
  "Whether to update the modeline with the status of a file after every save.
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   129
Set this to nil on platforms with poor process management, such as Windows."
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   130
  :type 'boolean
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   131
  :group 'mercurial)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   132
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   133
(defcustom hg-incoming-repository "default"
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   134
  "The repository from which changes are pulled from by default.
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   135
This should be a symbolic repository name, since it is used for all
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   136
repository-related commands."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   137
  :type 'string
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   138
  :group 'mercurial)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   139
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   140
(defcustom hg-outgoing-repository "default-push"
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   141
  "The repository to which changes are pushed to by default.
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   142
This should be a symbolic repository name, since it is used for all
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   143
repository-related commands."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   144
  :type 'string
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   145
  :group 'mercurial)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   146
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   147

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   148
;;; Other variables.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   149
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   150
(defconst hg-running-xemacs (string-match "XEmacs" emacs-version)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   151
  "Is mercurial.el running under XEmacs?")
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   152
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   153
(defvar hg-mode nil
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   154
  "Is this file managed by Mercurial?")
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   155
(make-variable-buffer-local 'hg-mode)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   156
(put 'hg-mode 'permanent-local t)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   157
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   158
(defvar hg-status nil)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   159
(make-variable-buffer-local 'hg-status)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   160
(put 'hg-status 'permanent-local t)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   161
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   162
(defvar hg-prev-buffer nil)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   163
(make-variable-buffer-local 'hg-prev-buffer)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   164
(put 'hg-prev-buffer 'permanent-local t)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   165
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   166
(defvar hg-root nil)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   167
(make-variable-buffer-local 'hg-root)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   168
(put 'hg-root 'permanent-local t)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   169
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   170
(defvar hg-output-buffer-name "*Hg*"
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   171
  "The name to use for Mercurial output buffers.")
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   172
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   173
(defvar hg-file-history nil)
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   174
(defvar hg-repo-history nil)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   175
(defvar hg-rev-history nil)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   176
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   177

999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   178
;;; Random constants.
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   179
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   180
(defconst hg-commit-message-start
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   181
  "--- Enter your commit message.  Type `C-c C-c' to commit. ---\n")
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   182
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   183
(defconst hg-commit-message-end
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   184
  "--- Files in bold will be committed.  Click to toggle selection. ---\n")
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   185
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   186

944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   187
;;; hg-mode keymap.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   188
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   189
(defvar hg-mode-map (make-sparse-keymap))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   190
(define-key hg-mode-map "\C-xv" 'hg-prefix-map)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   191
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   192
(defvar hg-prefix-map
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   193
  (let ((map (copy-keymap vc-prefix-map)))
958
d845a1f174bb Make mercurial.el load with GNU emacs
mpm@selenic.com
parents: 955
diff changeset
   194
    (if (functionp 'set-keymap-name)
d845a1f174bb Make mercurial.el load with GNU emacs
mpm@selenic.com
parents: 955
diff changeset
   195
      (set-keymap-name map 'hg-prefix-map)); XEmacs
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   196
    map)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   197
  "This keymap overrides some default vc-mode bindings.")
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   198
(fset 'hg-prefix-map hg-prefix-map)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   199
(define-key hg-prefix-map "=" 'hg-diff)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   200
(define-key hg-prefix-map "c" 'hg-undo)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   201
(define-key hg-prefix-map "g" 'hg-annotate)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   202
(define-key hg-prefix-map "l" 'hg-log)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   203
(define-key hg-prefix-map "n" 'hg-commit-start)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   204
;; (define-key hg-prefix-map "r" 'hg-update)
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   205
(define-key hg-prefix-map "u" 'hg-revert-buffer)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   206
(define-key hg-prefix-map "~" 'hg-version-other-window)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   207
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   208
(add-minor-mode 'hg-mode 'hg-mode hg-mode-map)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   209
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   210

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   211
;;; Global keymap.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   212
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   213
(global-set-key "\C-xvi" 'hg-add)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   214
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   215
(defvar hg-global-map (make-sparse-keymap))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   216
(fset 'hg-global-map hg-global-map)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   217
(global-set-key hg-global-prefix 'hg-global-map)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   218
(define-key hg-global-map "," 'hg-incoming)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   219
(define-key hg-global-map "." 'hg-outgoing)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   220
(define-key hg-global-map "<" 'hg-pull)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   221
(define-key hg-global-map "=" 'hg-diff-repo)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   222
(define-key hg-global-map ">" 'hg-push)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   223
(define-key hg-global-map "?" 'hg-help-overview)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   224
(define-key hg-global-map "A" 'hg-addremove)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   225
(define-key hg-global-map "U" 'hg-revert)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   226
(define-key hg-global-map "a" 'hg-add)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   227
(define-key hg-global-map "c" 'hg-commit-start)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   228
(define-key hg-global-map "f" 'hg-forget)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   229
(define-key hg-global-map "h" 'hg-help-overview)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   230
(define-key hg-global-map "i" 'hg-init)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   231
(define-key hg-global-map "l" 'hg-log-repo)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   232
(define-key hg-global-map "r" 'hg-root)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   233
(define-key hg-global-map "s" 'hg-status)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   234
(define-key hg-global-map "u" 'hg-update)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   235
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   236

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   237
;;; View mode keymap.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   238
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   239
(defvar hg-view-mode-map
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   240
  (let ((map (copy-keymap (if (boundp 'view-minor-mode-map)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   241
			      view-minor-mode-map
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   242
			    view-mode-map))))
958
d845a1f174bb Make mercurial.el load with GNU emacs
mpm@selenic.com
parents: 955
diff changeset
   243
    (if (functionp 'set-keymap-name)
d845a1f174bb Make mercurial.el load with GNU emacs
mpm@selenic.com
parents: 955
diff changeset
   244
      (set-keymap-name map 'hg-view-mode-map)); XEmacs
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   245
    map))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   246
(fset 'hg-view-mode-map hg-view-mode-map)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   247
(define-key hg-view-mode-map
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   248
  (if hg-running-xemacs [button2] [mouse-2])
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   249
  'hg-buffer-mouse-clicked)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   250
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   251

999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   252
;;; Commit mode keymaps.
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   253
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   254
(defvar hg-commit-mode-map (make-sparse-keymap))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   255
(define-key hg-commit-mode-map "\C-c\C-c" 'hg-commit-finish)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   256
(define-key hg-commit-mode-map "\C-c\C-k" 'hg-commit-kill)
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   257
(define-key hg-commit-mode-map "\C-xv=" 'hg-diff-repo)
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   258
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   259
(defvar hg-commit-mode-file-map (make-sparse-keymap))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   260
(define-key hg-commit-mode-file-map
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   261
  (if hg-running-xemacs [button2] [mouse-2])
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   262
  'hg-commit-mouse-clicked)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   263
(define-key hg-commit-mode-file-map " " 'hg-commit-toggle-file)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   264
(define-key hg-commit-mode-file-map "\r" 'hg-commit-toggle-file)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   265
  
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   266

944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   267
;;; Convenience functions.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   268
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   269
(defsubst hg-binary ()
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   270
  (if hg-binary
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   271
      hg-binary
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   272
    (error "No `hg' executable found!")))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   273
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   274
(defsubst hg-replace-in-string (str regexp newtext &optional literal)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   275
  "Replace all matches in STR for REGEXP with NEWTEXT string.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   276
Return the new string.  Optional LITERAL non-nil means do a literal
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   277
replacement.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   278
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   279
This function bridges yet another pointless impedance gap between
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   280
XEmacs and GNU Emacs."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   281
  (if (fboundp 'replace-in-string)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   282
      (replace-in-string str regexp newtext literal)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   283
    (replace-regexp-in-string regexp newtext str nil literal)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   284
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   285
(defsubst hg-strip (str)
1178
a7abffa4b19f Adjust hg-strip and hg-chomp regexps.
jdc@uwo.ca
parents: 1175
diff changeset
   286
  "Strip leading and trailing blank lines from a string."
a7abffa4b19f Adjust hg-strip and hg-chomp regexps.
jdc@uwo.ca
parents: 1175
diff changeset
   287
  (hg-replace-in-string (hg-replace-in-string str "[\r\n][ \t\r\n]*\\'" "")
a7abffa4b19f Adjust hg-strip and hg-chomp regexps.
jdc@uwo.ca
parents: 1175
diff changeset
   288
			"\\`[ \t\r\n]*[\r\n]" ""))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   289
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   290
(defsubst hg-chomp (str)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   291
  "Strip trailing newlines from a string."
1178
a7abffa4b19f Adjust hg-strip and hg-chomp regexps.
jdc@uwo.ca
parents: 1175
diff changeset
   292
  (hg-replace-in-string str "[\r\n]+\'" ""))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   293
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   294
(defun hg-run-command (command &rest args)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   295
  "Run the shell command COMMAND, returning (EXIT-CODE . COMMAND-OUTPUT).
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   296
The list ARGS contains a list of arguments to pass to the command."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   297
  (let* (exit-code
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   298
	 (output
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   299
	  (with-output-to-string
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   300
	    (with-current-buffer
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   301
		standard-output
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   302
	      (setq exit-code
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   303
		    (apply 'call-process command nil t nil args))))))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   304
    (cons exit-code output)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   305
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   306
(defun hg-run (command &rest args)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   307
  "Run the Mercurial command COMMAND, returning (EXIT-CODE . COMMAND-OUTPUT)."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   308
  (apply 'hg-run-command (hg-binary) command args))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   309
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   310
(defun hg-run0 (command &rest args)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   311
  "Run the Mercurial command COMMAND, returning its output.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   312
If the command does not exit with a zero status code, raise an error."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   313
  (let ((res (apply 'hg-run-command (hg-binary) command args)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   314
    (if (not (eq (car res) 0))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   315
	(error "Mercurial command failed %s - exit code %s"
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   316
	       (cons command args)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   317
	       (car res))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   318
      (cdr res))))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   319
1024
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   320
(defun hg-sync-buffers (path)
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   321
  "Sync buffers visiting PATH with their on-disk copies.
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   322
If PATH is not being visited, but is under the repository root, sync
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   323
all buffers visiting files in the repository."
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   324
  (let ((buf (find-buffer-visiting path)))
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   325
    (if buf
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   326
	(with-current-buffer buf
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   327
	  (vc-buffer-sync))
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   328
      (hg-do-across-repo path
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   329
	(vc-buffer-sync)))))
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   330
  
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   331
(defun hg-buffer-commands (pnt)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   332
  "Use the properties of a character to do something sensible."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   333
  (interactive "d")
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   334
  (let ((rev (get-char-property pnt 'rev))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   335
	(file (get-char-property pnt 'file))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   336
	(date (get-char-property pnt 'date))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   337
	(user (get-char-property pnt 'user))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   338
	(host (get-char-property pnt 'host))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   339
	(prev-buf (current-buffer)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   340
    (cond
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   341
     (file
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   342
      (find-file-other-window file))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   343
     (rev
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   344
      (hg-diff hg-view-file-name rev rev prev-buf))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   345
     ((message "I don't know how to do that yet")))))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   346
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   347
(defsubst hg-event-point (event)
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   348
  "Return the character position of the mouse event EVENT."
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   349
  (if hg-running-xemacs
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   350
      (event-point event)
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   351
    (posn-point (event-start event))))
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   352
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   353
(defsubst hg-event-window (event)
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   354
  "Return the window over which mouse event EVENT occurred."
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   355
  (if hg-running-xemacs
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   356
      (event-window event)
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   357
    (posn-window (event-start event))))
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   358
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   359
(defun hg-buffer-mouse-clicked (event)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   360
  "Translate the mouse clicks in a HG log buffer to character events.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   361
These are then handed off to `hg-buffer-commands'.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   362
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   363
Handle frickin' frackin' gratuitous event-related incompatibilities."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   364
  (interactive "e")
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   365
  (select-window (hg-event-window event))
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   366
  (hg-buffer-commands (hg-event-point event)))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   367
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   368
(unless (fboundp 'view-minor-mode)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   369
  (defun view-minor-mode (prev-buffer exit-func)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   370
    (view-mode)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   371
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   372
(defsubst hg-abbrev-file-name (file)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   373
  "Portable wrapper around abbreviate-file-name."
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   374
  (if hg-running-xemacs
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   375
      (abbreviate-file-name file t)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   376
    (abbreviate-file-name file)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   377
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   378
(defun hg-read-file-name (&optional prompt default)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   379
  "Read a file or directory name, or a pattern, to use with a command."
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   380
  (save-excursion
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   381
    (while hg-prev-buffer
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   382
      (set-buffer hg-prev-buffer))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   383
    (let ((path (or default (buffer-file-name))))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   384
      (if (or (not path) current-prefix-arg)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   385
	  (expand-file-name
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   386
	   (read-file-name (format "File, directory or pattern%s: "
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   387
				   (or prompt ""))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   388
			   (and path (file-name-directory path))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   389
			   nil nil
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   390
			   (and path (file-name-nondirectory path))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   391
			   'hg-file-history))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   392
	path))))
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   393
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   394
(defun hg-read-config ()
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   395
  "Return an alist of (key . value) pairs of Mercurial config data.
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   396
Each key is of the form (section . name)."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   397
  (let (items)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   398
    (dolist (line (split-string (hg-chomp (hg-run0 "debugconfig")) "\n") items)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   399
      (string-match "^\\([^=]*\\)=\\(.*\\)" line)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   400
      (let* ((left (substring line (match-beginning 1) (match-end 1)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   401
	     (right (substring line (match-beginning 2) (match-end 2)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   402
	     (key (split-string left "\\."))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   403
	     (value (hg-replace-in-string right "\\\\n" "\n" t)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   404
	(setq items (cons (cons (cons (car key) (cadr key)) value) items))))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   405
  
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   406
(defun hg-config-section (section config)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   407
  "Return an alist of (name . value) pairs for SECTION of CONFIG."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   408
  (let (items)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   409
    (dolist (item config items)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   410
      (when (equal (caar item) section)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   411
	(setq items (cons (cons (cdar item) (cdr item)) items))))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   412
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   413
(defun hg-string-starts-with (sub str)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   414
  "Indicate whether string STR starts with the substring or character SUB."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   415
  (if (not (stringp sub))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   416
      (and (> (length str) 0) (equal (elt str 0) sub))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   417
    (let ((sub-len (length sub)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   418
      (and (<= sub-len (length str))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   419
	   (string= sub (substring str 0 sub-len))))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   420
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   421
(defun hg-complete-repo (string predicate all)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   422
  "Attempt to complete a repository name.
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   423
We complete on either symbolic names from Mercurial's config or real
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   424
directory names from the file system.  We do not penalise URLs."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   425
  (or (if all
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   426
	  (all-completions string hg-repo-completion-table predicate)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   427
	(try-completion string hg-repo-completion-table predicate))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   428
      (let* ((str (expand-file-name string))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   429
	     (dir (file-name-directory str))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   430
	     (file (file-name-nondirectory str)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   431
	(if all
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   432
	    (let (completions)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   433
	      (dolist (name (delete "./" (file-name-all-completions file dir))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   434
			    completions)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   435
		(let ((path (concat dir name)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   436
		  (when (file-directory-p path)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   437
		    (setq completions (cons name completions))))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   438
	  (let ((comp (file-name-completion file dir)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   439
	    (if comp
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   440
		(hg-abbrev-file-name (concat dir comp))))))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   441
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   442
(defun hg-read-repo-name (&optional prompt initial-contents default)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   443
  "Read the location of a repository."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   444
  (save-excursion
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   445
    (while hg-prev-buffer
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   446
      (set-buffer hg-prev-buffer))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   447
    (let (hg-repo-completion-table)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   448
      (if current-prefix-arg
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   449
	  (progn
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   450
	    (dolist (path (hg-config-section "paths" (hg-read-config)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   451
	      (setq hg-repo-completion-table
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   452
		    (cons (cons (car path) t) hg-repo-completion-table))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   453
	      (unless (hg-string-starts-with directory-sep-char (cdr path))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   454
		(setq hg-repo-completion-table
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   455
		      (cons (cons (cdr path) t) hg-repo-completion-table))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   456
	    (completing-read (format "Repository%s: " (or prompt ""))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   457
			     'hg-complete-repo
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   458
			     nil
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   459
			     nil
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   460
			     initial-contents
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   461
			     'hg-repo-history
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   462
			     default))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   463
	default))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   464
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   465
(defun hg-read-rev (&optional prompt default)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   466
  "Read a revision or tag, offering completions."
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   467
  (save-excursion
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   468
    (while hg-prev-buffer
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   469
      (set-buffer hg-prev-buffer))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   470
    (let ((rev (or default "tip")))
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   471
      (if current-prefix-arg
1175
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   472
	  (let ((revs (split-string
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   473
		       (hg-chomp
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   474
			(hg-run0 "-q" "log" "-r"
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   475
				 (format "-%d:tip" hg-rev-completion-limit)))
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   476
		       "[\n:]")))
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   477
	    (dolist (line (split-string (hg-chomp (hg-run0 "tags")) "\n"))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   478
	      (setq revs (cons (car (split-string line "\\s-")) revs)))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   479
	    (completing-read (format "Revision%s (%s): "
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   480
				     (or prompt "")
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   481
				     (or default "tip"))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   482
			     (map 'list 'cons revs revs)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   483
			     nil
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   484
			     nil
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   485
			     nil
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   486
			     'hg-rev-history
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   487
			     (or default "tip")))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   488
	rev))))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   489
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   490
(defmacro hg-do-across-repo (path &rest body)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   491
  (let ((root-name (gensym "root-"))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   492
	(buf-name (gensym "buf-")))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   493
    `(let ((,root-name (hg-root ,path)))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   494
       (save-excursion
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   495
	 (dolist (,buf-name (buffer-list))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   496
	   (set-buffer ,buf-name)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   497
	   (when (and hg-status (equal (hg-root buffer-file-name) ,root-name))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   498
	     ,@body))))))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   499
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   500
(put 'hg-do-across-repo 'lisp-indent-function 1)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   501
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   502

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   503
;;; View mode bits.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   504
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   505
(defun hg-exit-view-mode (buf)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   506
  "Exit from hg-view-mode.
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   507
We delete the current window if entering hg-view-mode split the
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   508
current frame."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   509
  (when (and (eq buf (current-buffer))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   510
	     (> (length (window-list)) 1))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   511
    (delete-window))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   512
  (when (buffer-live-p buf)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   513
    (kill-buffer buf)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   514
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   515
(defun hg-view-mode (prev-buffer &optional file-name)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   516
  (goto-char (point-min))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   517
  (set-buffer-modified-p nil)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   518
  (toggle-read-only t)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   519
  (view-minor-mode prev-buffer 'hg-exit-view-mode)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   520
  (use-local-map hg-view-mode-map)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   521
  (setq truncate-lines t)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   522
  (when file-name
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   523
    (set (make-local-variable 'hg-view-file-name)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   524
	 (hg-abbrev-file-name file-name))))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   525
  
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   526
(defun hg-file-status (file)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   527
  "Return status of FILE, or nil if FILE does not exist or is unmanaged."
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   528
  (let* ((s (hg-run "status" file))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   529
	 (exit (car s))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   530
	 (output (cdr s)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   531
    (if (= exit 0)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   532
	(let ((state (assoc (substring output 0 (min (length output) 2))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   533
			    '(("M " . modified)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   534
			      ("A " . added)
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   535
			      ("R " . removed)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   536
			      ("? " . nil)))))
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   537
	  (if state
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   538
	      (cdr state)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   539
	    'normal)))))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   540
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   541
(defun hg-tip ()
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   542
  (split-string (hg-chomp (hg-run0 "-q" "tip")) ":"))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   543
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   544
(defmacro hg-view-output (args &rest body)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   545
  "Execute BODY in a clean buffer, then quickly display that buffer.
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   546
If the buffer contains one line, its contents are displayed in the
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   547
minibuffer.  Otherwise, the buffer is displayed in view-mode.
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   548
ARGS is of the form (BUFFER-NAME &optional FILE), where BUFFER-NAME is
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   549
the name of the buffer to create, and FILE is the name of the file
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   550
being viewed."
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   551
  (let ((prev-buf (gensym "prev-buf-"))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   552
	(v-b-name (car args))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   553
	(v-m-rest (cdr args)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   554
    `(let ((view-buf-name ,v-b-name)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   555
	   (,prev-buf (current-buffer)))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   556
       (get-buffer-create view-buf-name)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   557
       (kill-buffer view-buf-name)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   558
       (get-buffer-create view-buf-name)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   559
       (set-buffer view-buf-name)
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   560
       (save-excursion
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   561
	 ,@body)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   562
       (case (count-lines (point-min) (point-max))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   563
	 ((0)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   564
	  (kill-buffer view-buf-name)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   565
	  (message "(No output)"))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   566
	 ((1)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   567
	  (let ((msg (hg-chomp (buffer-substring (point-min) (point-max)))))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   568
	    (kill-buffer view-buf-name)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   569
	    (message "%s" msg)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   570
	 (t
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   571
	  (pop-to-buffer view-buf-name)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   572
	  (setq hg-prev-buffer ,prev-buf)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   573
	  (hg-view-mode ,prev-buf ,@v-m-rest))))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   574
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   575
(put 'hg-view-output 'lisp-indent-function 1)
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   576

995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   577
;;; Context save and restore across revert.
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   578
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   579
(defun hg-position-context (pos)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   580
  "Return information to help find the given position again."
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   581
  (let* ((end (min (point-max) (+ pos 98))))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   582
    (list pos
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   583
	  (buffer-substring (max (point-min) (- pos 2)) end)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   584
	  (- end pos))))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   585
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   586
(defun hg-buffer-context ()
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   587
  "Return information to help restore a user's editing context.
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   588
This is useful across reverts and merges, where a context is likely
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   589
to have moved a little, but not really changed."
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   590
  (let ((point-context (hg-position-context (point)))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   591
	(mark-context (let ((mark (mark-marker)))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   592
			(and mark (hg-position-context mark)))))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   593
    (list point-context mark-context)))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   594
	
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   595
(defun hg-find-context (ctx)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   596
  "Attempt to find a context in the given buffer.
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   597
Always returns a valid, hopefully sane, position."
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   598
  (let ((pos (nth 0 ctx))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   599
	(str (nth 1 ctx))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   600
	(fixup (nth 2 ctx)))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   601
    (save-excursion
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   602
      (goto-char (max (point-min) (- pos 15000)))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   603
      (if (and (not (equal str ""))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   604
	       (search-forward str nil t))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   605
	  (- (point) fixup)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   606
	(max pos (point-min))))))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   607
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   608
(defun hg-restore-context (ctx)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   609
  "Attempt to restore the user's editing context."
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   610
  (let ((point-context (nth 0 ctx))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   611
	(mark-context (nth 1 ctx)))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   612
    (goto-char (hg-find-context point-context))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   613
    (when mark-context
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   614
      (set-mark (hg-find-context mark-context)))))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   615
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   616

947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   617
;;; Hooks.
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   618
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   619
(defun hg-mode-line (&optional force)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   620
  "Update the modeline with the current status of a file.
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   621
An update occurs if optional argument FORCE is non-nil,
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   622
hg-update-modeline is non-nil, or we have not yet checked the state of
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   623
the file."
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   624
  (when (and (hg-root) (or force hg-update-modeline (not hg-mode)))
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   625
    (let ((status (hg-file-status buffer-file-name)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   626
      (setq hg-status status
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   627
	    hg-mode (and status (concat " Hg:"
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   628
					(car (hg-tip))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   629
					(cdr (assq status
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   630
						   '((normal . "")
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   631
						     (removed . "r")
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   632
						     (added . "a")
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   633
						     (modified . "m")))))))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   634
      status)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   635
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   636
(defun hg-mode ()
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   637
  "Minor mode for Mercurial distributed SCM integration.
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   638
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   639
The Mercurial mode user interface is based on that of VC mode, so if
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   640
you're already familiar with VC, the same keybindings and functions
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   641
will generally work.
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   642
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   643
Below is a list of many common SCM tasks.  In the list, `G/L'
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   644
indicates whether a key binding is global (G) to a repository or local
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   645
(L) to a file.  Many commands take a prefix argument.
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   646
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   647
SCM Task                              G/L  Key Binding  Command Name
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   648
--------                              ---  -----------  ------------
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   649
Help overview (what you are reading)  G    C-c h h      hg-help-overview
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   650
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   651
Tell Mercurial to manage a file       G    C-c h a      hg-add
1179
8acf62f579d8 Fix mercurial.el help.
jdc@uwo.ca
parents: 1178
diff changeset
   652
Commit changes to current file only   L    C-x v n      hg-commit-start
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   653
Undo changes to file since commit     L    C-x v u      hg-revert-buffer
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   654
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   655
Diff file vs last checkin             L    C-x v =      hg-diff
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   656
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   657
View file change history              L    C-x v l      hg-log
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   658
View annotated file                   L    C-x v a      hg-annotate
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   659
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   660
Diff repo vs last checkin             G    C-c h =      hg-diff-repo
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   661
View status of files in repo          G    C-c h s      hg-status
1179
8acf62f579d8 Fix mercurial.el help.
jdc@uwo.ca
parents: 1178
diff changeset
   662
Commit all changes                    G    C-c h c      hg-commit-start
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   663
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   664
Undo all changes since last commit    G    C-c h U      hg-revert
1179
8acf62f579d8 Fix mercurial.el help.
jdc@uwo.ca
parents: 1178
diff changeset
   665
View repo change history              G    C-c h l      hg-log-repo
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   666
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   667
See changes that can be pulled        G    C-c h ,      hg-incoming
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   668
Pull changes                          G    C-c h <      hg-pull
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   669
Update working directory after pull   G    C-c h u      hg-update
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   670
See changes that can be pushed        G    C-c h .      hg-outgoing
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   671
Push changes                          G    C-c h >      hg-push"
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   672
  (run-hooks 'hg-mode-hook))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   673
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   674
(defun hg-find-file-hook ()
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   675
  (when (hg-mode-line)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   676
    (hg-mode)))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   677
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   678
(add-hook 'find-file-hooks 'hg-find-file-hook)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   679
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   680
(defun hg-after-save-hook ()
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   681
  (let ((old-status hg-status))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   682
    (hg-mode-line)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   683
    (if (and (not old-status) hg-status)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   684
	(hg-mode))))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   685
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   686
(add-hook 'after-save-hook 'hg-after-save-hook)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   687
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   688

6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   689
;;; User interface functions.
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   690
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   691
(defun hg-help-overview ()
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   692
  "This is an overview of the Mercurial SCM mode for Emacs.
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   693
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   694
You can find the source code, license (GPL v2), and credits for this
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   695
code by typing `M-x find-library mercurial RET'."
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   696
  (interactive)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   697
  (hg-view-output ("Mercurial Help Overview")
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   698
    (insert (documentation 'hg-help-overview))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   699
    (let ((pos (point)))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   700
      (insert (documentation 'hg-mode))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   701
      (goto-char pos)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   702
      (kill-line))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   703
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   704
(defun hg-add (path)
996
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   705
  "Add PATH to the Mercurial repository on the next commit.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   706
With a prefix argument, prompt for the path to add."
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   707
  (interactive (list (hg-read-file-name " to add")))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   708
  (let ((buf (current-buffer))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   709
	(update (equal buffer-file-name path)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   710
    (hg-view-output (hg-output-buffer-name)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   711
      (apply 'call-process (hg-binary) nil t nil (list "add" path)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   712
    (when update
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   713
      (with-current-buffer buf
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   714
	(hg-mode-line)))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   715
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   716
(defun hg-addremove ()
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   717
  (interactive)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   718
  (error "not implemented"))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   719
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   720
(defun hg-annotate ()
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   721
  (interactive)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   722
  (error "not implemented"))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   723
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   724
(defun hg-commit-toggle-file (pos)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   725
  "Toggle whether or not the file at POS will be committed."
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   726
  (interactive "d")
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   727
  (save-excursion
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   728
    (goto-char pos)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   729
    (let ((face (get-text-property pos 'face))
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   730
	  (inhibit-read-only t)
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   731
	  bol)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   732
      (beginning-of-line)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   733
      (setq bol (+ (point) 4))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   734
      (end-of-line)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   735
      (if (eq face 'bold)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   736
	  (progn
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   737
	    (remove-text-properties bol (point) '(face nil))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   738
	    (message "%s will not be committed"
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   739
		     (buffer-substring bol (point))))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   740
	(add-text-properties bol (point) '(face bold))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   741
	(message "%s will be committed"
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   742
		 (buffer-substring bol (point)))))))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   743
	
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   744
(defun hg-commit-mouse-clicked (event)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   745
  "Toggle whether or not the file at POS will be committed."
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   746
  (interactive "@e")
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   747
  (hg-commit-toggle-file (hg-event-point event)))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   748
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   749
(defun hg-commit-kill ()
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   750
  "Kill the commit currently being prepared."
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   751
  (interactive)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   752
  (when (or (not (buffer-modified-p)) (y-or-n-p "Really kill this commit? "))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   753
    (let ((buf hg-prev-buffer))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   754
      (kill-buffer nil)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   755
      (switch-to-buffer buf))))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   756
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   757
(defun hg-commit-finish ()
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   758
  "Finish preparing a commit, and perform the actual commit.
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   759
The hook hg-pre-commit-hook is run before anything else is done.  If
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   760
the commit message is empty and hg-commit-allow-empty-message is nil,
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   761
an error is raised.  If the list of files to commit is empty and
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   762
hg-commit-allow-empty-file-list is nil, an error is raised."
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   763
  (interactive)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   764
  (let ((root hg-root))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   765
    (save-excursion
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   766
      (run-hooks 'hg-pre-commit-hook)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   767
      (goto-char (point-min))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   768
      (search-forward hg-commit-message-start)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   769
      (let (message files)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   770
	(let ((start (point)))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   771
	  (goto-char (point-max))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   772
	  (search-backward hg-commit-message-end)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   773
	  (setq message (hg-strip (buffer-substring start (point)))))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   774
	(when (and (= (length message) 0)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   775
		   (not hg-commit-allow-empty-message))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   776
	  (error "Cannot proceed - commit message is empty"))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   777
	(forward-line 1)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   778
	(beginning-of-line)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   779
	(while (< (point) (point-max))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   780
	  (let ((pos (+ (point) 4)))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   781
	    (end-of-line)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   782
	    (when (eq (get-text-property pos 'face) 'bold)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   783
	      (end-of-line)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   784
	      (setq files (cons (buffer-substring pos (point)) files))))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   785
	  (forward-line 1))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   786
	(when (and (= (length files) 0)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   787
		   (not hg-commit-allow-empty-file-list))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   788
	  (error "Cannot proceed - no files to commit"))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   789
	(setq message (concat message "\n"))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   790
	(apply 'hg-run0 "--cwd" hg-root "commit" "-m" message files))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   791
      (let ((buf hg-prev-buffer))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   792
	(kill-buffer nil)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   793
	(switch-to-buffer buf))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   794
      (hg-do-across-repo root
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   795
	(hg-mode-line)))))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   796
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   797
(defun hg-commit-mode ()
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   798
  "Mode for describing a commit of changes to a Mercurial repository.
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   799
This involves two actions: describing the changes with a commit
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   800
message, and choosing the files to commit.
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   801
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   802
To describe the commit, simply type some text in the designated area.
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   803
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   804
By default, all modified, added and removed files are selected for
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   805
committing.  Files that will be committed are displayed in bold face\;
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   806
those that will not are displayed in normal face.
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   807
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   808
To toggle whether a file will be committed, move the cursor over a
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   809
particular file and hit space or return.  Alternatively, middle click
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   810
on the file.
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   811
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   812
Key bindings
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   813
------------
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   814
\\[hg-commit-finish]		proceed with commit
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   815
\\[hg-commit-kill]		kill commit
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   816
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   817
\\[hg-diff-repo]		view diff of pending changes"
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   818
  (interactive)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   819
  (use-local-map hg-commit-mode-map)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   820
  (set-syntax-table text-mode-syntax-table)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   821
  (setq local-abbrev-table text-mode-abbrev-table
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   822
	major-mode 'hg-commit-mode
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   823
	mode-name "Hg-Commit")
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   824
  (set-buffer-modified-p nil)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   825
  (setq buffer-undo-list nil)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   826
  (run-hooks 'text-mode-hook 'hg-commit-mode-hook))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   827
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   828
(defun hg-commit-start ()
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   829
  "Prepare a commit of changes to the repository containing the current file."
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   830
  (interactive)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   831
  (while hg-prev-buffer
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   832
    (set-buffer hg-prev-buffer))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   833
  (let ((root (hg-root))
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   834
	(prev-buffer (current-buffer))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   835
	modified-files)
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   836
    (unless root
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   837
      (error "Cannot commit outside a repository!"))
1024
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   838
    (hg-sync-buffers root)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   839
    (setq modified-files (hg-chomp (hg-run0 "--cwd" root "status" "-arm")))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   840
    (when (and (= (length modified-files) 0)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   841
	       (not hg-commit-allow-empty-file-list))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   842
      (error "No pending changes to commit"))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   843
    (let* ((buf-name (format "*Mercurial: Commit %s*" root)))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   844
      (pop-to-buffer (get-buffer-create buf-name))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   845
      (when (= (point-min) (point-max))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   846
	(set (make-local-variable 'hg-root) root)
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   847
	(setq hg-prev-buffer prev-buffer)
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   848
	(insert "\n")
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   849
	(let ((bol (point)))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   850
	  (insert hg-commit-message-end)
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   851
	  (add-text-properties bol (point) '(face bold-italic)))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   852
	(let ((file-area (point)))
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   853
	  (insert modified-files)
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   854
	  (goto-char file-area)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   855
	  (while (< (point) (point-max))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   856
	    (let ((bol (point)))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   857
	      (forward-char 1)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   858
	      (insert "  ")
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   859
	      (end-of-line)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   860
	      (add-text-properties (+ bol 4) (point)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   861
				   '(face bold mouse-face highlight)))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   862
	    (forward-line 1))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   863
	  (goto-char file-area)
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   864
	  (add-text-properties (point) (point-max)
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   865
			       `(keymap ,hg-commit-mode-file-map))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   866
	  (goto-char (point-min))
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   867
	  (insert hg-commit-message-start)
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   868
	  (add-text-properties (point-min) (point) '(face bold-italic))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   869
	  (insert "\n\n")
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   870
	  (forward-line -1)
1004
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   871
	  (save-excursion
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   872
	    (goto-char (point-max))
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   873
	    (search-backward hg-commit-message-end)
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   874
	    (add-text-properties (match-beginning 0) (point-max)
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   875
				 '(read-only t))
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   876
	    (goto-char (point-min))
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   877
	    (search-forward hg-commit-message-start)
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   878
	    (add-text-properties (match-beginning 0) (match-end 0)
ad6fcceaf59b Emacs: improved GNU Emacs support.
bos@serpentine.internal.keyresearch.com
parents: 1003
diff changeset
   879
				 '(read-only t)))
999
bb391518bc28 Emacs: first cut at commit support.
Bryan O'Sullivan <bos@serpentine.com>
parents: 996
diff changeset
   880
	  (hg-commit-mode))))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   881
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   882
(defun hg-diff (path &optional rev1 rev2)
996
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   883
  "Show the differences between REV1 and REV2 of PATH.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   884
When called interactively, the default behaviour is to treat REV1 as
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   885
the tip revision, REV2 as the current edited version of the file, and
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   886
PATH as the file edited in the current buffer.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   887
With a prefix argument, prompt for all of these."
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   888
  (interactive (list (hg-read-file-name " to diff")
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   889
		     (hg-read-rev " to start with")
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   890
		     (let ((rev2 (hg-read-rev " to end with" 'working-dir)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   891
		       (and (not (eq rev2 'working-dir)) rev2))))
1024
5b257e419816 Sync buffers prior to doing a diff.
bos@serpentine.internal.keyresearch.com
parents: 1011
diff changeset
   892
  (hg-sync-buffers path)
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   893
  (let ((a-path (hg-abbrev-file-name path))
1027
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   894
	(r1 (or rev1 "tip"))
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   895
	diff)
1027
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   896
    (hg-view-output ((cond
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   897
		      ((and (equal r1 "tip") (not rev2))
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   898
		       (format "Mercurial: Diff against tip of %s" a-path))
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   899
		      ((equal r1 rev2)
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   900
		       (format "Mercurial: Diff of rev %s of %s" r1 a-path))
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   901
		      (t
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   902
		       (format "Mercurial: Diff from rev %s to %s of %s"
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   903
			       r1 (or rev2 "Current") a-path))))
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   904
      (if rev2
1027
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   905
	  (call-process (hg-binary) nil t nil "diff" "-r" r1 "-r" rev2 path)
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   906
	(call-process (hg-binary) nil t nil "diff" "-r" r1 path))
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   907
      (diff-mode)
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   908
      (setq diff (not (= (point-min) (point-max))))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   909
      (font-lock-fontify-buffer))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
   910
    diff))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   911
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   912
(defun hg-diff-repo ()
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   913
  "Show the differences between the working copy and the tip revision."
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   914
  (interactive)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   915
  (hg-diff (hg-root)))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   916
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   917
(defun hg-forget (path)
996
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   918
  "Lose track of PATH, which has been added, but not yet committed.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   919
This will prevent the file from being incorporated into the Mercurial
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   920
repository on the next commit.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   921
With a prefix argument, prompt for the path to forget."
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   922
  (interactive (list (hg-read-file-name " to forget")))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   923
  (let ((buf (current-buffer))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   924
	(update (equal buffer-file-name path)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   925
    (hg-view-output (hg-output-buffer-name)
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   926
      (apply 'call-process (hg-binary) nil t nil (list "forget" path)))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   927
    (when update
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   928
      (with-current-buffer buf
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   929
	(hg-mode-line)))))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   930
  
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   931
(defun hg-incoming (&optional repo)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   932
  "Display changesets present in REPO that are not present locally."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   933
  (interactive (list (hg-read-repo-name " where changes would come from")))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   934
  (hg-view-output ((format "Mercurial: Incoming from %s to %s"
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   935
			   (hg-abbrev-file-name (hg-root))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   936
			   (hg-abbrev-file-name
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   937
			    (or repo hg-incoming-repository))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   938
    (call-process (hg-binary) nil t nil "incoming"
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   939
		  (or repo hg-incoming-repository))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   940
    (hg-log-mode)))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   941
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   942
(defun hg-init ()
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   943
  (interactive)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   944
  (error "not implemented"))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   945
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   946
(defun hg-log-mode ()
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   947
  "Mode for viewing a Mercurial change log."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   948
  (goto-char (point-min))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   949
  (when (looking-at "^searching for changes")
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   950
    (kill-entire-line))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   951
  (run-hooks 'hg-log-mode-hook))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   952
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   953
(defun hg-log (path &optional rev1 rev2)
996
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
   954
  "Display the revision history of PATH, between REV1 and REV2.
1027
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   955
REV1 defaults to hg-log-limit changes from the tip revision, while
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   956
REV2 defaults to the tip.
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   957
With a prefix argument, prompt for each parameter."
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   958
  (interactive (list (hg-read-file-name " to log")
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   959
		     (hg-read-rev " to start with" "-1")
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
   960
		     (hg-read-rev " to end with" (format "-%d" hg-log-limit))))
1027
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   961
  (let ((a-path (hg-abbrev-file-name path))
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   962
	(r1 (or rev1 (format "-%d" hg-log-limit)))
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   963
	(r2 (or rev2 rev1 "-1")))
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   964
    (hg-view-output ((if (equal r1 r2)
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   965
			 (format "Mercurial: Log of rev %s of %s" rev1 a-path)
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   966
		       (format "Mercurial: Log from rev %s to %s of %s"
cb31576ed3e4 Emacs: fix up hg-log and hg-diff to operate more uniformly.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1026
diff changeset
   967
			       r1 r2 a-path)))
1175
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   968
      (let ((revs (format "%s:%s" r1 r2)))
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   969
	(if (> (length path) (length (hg-root path)))
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   970
	    (call-process (hg-binary) nil t nil "log" "-r" revs path)
7e909ceeb36a Emacs: fix invocations of "hg log" to match current behaviour of log.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1029
diff changeset
   971
	  (call-process (hg-binary) nil t nil "log" "-r" revs)))
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   972
      (hg-log-mode))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   973
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   974
(defun hg-log-repo (path &optional rev1 rev2)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   975
  "Display the revision history of the repository containing PATH.
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   976
History is displayed between REV1, which defaults to the tip, and
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   977
REV2, which defaults to the initial revision.
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   978
Variable hg-log-limit controls the number of log entries displayed."
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   979
  (interactive (list (hg-read-file-name " to log")
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   980
		     (hg-read-rev " to start with" "tip")
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   981
		     (hg-read-rev " to end with" (format "-%d" hg-log-limit))))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   982
  (hg-log (hg-root path) rev1 rev2))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
   983
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   984
(defun hg-outgoing (&optional repo)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   985
  "Display changesets present locally that are not present in REPO."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   986
  (interactive (list (hg-read-repo-name " where changes would go to" nil
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   987
					hg-outgoing-repository)))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   988
  (hg-view-output ((format "Mercurial: Outgoing from %s to %s"
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   989
			   (hg-abbrev-file-name (hg-root))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   990
			   (hg-abbrev-file-name
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   991
			    (or repo hg-outgoing-repository))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   992
    (call-process (hg-binary) nil t nil "outgoing"
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   993
		  (or repo hg-outgoing-repository))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
   994
    (hg-log-mode)))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   995
1246
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
   996
(defun hg-pull (&optional repo)
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
   997
  "Pull changes from repository REPO.
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
   998
This does not update the working directory."
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
   999
  (interactive (list (hg-read-repo-name " to pull from")))
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1000
  (hg-view-output ((format "Mercurial: Pull to %s from %s"
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1001
			   (hg-abbrev-file-name (hg-root))
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1002
			   (hg-abbrev-file-name
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1003
			    (or repo hg-incoming-repository))))
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1004
    (call-process (hg-binary) nil t nil "pull"
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1005
		  (or repo hg-incoming-repository))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1006
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1007
(defun hg-push (&optional repo)
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1008
  "Push changes to repository REPO."
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1009
  (interactive (list (hg-read-repo-name " to push to")))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1010
  (hg-view-output ((format "Mercurial: Push from %s to %s"
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1011
			   (hg-abbrev-file-name (hg-root))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1012
			   (hg-abbrev-file-name
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1013
			    (or repo hg-outgoing-repository))))
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1014
    (call-process (hg-binary) nil t nil "push"
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1015
		  (or repo hg-outgoing-repository))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1016
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1017
(defun hg-revert-buffer-internal ()
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1018
  (let ((ctx (hg-buffer-context)))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1019
    (message "Reverting %s..." buffer-file-name)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1020
    (hg-run0 "revert" buffer-file-name)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1021
    (revert-buffer t t t)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1022
    (hg-restore-context ctx)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1023
    (hg-mode-line)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1024
    (message "Reverting %s...done" buffer-file-name)))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1025
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1026
(defun hg-revert-buffer ()
996
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1027
  "Revert current buffer's file back to the latest committed version.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1028
If the file has not changed, nothing happens.  Otherwise, this
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1029
displays a diff and asks for confirmation before reverting."
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1030
  (interactive)
995
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1031
  (let ((vc-suppress-confirm nil)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1032
	(obuf (current-buffer))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1033
	diff)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1034
    (vc-buffer-sync)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1035
    (unwind-protect
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1036
	(setq diff (hg-diff buffer-file-name))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1037
      (when diff
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1038
	(unless (yes-or-no-p "Discard changes? ")
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1039
	  (error "Revert cancelled")))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1040
      (when diff
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1041
	(let ((buf (current-buffer)))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1042
	  (delete-window (selected-window))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1043
	  (kill-buffer buf))))
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1044
    (set-buffer obuf)
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1045
    (when diff
1e4b009b379e Emacs support: add hg-revert-buffer.
Bryan O'Sullivan <bos@serpentine.com>
parents: 958
diff changeset
  1046
      (hg-revert-buffer-internal))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1047
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1048
(defun hg-root (&optional path)
996
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1049
  "Return the root of the repository that contains the given path.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1050
If the path is outside a repository, return nil.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1051
When called interactively, the root is printed.  A prefix argument
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1052
prompts for a path to check."
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
  1053
  (interactive (list (hg-read-file-name)))
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1054
  (if (or path (not hg-root))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1055
      (let ((root (do ((prev nil dir)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1056
		       (dir (file-name-directory (or path buffer-file-name ""))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1057
			    (file-name-directory (directory-file-name dir))))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1058
		      ((equal prev dir))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1059
		    (when (file-directory-p (concat dir ".hg"))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1060
		      (return dir)))))
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1061
	(when (interactive-p)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1062
	  (if root
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1063
	      (message "The root of this repository is `%s'." root)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1064
	    (message "The path `%s' is not in a Mercurial repository."
1029
b5f0ccad8917 Emacs: implement hg-incoming, hg-outgoing and hg-push.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1027
diff changeset
  1065
		     (hg-abbrev-file-name path))))
1003
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1066
	root)
6dfc9cc71f42 Emacs support: numerous changes.
bos@serpentine.internal.keyresearch.com
parents: 1001
diff changeset
  1067
    hg-root))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1068
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
  1069
(defun hg-status (path)
996
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1070
  "Print revision control status of a file or directory.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1071
With prefix argument, prompt for the path to give status for.
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1072
Names are displayed relative to the repository root."
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
  1073
  (interactive (list (hg-read-file-name " for status" (hg-root))))
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
  1074
  (let ((root (hg-root)))
996
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1075
    (hg-view-output ((format "Mercurial: Status of %s in %s"
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1076
			     (let ((name (substring (expand-file-name path)
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1077
						    (length root))))
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1078
			       (if (> (length name) 0)
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1079
				   name
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1080
				 "*"))
5ed566574486 Emacs: document existing functions.
Bryan O'Sullivan <bos@serpentine.com>
parents: 995
diff changeset
  1081
			     (hg-abbrev-file-name root)))
947
4cabedfab66e In-progress Emacs snapshot.
Bryan O'Sullivan <bos@serpentine.com>
parents: 945
diff changeset
  1082
      (apply 'call-process (hg-binary) nil t nil
955
307ca8ca234f Remove -C alias for --cwd
mpm@selenic.com
parents: 948
diff changeset
  1083
	     (list "--cwd" root "status" path)))))
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1084
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1085
(defun hg-undo ()
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1086
  (interactive)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1087
  (error "not implemented"))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1088
1246
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1089
(defun hg-update ()
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1090
  (interactive)
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1091
  (error "not implemented"))
ae96c85fb0af mercurial.el: implement hg-pull, and stub in hg-update.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1179
diff changeset
  1092
944
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1093
(defun hg-version-other-window ()
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1094
  (interactive)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1095
  (error "not implemented"))
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1096
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1097

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1098
(provide 'mercurial)
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1099
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1100

41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1101
;;; Local Variables:
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1102
;;; prompt-to-byte-compile: nil
41ca6bf19735 Initial skeleton for mercurial.el.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1103
;;; end: