Patchwork [2,of,3] templates: introduce revescape filter for escaping symbolic revisions

login
register
mail settings
Submitter Anton Shestakov
Date July 13, 2015, 12:18 p.m.
Message ID <87beef5bc365a4168853.1436789939@neuro>
Download mbox | patch
Permalink /patch/9961/
State Superseded
Commit 3a33412792f1e5274ccbc0ae4a4d924012bf7dc6
Headers show

Comments

Anton Shestakov - July 13, 2015, 12:18 p.m.
# HG changeset patch
# User Anton Shestakov <av6@dwimlabs.net>
# Date 1436690876 -28800
#      Sun Jul 12 16:47:56 2015 +0800
# Node ID 87beef5bc365a41688531b1e1df161485710cf38
# Parent  4b2713531ee8955fd282ae77cedfc3308c7fa98a
templates: introduce revescape filter for escaping symbolic revisions

There needs to be a way to escape symbolic revisions containing forward
slashes, but urlescape filter doesn't escape slashes (in fact, it is used in
places where forward slashes must be preserved).

The filter considers @ to be safe just for bookmarks like @ and @default to
look good in urls.

Patch

diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
--- a/mercurial/hgweb/webutil.py
+++ b/mercurial/hgweb/webutil.py
@@ -6,10 +6,11 @@ 
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-import os, copy, urllib
+import os, copy
 from mercurial import match, patch, error, ui, util, pathutil, context
 from mercurial.i18n import _
 from mercurial.node import hex, nullid, short
+from mercurial.templatefilters import revescape
 from common import ErrorResponse, paritygen
 from common import HTTP_NOT_FOUND
 import difflib
@@ -281,7 +282,7 @@  def changelistentry(web, ctx, tmpl):
 
 def symrevorshortnode(req, ctx):
     if 'node' in req.form:
-        return urllib.quote(req.form['node'][0])
+        return revescape(req.form['node'][0])
     else:
         return short(ctx.node())
 
diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py
--- a/mercurial/templatefilters.py
+++ b/mercurial/templatefilters.py
@@ -283,6 +283,12 @@  def person(author):
     f = author.find('@')
     return author[:f].replace('.', ' ')
 
+def revescape(text):
+    """:revescape: Any text. Escapes all "special" characters and also forward
+    slashes, but not @. For example, "@foo bar/baz" becomes "@foo%20bar%2Fbaz".
+    """
+    return urllib.quote(text, safe='@')
+
 def rfc3339date(text):
     """:rfc3339date: Date. Returns a date using the Internet date format
     specified in RFC 3339: "2009-08-18T13:00:13+02:00".
@@ -402,6 +408,7 @@  filters = {
     "obfuscate": obfuscate,
     "permissions": permissions,
     "person": person,
+    "revescape": revescape,
     "rfc3339date": rfc3339date,
     "rfc822date": rfc822date,
     "short": short,