wireprotoserver: move all wire protocol handling logic out of hgweb
Previous patches from several days ago worked to isolate processing
of HTTP wire protocol requests to wireprotoserver. We still had a
little logic in hgweb. If feels like the right time to finish the
job.
This commit moves WSGI request servicing from hgweb to wireprotoserver.
The ugly dict holding the parsed request is no more. I think the new
code is cleaner.
As part of this, we now process wire protocol requests before the
block to obtain the "query" variable. This makes it clear that this
wonky "query" variable is not used by the wire protocol.
The wonkiest part about this code is the HTTP 404. I'm actually not
sure what all is going on here. It looks like the code is trying to
prevent URL with path components that specify a command from not
working. That part I grok. What I don't grok is why we need to send
a 404. I would think it would be OK to no-op and let another handler
try to service the request. But if we do this, we get some subrepo
test failures. So it looks like something is expecting the HTTP 404
and reacting to it in a specific way. It /might/ be possible to
change the behavior here. But it isn't something I'm comfortable
doing because I don't understand the problem space.
Differential Revision: https://phab.mercurial-scm.org/D2740
;; hg-test-mode.el - Major mode for editing Mercurial tests
;;
;; Copyright 2014 Matt Mackall <mpm@selenic.com>
;; "I have no idea what I'm doing"
;;
;; This software may be used and distributed according to the terms of the
;; GNU General Public License version 2 or any later version.
;;
;; To enable, add something like the following to your .emacs:
;;
;; (if (file-exists-p "~/hg/contrib/hg-test-mode.el")
;; (load "~/hg/contrib/hg-test-mode.el"))
(defvar hg-test-mode-hook nil)
(defvar hg-test-mode-map
(let ((map (make-keymap)))
(define-key map "\C-j" 'newline-and-indent)
map)
"Keymap for hg test major mode")
(add-to-list 'auto-mode-alist '("\\.t\\'" . hg-test-mode))
(defconst hg-test-font-lock-keywords-1
(list
'("^ \\(\\$\\|>>>\\) " 1 font-lock-builtin-face)
'("^ \\(>\\|\\.\\.\\.\\) " 1 font-lock-constant-face)
'("^ \\([[][0-9]+[]]\\)$" 1 font-lock-warning-face)
'("^ \\(.*?\\)\\(\\( [(][-a-z]+[)]\\)*\\)$" 1 font-lock-string-face)
'("\\$?\\(HG\\|TEST\\)\\w+=?" . font-lock-variable-name-face)
'("^ \\(.*?\\)\\(\\( [(][-a-z]+[)]\\)+\\)$" 2 font-lock-type-face)
'("^#.*" . font-lock-preprocessor-face)
'("^\\([^ ].*\\)$" 1 font-lock-comment-face)
)
"Minimal highlighting expressions for hg-test mode")
(defvar hg-test-font-lock-keywords hg-test-font-lock-keywords-1
"Default highlighting expressions for hg-test mode")
(defvar hg-test-mode-syntax-table
(let ((st (make-syntax-table)))
(modify-syntax-entry ?\" "w" st) ;; disable standard quoting
st)
"Syntax table for hg-test mode")
(defun hg-test-mode ()
(interactive)
(kill-all-local-variables)
(use-local-map hg-test-mode-map)
(set-syntax-table hg-test-mode-syntax-table)
(set (make-local-variable 'font-lock-defaults) '(hg-test-font-lock-keywords))
(setq major-mode 'hg-test-mode)
(setq mode-name "hg-test")
(run-hooks 'hg-test-mode-hook))
(provide 'hg-test-mode)