contrib/hg-test-mode.el
author Gregory Szorc <gregory.szorc@gmail.com>
Tue, 11 Sep 2018 19:50:07 -0700
changeset 39604 335ae4d0a552
parent 22125 7fce964be27d
child 41785 b6a757de2fff
permissions -rw-r--r--
bundlerepo: dynamically create repository type from base repository Previously, bundlerepository inherited from localrepo.localrepository. You simply instantiated a bundlerepository and its __init__ called localrepo.localrepository.__init__. Things were simple. Unfortunately, this strategy is limiting because it assumes that the base repository is a localrepository instance. And it assumes various properties of localrepository, such as the arguments its __init__ takes. And it prevents us from changing behavior of localrepository.__init__ without also having to change derived classes. Previous and ongoing work to abstract storage revealed these limitations. This commit changes the initialization strategy of bundle repositories to dynamically create a type to represent the repository. Instead of a static type, we instantiate a new local repo instance via localrepo.instance(). We then combine its __class__ with bundlerepository to produce a new type. This ensures that no matter how localrepo.instance() decides to create a repository object, we can derive a bundle repo object from it. i.e. localrepo.instance() could return a type that isn't a localrepository and it would "just work." Well, it would "just work" if bundlerepository's custom implementations only accessed attributes in the documented repository interface. I'm pretty sure it violates the interface contract in a handful of places. But we can worry about that another day. This change gets us closer to doing more clever things around instantiating repository instances without having to worry about teaching bundlerepository about them. .. api:: ``bundlerepo.bundlerepository`` is no longer usable on its own. The class is combined with the class of the base repository it is associated with at run-time. New bundlerepository instances can be obtained by calling ``bundlerepo.instance()`` or ``bundlerepo.makebundlerepository()``. Differential Revision: https://phab.mercurial-scm.org/D4555
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22081
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
;; hg-test-mode.el - Major mode for editing Mercurial tests
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
;;
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     3
;; Copyright 2014 Matt Mackall <mpm@selenic.com>
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
;; "I have no idea what I'm doing"
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     5
;;
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     6
;; This software may be used and distributed according to the terms of the
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
;; GNU General Public License version 2 or any later version.
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     8
;;
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     9
;; To enable, add something like the following to your .emacs:
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    10
;;
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    11
;; (if (file-exists-p "~/hg/contrib/hg-test-mode.el")
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    12
;;    (load "~/hg/contrib/hg-test-mode.el"))
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    13
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    14
(defvar hg-test-mode-hook nil)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    15
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    16
(defvar hg-test-mode-map
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    17
  (let ((map (make-keymap)))
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    18
    (define-key map "\C-j" 'newline-and-indent)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    19
    map)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    20
  "Keymap for hg test major mode")
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    21
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    22
(add-to-list 'auto-mode-alist '("\\.t\\'" . hg-test-mode))
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    23
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    24
(defconst hg-test-font-lock-keywords-1
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    25
  (list
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    26
   '("^  \\(\\$\\|>>>\\) " 1 font-lock-builtin-face)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    27
   '("^  \\(>\\|\\.\\.\\.\\) " 1 font-lock-constant-face)
22125
7fce964be27d hg-test-mode: make exit code highlight work again
Matt Mackall <mpm@selenic.com>
parents: 22109
diff changeset
    28
   '("^  \\([[][0-9]+[]]\\)$" 1 font-lock-warning-face)
22109
feab93a24e81 hg-test-mode: don't highlight variables in output
Matt Mackall <mpm@selenic.com>
parents: 22092
diff changeset
    29
   '("^  \\(.*?\\)\\(\\( [(][-a-z]+[)]\\)*\\)$" 1 font-lock-string-face)
22092
6e5ff8e26af6 hg-test-mode: colorize HGFOO and TESTFOO environment variables
Matt Mackall <mpm@selenic.com>
parents: 22081
diff changeset
    30
   '("\\$?\\(HG\\|TEST\\)\\w+=?" . font-lock-variable-name-face)
22081
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    31
   '("^  \\(.*?\\)\\(\\( [(][-a-z]+[)]\\)+\\)$" 2 font-lock-type-face)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    32
   '("^#.*" . font-lock-preprocessor-face)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    33
   '("^\\([^ ].*\\)$" 1 font-lock-comment-face)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    34
   )
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    35
  "Minimal highlighting expressions for hg-test mode")
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    36
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    37
(defvar hg-test-font-lock-keywords hg-test-font-lock-keywords-1
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    38
  "Default highlighting expressions for hg-test mode")
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    39
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    40
(defvar hg-test-mode-syntax-table
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    41
  (let ((st (make-syntax-table)))
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    42
    (modify-syntax-entry ?\" "w" st) ;; disable standard quoting
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    43
    st)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    44
"Syntax table for hg-test mode")
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    45
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    46
(defun hg-test-mode ()
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    47
  (interactive)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    48
  (kill-all-local-variables)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    49
  (use-local-map hg-test-mode-map)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    50
  (set-syntax-table hg-test-mode-syntax-table)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    51
  (set (make-local-variable 'font-lock-defaults) '(hg-test-font-lock-keywords))
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    52
  (setq major-mode 'hg-test-mode)
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    53
  (setq mode-name "hg-test")
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    54
  (run-hooks 'hg-test-mode-hook))
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    55
ed426b011612 contrib: add emacs mode for *.t files
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    56
(provide 'hg-test-mode)