Patchwork [3,of,9] parser: preserve order of keyword arguments

login
register
mail settings
Submitter Yuya Nishihara
Date April 12, 2017, 3:53 p.m.
Message ID <a773ef212277598db714.1492012399@mimosa>
Download mbox | patch
Permalink /patch/20134/
State Accepted
Headers show

Comments

Yuya Nishihara - April 12, 2017, 3:53 p.m.
# HG changeset patch
# User Yuya Nishihara <yuya@tcha.org>
# Date 1491706707 -32400
#      Sun Apr 09 11:58:27 2017 +0900
# Node ID a773ef212277598db714833be5c21297021a26ab
# Parent  46f15fc2b294842ae24c51f8b9eedcbf6852d920
parser: preserve order of keyword arguments

This helps building dict(key1=value1, ...) in deterministic way.

Patch

diff --git a/mercurial/parser.py b/mercurial/parser.py
--- a/mercurial/parser.py
+++ b/mercurial/parser.py
@@ -154,7 +154,7 @@  def buildargsdict(trees, funcname, argsp
                                  "arguments")
                                % {'func': funcname,
                                   'nargs': len(poskeys) + len(keys)})
-    args = {}
+    args = util.sortdict()
     # consume positional arguments
     for k, x in zip(poskeys, trees[:kwstart]):
         args[k] = x
@@ -165,7 +165,7 @@  def buildargsdict(trees, funcname, argsp
             args[k] = x
     # remainder should be keyword arguments
     if optkey:
-        args[optkey] = {}
+        args[optkey] = util.sortdict()
     for x in trees[kwstart:]:
         if x[0] != keyvaluenode or x[1][0] != keynode:
             raise error.ParseError(_("%(func)s got an invalid argument")
diff --git a/mercurial/templater.py b/mercurial/templater.py
--- a/mercurial/templater.py
+++ b/mercurial/templater.py
@@ -474,15 +474,15 @@  def _buildfuncargs(exp, context, curmeth
     ...     x = _parseexpr(expr)
     ...     n = getsymbol(x[1])
     ...     return _buildfuncargs(x[2], context, exprmethods, n, argspec)
-    >>> sorted(fargs('a(l=1, k=2)', 'k l m').keys())
-    ['k', 'l']
+    >>> fargs('a(l=1, k=2)', 'k l m').keys()
+    ['l', 'k']
     >>> args = fargs('a(opts=1, k=2)', '**opts')
-    >>> args.keys(), sorted(args['opts'].keys())
-    (['opts'], ['k', 'opts'])
+    >>> args.keys(), args['opts'].keys()
+    (['opts'], ['opts', 'k'])
     """
     def compiledict(xs):
-        return dict((k, compileexp(x, context, curmethods))
-                    for k, x in xs.iteritems())
+        return util.sortdict((k, compileexp(x, context, curmethods))
+                             for k, x in xs.iteritems())
     def compilelist(xs):
         return [compileexp(x, context, curmethods) for x in xs]
 
@@ -494,7 +494,7 @@  def _buildfuncargs(exp, context, curmeth
     _poskeys, varkey, _keys, optkey = argspec = parser.splitargspec(argspec)
     treeargs = parser.buildargsdict(getlist(exp), funcname, argspec,
                                     keyvaluenode='keyvalue', keynode='symbol')
-    compargs = {}
+    compargs = util.sortdict()
     if varkey:
         compargs[varkey] = compilelist(treeargs.pop(varkey))
     if optkey: