D7055: phabricator: update hgmatcher to cope with the new data format
Kwan (Ian Moody)
phabricator at mercurial-scm.org
Thu Oct 10 21:53:21 UTC 2019
Kwan created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
The new conduit format can't be matched by the existing matcher since it shifts
all the data into an urlencoded string of JSON, the order of which isn't stable
between runs. Instead detect JSON values of params and load them into python
dicts, which python will then naturally deep-equal compare.
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D7055
AFFECTED FILES
hgext/phabricator.py
CHANGE DETAILS
diff --git a/hgext/phabricator.py b/hgext/phabricator.py
--- a/hgext/phabricator.py
+++ b/hgext/phabricator.py
@@ -144,9 +144,21 @@
def hgmatcher(r1, r2):
if r1.uri != r2.uri or r1.method != r2.method:
return False
- r1params = r1.body.split(b'&')
- r2params = r2.body.split(b'&')
- return set(r1params) == set(r2params)
+ r1params = util.urlreq.parseqs(r1.body)
+ r2params = util.urlreq.parseqs(r2.body)
+ for key in r1params:
+ if key not in r2params:
+ return False
+ value = r1params[key][0]
+ # we want to compare json payloads without worrying about ordering
+ if value.startswith(b'{') and value.endswith(b'}'):
+ r1json = json.loads(value)
+ r2json = json.loads(r2params[key][0])
+ if r1json != r2json:
+ return False
+ elif r2params[key][0] != value:
+ return False
+ return True
def sanitiserequest(request):
request.body = re.sub(
To: Kwan, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list