comparison mercurial/parser.py @ 31922:0f41f1e3c75c

parser: preserve order of keyword arguments This helps building dict(key1=value1, ...) in deterministic way.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 09 Apr 2017 11:58:27 +0900
parents 2156934b7917
children 90896b61fe26
comparison
equal deleted inserted replaced
31921:2156934b7917 31922:0f41f1e3c75c
152 if not varkey and kwstart > len(poskeys) + len(keys): 152 if not varkey and kwstart > len(poskeys) + len(keys):
153 raise error.ParseError(_("%(func)s takes at most %(nargs)d positional " 153 raise error.ParseError(_("%(func)s takes at most %(nargs)d positional "
154 "arguments") 154 "arguments")
155 % {'func': funcname, 155 % {'func': funcname,
156 'nargs': len(poskeys) + len(keys)}) 156 'nargs': len(poskeys) + len(keys)})
157 args = {} 157 args = util.sortdict()
158 # consume positional arguments 158 # consume positional arguments
159 for k, x in zip(poskeys, trees[:kwstart]): 159 for k, x in zip(poskeys, trees[:kwstart]):
160 args[k] = x 160 args[k] = x
161 if varkey: 161 if varkey:
162 args[varkey] = trees[len(args):kwstart] 162 args[varkey] = trees[len(args):kwstart]
163 else: 163 else:
164 for k, x in zip(keys, trees[len(args):kwstart]): 164 for k, x in zip(keys, trees[len(args):kwstart]):
165 args[k] = x 165 args[k] = x
166 # remainder should be keyword arguments 166 # remainder should be keyword arguments
167 if optkey: 167 if optkey:
168 args[optkey] = {} 168 args[optkey] = util.sortdict()
169 for x in trees[kwstart:]: 169 for x in trees[kwstart:]:
170 if x[0] != keyvaluenode or x[1][0] != keynode: 170 if x[0] != keyvaluenode or x[1][0] != keynode:
171 raise error.ParseError(_("%(func)s got an invalid argument") 171 raise error.ParseError(_("%(func)s got an invalid argument")
172 % {'func': funcname}) 172 % {'func': funcname})
173 k = x[1][1] 173 k = x[1][1]