contrib/phabricator.py
changeset 39666 d8f07b16abfc
parent 38983 0dce1297dd01
--- a/contrib/phabricator.py	Sat Sep 15 00:19:09 2018 -0400
+++ b/contrib/phabricator.py	Sat Sep 15 00:20:03 2018 -0400
@@ -106,6 +106,37 @@
     b'phabricator.node': b'',
 }
 
+_VCR_FLAGS = [
+    (b'', b'test-vcr', b'',
+     _(b'Path to a vcr file. If nonexistent, will record a new vcr transcript'
+       b', otherwise will mock all http requests using the specified vcr file.'
+       b' (ADVANCED)'
+     )),
+]
+
+def vcrcommand(name, flags, spec):
+    fullflags = flags + _VCR_FLAGS
+    def decorate(fn):
+        def inner(*args, **kwargs):
+            cassette = kwargs.pop(r'test_vcr', None)
+            if cassette:
+                import hgdemandimport
+                with hgdemandimport.deactivated():
+                    import vcr as vcrmod
+                    import vcr.stubs as stubs
+                vcr = vcrmod.VCR(
+                    serializer=r'json',
+                    custom_patches=[
+                        (urlmod, 'httpconnection', stubs.VCRHTTPConnection),
+                        (urlmod, 'httpsconnection', stubs.VCRHTTPSConnection),
+                    ])
+                with vcr.use_cassette(cassette):
+                    return fn(*args, **kwargs)
+            return fn(*args, **kwargs)
+        inner.__name__ = fn.__name__
+        return command(name, fullflags, spec)(inner)
+    return decorate
+
 def urlencodenested(params):
     """like urlencode, but works with nested parameters.
 
@@ -215,7 +246,7 @@
         raise error.Abort(msg)
     return parsed[r'result']
 
-@command(b'debugcallconduit', [], _(b'METHOD'))
+@vcrcommand(b'debugcallconduit', [], _(b'METHOD'))
 def debugcallconduit(ui, repo, name):
     """call Conduit API
 
@@ -452,7 +483,7 @@
                           % b' '.join(sorted(unresolved)))
     return [entry[r'phid'] for entry in data]
 
-@command(b'phabsend',
+@vcrcommand(b'phabsend',
          [(b'r', b'rev', [], _(b'revisions to send'), _(b'REV')),
           (b'', b'amend', True, _(b'update commit messages')),
           (b'', b'reviewer', [], _(b'specify reviewers')),
@@ -909,7 +940,7 @@
         content = b'%s%s\n%s' % (header, desc, body)
         write(encoding.unitolocal(content))
 
-@command(b'phabread',
+@vcrcommand(b'phabread',
          [(b'', b'stack', False, _(b'read dependencies'))],
          _(b'DREVSPEC [OPTIONS]'))
 def phabread(ui, repo, spec, **opts):
@@ -936,7 +967,7 @@
     drevs = querydrev(repo, spec)
     readpatch(repo, drevs, ui.write)
 
-@command(b'phabupdate',
+@vcrcommand(b'phabupdate',
          [(b'', b'accept', False, _(b'accept revisions')),
           (b'', b'reject', False, _(b'reject revisions')),
           (b'', b'abandon', False, _(b'abandon revisions')),