Patchwork D7055: phabricator: update hgmatcher to cope with the new data format

login
register
mail settings
Submitter phabricator
Date Oct. 10, 2019, 9:53 p.m.
Message ID <differential-rev-PHID-DREV-ouyagtccb5qfvfyd6g5h-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/42211/
State Superseded
Headers show

Comments

phabricator - Oct. 10, 2019, 9:53 p.m.
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




To: Kwan, #hg-reviewers
Cc: mercurial-devel
phabricator - Oct. 12, 2019, 2:02 p.m.
Kwan added inline comments.

INLINE COMMENTS

> phabricator.py:155-156
> +            if value.startswith(b'{') and value.endswith(b'}'):
> +                r1json = json.loads(value)
> +                r2json = json.loads(r2params[key][0])
> +                if r1json != r2json:

These will need converting to unicode first for py3.5 (I keep forgetting about loads only accepting bytes from 3.6 onwards).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7055/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7055

To: Kwan, #hg-reviewers
Cc: mercurial-devel
phabricator - Oct. 16, 2019, 8:41 p.m.
durin42 added inline comments.

INLINE COMMENTS

> Kwan wrote in phabricator.py:155-156
> These will need converting to unicode first for py3.5 (I keep forgetting about loads only accepting bytes from 3.6 onwards).

That might be a nudge towards dropping 3.5 support. We've already got problems on 3.5. :(

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7055/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7055

To: Kwan, #hg-reviewers
Cc: durin42, mercurial-devel

Patch

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(