sapling/mercurial
Gregory Szorc 71e33a969a bundle2: use a sorted dict for holding parameters
An upcoming change that introduces a 2nd part parameter to a part
reveals that `hg debugbundle` isn't deterministic because parameters
are stored on n plain, unsorted dict.

While we could change that command to sort before output, I think
the more important underlying issue is that bundle2 reading is taking
an ordered data structure and converting it to an unordered one.
Plugging in util.sortdict() fixes that problem while preserving API
compatibility.

This patch also appears to shine light on the fact that we don't
have tests verifying parts with multiple parameters roundtrip
correctly. That would be a good thing to test (and fuzz)... someday.
2016-07-17 14:51:00 -07:00
..
default.d mergetools.rc: find OSX FileMerge in the new location inside Xcode 4.3 2015-10-16 11:37:34 +02:00
help sslutil: support defining cipher list 2016-07-17 10:59:32 -07:00
hgweb paper: make different blocks of annotated lines have different colors 2016-07-16 14:49:07 +08:00
httpclient httpclient: update to 54868ef054d2 of httpplus 2016-06-27 11:53:50 -04:00
pure pure: write a really lazy version of pure indexObject 2016-04-24 14:21:38 +03:00
templates spartan: make different blocks of annotated lines have different colors 2016-07-16 15:06:19 +08:00
__init__.py mercurial: implement a source transforming module loader on Python 3 2016-07-04 11:18:03 -07:00
ancestor.py py3: convert to next() function 2016-05-16 21:30:53 +00:00
archival.py pycompat: switch to util.stringio for py3 compat 2016-04-10 20:55:37 +00:00
base85.c base85: fix comparison of an int and a long 2015-08-21 14:29:42 -04:00
bdiff_module.c bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bdiff.c bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bdiff.h bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bitmanipulation.h internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
bookmarks.py bookmarks: abort 'push -B .' when no active bookmark 2016-06-13 23:50:26 +02:00
branchmap.py branchmap: remove unused exception variable 2016-03-12 16:08:19 -08:00
bundle2.py bundle2: use a sorted dict for holding parameters 2016-07-17 14:51:00 -07:00
bundlerepo.py i18n: translate abort messages 2016-06-14 11:53:55 +02:00
byterange.py pycompat: switch to util.urlreq/util.urlerr for py3 compat 2016-04-06 23:22:12 +00:00
changegroup.py changegroup: don't send empty subdirectory manifest groups 2016-06-16 15:15:33 -07:00
changelog.py changelog: avoid slicing raw data until needed 2016-03-06 15:40:20 -08:00
cmdutil.py revert: don't backup if no files reverted in interactive mode (issue4793) 2016-06-30 08:38:19 -07:00
commands.py annotate: handle empty files earlier 2016-07-11 15:45:34 +02:00
commandserver.py commandserver: use SOMAXCONN as queue size of pending connections 2016-07-16 14:48:58 +09:00
compat.h compat: define ssize_t as int on 32bit Windows, silences C4142 warning 2016-07-15 23:54:56 +09:00
config.py config: add hasconfig method and supporting plumbing 2016-01-07 19:45:03 -08:00
context.py context: eliminate handling of linenumber being None in annotate 2016-07-11 14:44:19 +02:00
copies.py py3: convert to next() function 2016-05-16 21:30:53 +00:00
crecord.py crecord: drop unused "operation" parameter from filterpatch function 2016-06-07 11:57:11 +02:00
dagparser.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
dagutil.py dagutil: use absolute_import 2015-08-08 19:04:09 -07:00
demandimport.py demandimport: delay loading for "from a import b" with absolute_import 2016-06-19 02:17:33 +09:00
destutil.py destutil: add the ability to specify a search space for rebase destination 2016-04-30 18:41:08 +02:00
diffhelpers.c diffhelpers: fix botched return statement from e48d70075d8a 2015-01-28 13:34:20 -05:00
dirs.c dirs._addpath: reinstate use of Py_CLEAR 2015-04-07 20:43:04 -07:00
dirstate.py dirstate: make restoring from backup avoid ambiguity of file stat 2016-06-13 05:11:56 +09:00
discovery.py bookmarks: allow pushing active bookmark on new remote head (issue5236) 2016-05-24 23:36:27 +02:00
dispatch.py dispatch: always load extensions before running shell aliases (issue5230) 2016-05-07 14:12:23 +01:00
dummycert.pem ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs 2014-09-26 02:19:48 +02:00
encoding.py encoding: use range() instead of xrange() 2016-03-11 21:27:26 -08:00
error.py shelve: make unshelve be able to abort in any case 2016-07-13 16:16:18 +01:00
exchange.py i18n: translate abort messages 2016-06-14 11:53:55 +02:00
exewrapper.c exewrapper: add .dll to LoadLibrary() argument 2016-04-27 09:23:39 -07:00
extensions.py extensions: move uisetup and extsetup to standalone functions 2016-06-30 10:31:50 +01:00
fancyopts.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
filelog.py filelog: use absolute_import 2015-08-08 19:11:42 -07:00
filemerge.py templater: factor out function that creates templater from string template 2016-04-10 17:23:09 +09:00
fileset.py fileset: fix copy/paste in eol() error message 2016-02-18 22:32:18 -05:00
formatter.py py3: conditionalize cPickle import by adding in util 2016-06-04 14:38:00 +05:30
graphmod.py revset: add new topographical sort 2016-06-13 18:20:00 +01:00
hbisect.py with: use context manager in bisect save_state 2016-01-15 13:14:49 -08:00
help.py help: report source of aliases 2016-04-08 18:35:49 +00:00
hg.py share: move magic string to a constant 2016-06-24 10:32:38 +01:00
hook.py hook: split config reading further 2016-04-14 17:03:49 -07:00
httpconnection.py httpconnection: remove use of sslkwargs 2016-05-25 19:54:06 -07:00
httppeer.py py3: conditionalize httplib import 2016-06-28 16:01:53 +05:30
i18n.py i18n: use unicode literal 2016-06-25 17:40:53 -07:00
keepalive.py keepalive: switch from thread to threading module 2016-07-01 19:17:16 +05:30
localrepo.py scmutil: improve documentation of revset APIs 2016-06-25 19:12:20 -07:00
lock.py lock: clear postrelease hooks list after usage 2016-04-16 09:00:15 -07:00
lsprof.py lsprof: use print function 2016-01-02 11:40:53 -08:00
lsprofcalltree.py lsprofcalltree: use print function 2016-01-02 11:45:29 -08:00
mail.py mail: unsupport smtp.verifycert (BC) 2016-06-04 11:13:28 -07:00
manifest.c lazymanifest: fix typo s/typles/tuples/ 2016-05-27 21:24:05 +02:00
manifest.py i18n: translate abort messages 2016-06-14 11:53:55 +02:00
match.py i18n: translate abort messages 2016-06-14 11:53:55 +02:00
mdiff.py mdiff: remove use of __slots__ 2016-06-25 13:52:46 -07:00
merge.py update: teach hg to override untracked dir with a tracked file on update 2016-07-01 17:42:55 +02:00
minirst.py help: search section of help topic by translated section name correctly 2016-05-13 07:19:59 +09:00
mpatch.c internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
namespaces.py namespaces: fix name/node confusion 2016-03-16 23:12:43 +00:00
node.py node: use byte literals to construct nullid and wdirid 2016-03-12 14:04:57 -08:00
obsolete.py i18n: translate abort messages 2016-06-14 11:53:55 +02:00
osutil.c osutil: stop using strcpy 2016-03-19 20:02:19 -04:00
parser.py parser: shorten prefix of alias parsing errors 2016-04-17 12:31:06 +09:00
parsers.c internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
patch.py patch: allow copy information to be passed in 2016-06-27 12:11:18 +02:00
pathencode.c pathencode: use hashlib.sha1 directly instead of indirecting through util 2016-06-10 00:25:07 -04:00
pathutil.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
peer.py py3: convert to next() function 2016-05-16 21:30:53 +00:00
phases.py phases: make writing phaseroots file out avoid ambiguity of file stat 2016-06-03 00:44:20 +09:00
policy.py policy: add cffi policy for PyPy 2016-06-07 15:35:58 +02:00
posix.py chgserver: extract utility to bind unix domain socket to long path 2016-05-21 16:52:04 +09:00
progress.py progress: stop excessive clearing (issue4801) 2016-05-06 17:53:06 -05:00
pushkey.py pushkey: use absolute_import 2015-08-08 19:57:27 -07:00
pvec.py pvec: use absolute_import 2015-12-21 21:32:58 -08:00
py3kcompat.py py3compat: use absolute_import 2015-12-21 21:31:57 -08:00
pycompat.py pycompat: make pycompat demandimport friendly 2016-07-17 19:48:04 +05:30
registrar.py registrar: add templatefunc to mark a function as template function (API) 2016-03-30 02:10:44 +09:00
repair.py treemanifests: actually strip directory manifests 2016-06-30 13:06:19 -07:00
repoview.py cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1 2016-06-10 00:12:33 -04:00
revlog.py revlog: add a fast path for "ambiguous identifier" 2016-06-22 21:30:49 +01:00
revset.py revset: check invalid function syntax "func-name"() explicitly 2016-06-27 20:44:14 +09:00
scmposix.py scmposix: use absolute_import 2015-12-21 21:24:49 -08:00
scmutil.py scmutil: improve documentation of revset APIs 2016-06-25 19:12:20 -07:00
scmwindows.py windows: read all global config files, not just the first (issue4491) (BC) 2015-10-12 20:13:12 +02:00
setdiscovery.py setdiscovery: use iterbatch interface instead of batch 2016-03-01 17:44:41 -05:00
similar.py cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1 2016-06-10 00:12:33 -04:00
simplemerge.py merge: minimize conflicts when common base is not shown (issue4447) 2016-02-10 09:06:08 -08:00
sshpeer.py i18n: translate abort messages 2016-06-14 11:53:55 +02:00
sshserver.py i18n: translate abort messages 2016-06-14 11:53:55 +02:00
sslutil.py sslutil: move comment about protocol constants 2016-07-17 11:03:08 -07:00
statichttprepo.py pycompat: switch to util.urlreq/util.urlerr for py3 compat 2016-04-06 23:22:12 +00:00
store.py store: use hashlib.sha1 directly instead of through util 2016-06-10 00:10:06 -04:00
streamclone.py streamclone: fix error when store files grow while stream cloning 2016-03-13 02:29:11 +01:00
strutil.py strutil: use absolute_import 2015-08-08 20:01:40 -07:00
subrepo.py error: make hintable exceptions reject unknown keyword arguments (API) 2016-07-11 21:40:02 +09:00
tagmerge.py tagmerge: use absolute_import 2015-08-08 20:10:46 -07:00
tags.py tags: silence hgtagsfnodes reading failures 2016-04-28 15:40:43 -05:00
templatefilters.py pycompat: switch to util.urlreq/util.urlerr for py3 compat 2016-04-06 23:22:12 +00:00
templatekw.py templatekw: use templatekeyword to mark a function as template keyword 2016-03-13 05:17:06 +09:00
templater.py templater: add separate() template function 2016-05-03 09:49:54 -07:00
transaction.py transaction: avoid ambiguity of file stat at restoring from backup 2016-06-13 05:11:56 +09:00
treediscovery.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
ui.py ui: path option to declare which revisions to push by default 2016-06-26 07:59:02 -07:00
unionrepo.py unionrepo: properly handle hidden linkrev in revlog (issue5070) 2016-02-22 23:36:04 +01:00
url.py url: add distribution and version to user-agent request header (BC) 2016-07-14 19:16:46 -07:00
util.h internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
util.py py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import 2016-07-13 23:38:29 +05:30
verify.py verify: specify unit for ui.progress when checking files 2016-03-11 20:18:41 +08:00
win32.py win32: use absolute_import 2015-08-08 18:52:59 -07:00
windows.py chgserver: extract utility to bind unix domain socket to long path 2016-05-21 16:52:04 +09:00
wireproto.py wireproto: extract repo filtering to standalone function 2016-07-15 13:41:34 -07:00
worker.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00