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