##// END OF EJS Templates
phabricator: convert conduit response JSON unicode to bytes inside callconduit...
Ian Moody -
r42448:c340a8ac default
parent child Browse files
Show More
@@ -1,1013 +1,1017 b''
1 1 # phabricator.py - simple Phabricator integration
2 2 #
3 3 # Copyright 2017 Facebook, Inc.
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7 """simple Phabricator integration (EXPERIMENTAL)
8 8
9 9 This extension provides a ``phabsend`` command which sends a stack of
10 10 changesets to Phabricator, and a ``phabread`` command which prints a stack of
11 11 revisions in a format suitable for :hg:`import`, and a ``phabupdate`` command
12 12 to update statuses in batch.
13 13
14 14 By default, Phabricator requires ``Test Plan`` which might prevent some
15 15 changeset from being sent. The requirement could be disabled by changing
16 16 ``differential.require-test-plan-field`` config server side.
17 17
18 18 Config::
19 19
20 20 [phabricator]
21 21 # Phabricator URL
22 22 url = https://phab.example.com/
23 23
24 24 # Repo callsign. If a repo has a URL https://$HOST/diffusion/FOO, then its
25 25 # callsign is "FOO".
26 26 callsign = FOO
27 27
28 28 # curl command to use. If not set (default), use builtin HTTP library to
29 29 # communicate. If set, use the specified curl command. This could be useful
30 30 # if you need to specify advanced options that is not easily supported by
31 31 # the internal library.
32 32 curlcmd = curl --connect-timeout 2 --retry 3 --silent
33 33
34 34 [auth]
35 35 example.schemes = https
36 36 example.prefix = phab.example.com
37 37
38 38 # API token. Get it from https://$HOST/conduit/login/
39 39 example.phabtoken = cli-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
40 40 """
41 41
42 42 from __future__ import absolute_import
43 43
44 44 import contextlib
45 45 import itertools
46 46 import json
47 47 import operator
48 48 import re
49 49
50 50 from mercurial.node import bin, nullid
51 51 from mercurial.i18n import _
52 52 from mercurial import (
53 53 cmdutil,
54 54 context,
55 55 encoding,
56 56 error,
57 57 httpconnection as httpconnectionmod,
58 58 mdiff,
59 59 obsutil,
60 60 parser,
61 61 patch,
62 62 phases,
63 pycompat,
63 64 registrar,
64 65 scmutil,
65 66 smartset,
66 67 tags,
67 68 templateutil,
68 69 url as urlmod,
69 70 util,
70 71 )
71 72 from mercurial.utils import (
72 73 procutil,
73 74 stringutil,
74 75 )
75 76
76 77 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
77 78 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
78 79 # be specifying the version(s) of Mercurial they are tested with, or
79 80 # leave the attribute unspecified.
80 81 testedwith = 'ships-with-hg-core'
81 82
82 83 cmdtable = {}
83 84 command = registrar.command(cmdtable)
84 85
85 86 configtable = {}
86 87 configitem = registrar.configitem(configtable)
87 88
88 89 # developer config: phabricator.batchsize
89 90 configitem(b'phabricator', b'batchsize',
90 91 default=12,
91 92 )
92 93 configitem(b'phabricator', b'callsign',
93 94 default=None,
94 95 )
95 96 configitem(b'phabricator', b'curlcmd',
96 97 default=None,
97 98 )
98 99 # developer config: phabricator.repophid
99 100 configitem(b'phabricator', b'repophid',
100 101 default=None,
101 102 )
102 103 configitem(b'phabricator', b'url',
103 104 default=None,
104 105 )
105 106 configitem(b'phabsend', b'confirm',
106 107 default=False,
107 108 )
108 109
109 110 colortable = {
110 111 b'phabricator.action.created': b'green',
111 112 b'phabricator.action.skipped': b'magenta',
112 113 b'phabricator.action.updated': b'magenta',
113 114 b'phabricator.desc': b'',
114 115 b'phabricator.drev': b'bold',
115 116 b'phabricator.node': b'',
116 117 }
117 118
118 119 _VCR_FLAGS = [
119 120 (b'', b'test-vcr', b'',
120 121 _(b'Path to a vcr file. If nonexistent, will record a new vcr transcript'
121 122 b', otherwise will mock all http requests using the specified vcr file.'
122 123 b' (ADVANCED)'
123 124 )),
124 125 ]
125 126
126 127 def vcrcommand(name, flags, spec, helpcategory=None):
127 128 fullflags = flags + _VCR_FLAGS
128 129 def decorate(fn):
129 130 def inner(*args, **kwargs):
130 131 cassette = kwargs.pop(r'test_vcr', None)
131 132 if cassette:
132 133 import hgdemandimport
133 134 with hgdemandimport.deactivated():
134 135 import vcr as vcrmod
135 136 import vcr.stubs as stubs
136 137 vcr = vcrmod.VCR(
137 138 serializer=r'json',
138 139 custom_patches=[
139 140 (urlmod, 'httpconnection', stubs.VCRHTTPConnection),
140 141 (urlmod, 'httpsconnection',
141 142 stubs.VCRHTTPSConnection),
142 143 ])
143 144 with vcr.use_cassette(cassette):
144 145 return fn(*args, **kwargs)
145 146 return fn(*args, **kwargs)
146 147 inner.__name__ = fn.__name__
147 148 inner.__doc__ = fn.__doc__
148 149 return command(name, fullflags, spec, helpcategory=helpcategory)(inner)
149 150 return decorate
150 151
151 152 def urlencodenested(params):
152 153 """like urlencode, but works with nested parameters.
153 154
154 155 For example, if params is {'a': ['b', 'c'], 'd': {'e': 'f'}}, it will be
155 156 flattened to {'a[0]': 'b', 'a[1]': 'c', 'd[e]': 'f'} and then passed to
156 157 urlencode. Note: the encoding is consistent with PHP's http_build_query.
157 158 """
158 159 flatparams = util.sortdict()
159 160 def process(prefix, obj):
160 161 if isinstance(obj, bool):
161 162 obj = {True: b'true', False: b'false'}[obj] # Python -> PHP form
162 163 items = {list: enumerate, dict: lambda x: x.items()}.get(type(obj))
163 164 if items is None:
164 165 flatparams[prefix] = obj
165 166 else:
166 167 for k, v in items(obj):
167 168 if prefix:
168 169 process(b'%s[%s]' % (prefix, k), v)
169 170 else:
170 171 process(k, v)
171 172 process(b'', params)
172 173 return util.urlreq.urlencode(flatparams)
173 174
174 175 def readurltoken(repo):
175 176 """return conduit url, token and make sure they exist
176 177
177 178 Currently read from [auth] config section. In the future, it might
178 179 make sense to read from .arcconfig and .arcrc as well.
179 180 """
180 181 url = repo.ui.config(b'phabricator', b'url')
181 182 if not url:
182 183 raise error.Abort(_(b'config %s.%s is required')
183 184 % (b'phabricator', b'url'))
184 185
185 186 res = httpconnectionmod.readauthforuri(repo.ui, url, util.url(url).user)
186 187 token = None
187 188
188 189 if res:
189 190 group, auth = res
190 191
191 192 repo.ui.debug(b"using auth.%s.* for authentication\n" % group)
192 193
193 194 token = auth.get(b'phabtoken')
194 195
195 196 if not token:
196 197 raise error.Abort(_(b'Can\'t find conduit token associated to %s')
197 198 % (url,))
198 199
199 200 return url, token
200 201
201 202 def callconduit(repo, name, params):
202 203 """call Conduit API, params is a dict. return json.loads result, or None"""
203 204 host, token = readurltoken(repo)
204 205 url, authinfo = util.url(b'/'.join([host, b'api', name])).authinfo()
205 206 repo.ui.debug(b'Conduit Call: %s %s\n' % (url, params))
206 207 params = params.copy()
207 208 params[b'api.token'] = token
208 209 data = urlencodenested(params)
209 210 curlcmd = repo.ui.config(b'phabricator', b'curlcmd')
210 211 if curlcmd:
211 212 sin, sout = procutil.popen2(b'%s -d @- %s'
212 213 % (curlcmd, procutil.shellquote(url)))
213 214 sin.write(data)
214 215 sin.close()
215 216 body = sout.read()
216 217 else:
217 218 urlopener = urlmod.opener(repo.ui, authinfo)
218 219 request = util.urlreq.request(url, data=data)
219 220 with contextlib.closing(urlopener.open(request)) as rsp:
220 221 body = rsp.read()
221 222 repo.ui.debug(b'Conduit Response: %s\n' % body)
222 parsed = json.loads(body)
223 if parsed.get(r'error_code'):
223 parsed = pycompat.rapply(
224 lambda x: encoding.unitolocal(x) if isinstance(x, pycompat.unicode)
225 else x,
226 json.loads(body)
227 )
228 if parsed.get(b'error_code'):
224 229 msg = (_(b'Conduit Error (%s): %s')
225 % (parsed[r'error_code'], parsed[r'error_info']))
230 % (parsed[b'error_code'], parsed[b'error_info']))
226 231 raise error.Abort(msg)
227 return parsed[r'result']
232 return parsed[b'result']
228 233
229 234 @vcrcommand(b'debugcallconduit', [], _(b'METHOD'))
230 235 def debugcallconduit(ui, repo, name):
231 236 """call Conduit API
232 237
233 238 Call parameters are read from stdin as a JSON blob. Result will be written
234 239 to stdout as a JSON blob.
235 240 """
236 241 params = json.loads(ui.fin.read())
237 242 result = callconduit(repo, name, params)
238 243 s = json.dumps(result, sort_keys=True, indent=2, separators=(b',', b': '))
239 244 ui.write(b'%s\n' % s)
240 245
241 246 def getrepophid(repo):
242 247 """given callsign, return repository PHID or None"""
243 248 # developer config: phabricator.repophid
244 249 repophid = repo.ui.config(b'phabricator', b'repophid')
245 250 if repophid:
246 251 return repophid
247 252 callsign = repo.ui.config(b'phabricator', b'callsign')
248 253 if not callsign:
249 254 return None
250 255 query = callconduit(repo, b'diffusion.repository.search',
251 256 {b'constraints': {b'callsigns': [callsign]}})
252 if len(query[r'data']) == 0:
257 if len(query[b'data']) == 0:
253 258 return None
254 repophid = encoding.strtolocal(query[r'data'][0][r'phid'])
259 repophid = query[b'data'][0][b'phid']
255 260 repo.ui.setconfig(b'phabricator', b'repophid', repophid)
256 261 return repophid
257 262
258 263 _differentialrevisiontagre = re.compile(br'\AD([1-9][0-9]*)\Z')
259 264 _differentialrevisiondescre = re.compile(
260 265 br'^Differential Revision:\s*(?P<url>(?:.*)D(?P<id>[1-9][0-9]*))$', re.M)
261 266
262 267 def getoldnodedrevmap(repo, nodelist):
263 268 """find previous nodes that has been sent to Phabricator
264 269
265 270 return {node: (oldnode, Differential diff, Differential Revision ID)}
266 271 for node in nodelist with known previous sent versions, or associated
267 272 Differential Revision IDs. ``oldnode`` and ``Differential diff`` could
268 273 be ``None``.
269 274
270 275 Examines commit messages like "Differential Revision:" to get the
271 276 association information.
272 277
273 278 If such commit message line is not found, examines all precursors and their
274 279 tags. Tags with format like "D1234" are considered a match and the node
275 280 with that tag, and the number after "D" (ex. 1234) will be returned.
276 281
277 282 The ``old node``, if not None, is guaranteed to be the last diff of
278 283 corresponding Differential Revision, and exist in the repo.
279 284 """
280 285 unfi = repo.unfiltered()
281 286 nodemap = unfi.changelog.nodemap
282 287
283 288 result = {} # {node: (oldnode?, lastdiff?, drev)}
284 289 toconfirm = {} # {node: (force, {precnode}, drev)}
285 290 for node in nodelist:
286 291 ctx = unfi[node]
287 292 # For tags like "D123", put them into "toconfirm" to verify later
288 293 precnodes = list(obsutil.allpredecessors(unfi.obsstore, [node]))
289 294 for n in precnodes:
290 295 if n in nodemap:
291 296 for tag in unfi.nodetags(n):
292 297 m = _differentialrevisiontagre.match(tag)
293 298 if m:
294 299 toconfirm[node] = (0, set(precnodes), int(m.group(1)))
295 300 continue
296 301
297 302 # Check commit message
298 303 m = _differentialrevisiondescre.search(ctx.description())
299 304 if m:
300 305 toconfirm[node] = (1, set(precnodes), int(m.group(b'id')))
301 306
302 307 # Double check if tags are genuine by collecting all old nodes from
303 308 # Phabricator, and expect precursors overlap with it.
304 309 if toconfirm:
305 310 drevs = [drev for force, precs, drev in toconfirm.values()]
306 311 alldiffs = callconduit(unfi, b'differential.querydiffs',
307 312 {b'revisionIDs': drevs})
308 getnode = lambda d: bin(encoding.unitolocal(
309 getdiffmeta(d).get(r'node', b''))) or None
313 getnode = lambda d: bin(
314 getdiffmeta(d).get(b'node', b'')) or None
310 315 for newnode, (force, precset, drev) in toconfirm.items():
311 316 diffs = [d for d in alldiffs.values()
312 if int(d[r'revisionID']) == drev]
317 if int(d[b'revisionID']) == drev]
313 318
314 319 # "precursors" as known by Phabricator
315 320 phprecset = set(getnode(d) for d in diffs)
316 321
317 322 # Ignore if precursors (Phabricator and local repo) do not overlap,
318 323 # and force is not set (when commit message says nothing)
319 324 if not force and not bool(phprecset & precset):
320 325 tagname = b'D%d' % drev
321 326 tags.tag(repo, tagname, nullid, message=None, user=None,
322 327 date=None, local=True)
323 328 unfi.ui.warn(_(b'D%s: local tag removed - does not match '
324 329 b'Differential history\n') % drev)
325 330 continue
326 331
327 332 # Find the last node using Phabricator metadata, and make sure it
328 333 # exists in the repo
329 334 oldnode = lastdiff = None
330 335 if diffs:
331 lastdiff = max(diffs, key=lambda d: int(d[r'id']))
336 lastdiff = max(diffs, key=lambda d: int(d[b'id']))
332 337 oldnode = getnode(lastdiff)
333 338 if oldnode and oldnode not in nodemap:
334 339 oldnode = None
335 340
336 341 result[newnode] = (oldnode, lastdiff, drev)
337 342
338 343 return result
339 344
340 345 def getdiff(ctx, diffopts):
341 346 """plain-text diff without header (user, commit message, etc)"""
342 347 output = util.stringio()
343 348 for chunk, _label in patch.diffui(ctx.repo(), ctx.p1().node(), ctx.node(),
344 349 None, opts=diffopts):
345 350 output.write(chunk)
346 351 return output.getvalue()
347 352
348 353 def creatediff(ctx):
349 354 """create a Differential Diff"""
350 355 repo = ctx.repo()
351 356 repophid = getrepophid(repo)
352 357 # Create a "Differential Diff" via "differential.createrawdiff" API
353 358 params = {b'diff': getdiff(ctx, mdiff.diffopts(git=True, context=32767))}
354 359 if repophid:
355 360 params[b'repositoryPHID'] = repophid
356 361 diff = callconduit(repo, b'differential.createrawdiff', params)
357 362 if not diff:
358 363 raise error.Abort(_(b'cannot create diff for %s') % ctx)
359 364 return diff
360 365
361 366 def writediffproperties(ctx, diff):
362 367 """write metadata to diff so patches could be applied losslessly"""
363 368 params = {
364 b'diff_id': diff[r'id'],
369 b'diff_id': diff[b'id'],
365 370 b'name': b'hg:meta',
366 371 b'data': json.dumps({
367 372 b'user': ctx.user(),
368 373 b'date': b'%d %d' % ctx.date(),
369 374 b'node': ctx.hex(),
370 375 b'parent': ctx.p1().hex(),
371 376 }),
372 377 }
373 378 callconduit(ctx.repo(), b'differential.setdiffproperty', params)
374 379
375 380 params = {
376 b'diff_id': diff[r'id'],
381 b'diff_id': diff[b'id'],
377 382 b'name': b'local:commits',
378 383 b'data': json.dumps({
379 384 ctx.hex(): {
380 385 b'author': stringutil.person(ctx.user()),
381 386 b'authorEmail': stringutil.email(ctx.user()),
382 387 b'time': ctx.date()[0],
383 388 },
384 389 }),
385 390 }
386 391 callconduit(ctx.repo(), b'differential.setdiffproperty', params)
387 392
388 393 def createdifferentialrevision(ctx, revid=None, parentrevid=None, oldnode=None,
389 394 olddiff=None, actions=None):
390 395 """create or update a Differential Revision
391 396
392 397 If revid is None, create a new Differential Revision, otherwise update
393 398 revid. If parentrevid is not None, set it as a dependency.
394 399
395 400 If oldnode is not None, check if the patch content (without commit message
396 401 and metadata) has changed before creating another diff.
397 402
398 403 If actions is not None, they will be appended to the transaction.
399 404 """
400 405 repo = ctx.repo()
401 406 if oldnode:
402 407 diffopts = mdiff.diffopts(git=True, context=32767)
403 408 oldctx = repo.unfiltered()[oldnode]
404 409 neednewdiff = (getdiff(ctx, diffopts) != getdiff(oldctx, diffopts))
405 410 else:
406 411 neednewdiff = True
407 412
408 413 transactions = []
409 414 if neednewdiff:
410 415 diff = creatediff(ctx)
411 transactions.append({b'type': b'update', b'value': diff[r'phid']})
416 transactions.append({b'type': b'update', b'value': diff[b'phid']})
412 417 else:
413 418 # Even if we don't need to upload a new diff because the patch content
414 419 # does not change. We might still need to update its metadata so
415 420 # pushers could know the correct node metadata.
416 421 assert olddiff
417 422 diff = olddiff
418 423 writediffproperties(ctx, diff)
419 424
420 425 # Use a temporary summary to set dependency. There might be better ways but
421 426 # I cannot find them for now. But do not do that if we are updating an
422 427 # existing revision (revid is not None) since that introduces visible
423 428 # churns (someone edited "Summary" twice) on the web page.
424 429 if parentrevid and revid is None:
425 430 summary = b'Depends on D%s' % parentrevid
426 431 transactions += [{b'type': b'summary', b'value': summary},
427 432 {b'type': b'summary', b'value': b' '}]
428 433
429 434 if actions:
430 435 transactions += actions
431 436
432 437 # Parse commit message and update related fields.
433 438 desc = ctx.description()
434 439 info = callconduit(repo, b'differential.parsecommitmessage',
435 440 {b'corpus': desc})
436 for k, v in info[r'fields'].items():
441 for k, v in info[b'fields'].items():
437 442 if k in [b'title', b'summary', b'testPlan']:
438 443 transactions.append({b'type': k, b'value': v})
439 444
440 445 params = {b'transactions': transactions}
441 446 if revid is not None:
442 447 # Update an existing Differential Revision
443 448 params[b'objectIdentifier'] = revid
444 449
445 450 revision = callconduit(repo, b'differential.revision.edit', params)
446 451 if not revision:
447 452 raise error.Abort(_(b'cannot create revision for %s') % ctx)
448 453
449 454 return revision, diff
450 455
451 456 def userphids(repo, names):
452 457 """convert user names to PHIDs"""
453 458 names = [name.lower() for name in names]
454 459 query = {b'constraints': {b'usernames': names}}
455 460 result = callconduit(repo, b'user.search', query)
456 461 # username not found is not an error of the API. So check if we have missed
457 462 # some names here.
458 data = result[r'data']
459 resolved = set(entry[r'fields'][r'username'].lower() for entry in data)
463 data = result[b'data']
464 resolved = set(entry[b'fields'][b'username'].lower() for entry in data)
460 465 unresolved = set(names) - resolved
461 466 if unresolved:
462 467 raise error.Abort(_(b'unknown username: %s')
463 468 % b' '.join(sorted(unresolved)))
464 return [entry[r'phid'] for entry in data]
469 return [entry[b'phid'] for entry in data]
465 470
466 471 @vcrcommand(b'phabsend',
467 472 [(b'r', b'rev', [], _(b'revisions to send'), _(b'REV')),
468 473 (b'', b'amend', True, _(b'update commit messages')),
469 474 (b'', b'reviewer', [], _(b'specify reviewers')),
470 475 (b'', b'confirm', None, _(b'ask for confirmation before sending'))],
471 476 _(b'REV [OPTIONS]'),
472 477 helpcategory=command.CATEGORY_IMPORT_EXPORT)
473 478 def phabsend(ui, repo, *revs, **opts):
474 479 """upload changesets to Phabricator
475 480
476 481 If there are multiple revisions specified, they will be send as a stack
477 482 with a linear dependencies relationship using the order specified by the
478 483 revset.
479 484
480 485 For the first time uploading changesets, local tags will be created to
481 486 maintain the association. After the first time, phabsend will check
482 487 obsstore and tags information so it can figure out whether to update an
483 488 existing Differential Revision, or create a new one.
484 489
485 490 If --amend is set, update commit messages so they have the
486 491 ``Differential Revision`` URL, remove related tags. This is similar to what
487 492 arcanist will do, and is more desired in author-push workflows. Otherwise,
488 493 use local tags to record the ``Differential Revision`` association.
489 494
490 495 The --confirm option lets you confirm changesets before sending them. You
491 496 can also add following to your configuration file to make it default
492 497 behaviour::
493 498
494 499 [phabsend]
495 500 confirm = true
496 501
497 502 phabsend will check obsstore and the above association to decide whether to
498 503 update an existing Differential Revision, or create a new one.
499 504 """
500 505 revs = list(revs) + opts.get(b'rev', [])
501 506 revs = scmutil.revrange(repo, revs)
502 507
503 508 if not revs:
504 509 raise error.Abort(_(b'phabsend requires at least one changeset'))
505 510 if opts.get(b'amend'):
506 511 cmdutil.checkunfinished(repo)
507 512
508 513 # {newnode: (oldnode, olddiff, olddrev}
509 514 oldmap = getoldnodedrevmap(repo, [repo[r].node() for r in revs])
510 515
511 516 confirm = ui.configbool(b'phabsend', b'confirm')
512 517 confirm |= bool(opts.get(b'confirm'))
513 518 if confirm:
514 519 confirmed = _confirmbeforesend(repo, revs, oldmap)
515 520 if not confirmed:
516 521 raise error.Abort(_(b'phabsend cancelled'))
517 522
518 523 actions = []
519 524 reviewers = opts.get(b'reviewer', [])
520 525 if reviewers:
521 526 phids = userphids(repo, reviewers)
522 527 actions.append({b'type': b'reviewers.add', b'value': phids})
523 528
524 529 drevids = [] # [int]
525 530 diffmap = {} # {newnode: diff}
526 531
527 532 # Send patches one by one so we know their Differential Revision IDs and
528 533 # can provide dependency relationship
529 534 lastrevid = None
530 535 for rev in revs:
531 536 ui.debug(b'sending rev %d\n' % rev)
532 537 ctx = repo[rev]
533 538
534 539 # Get Differential Revision ID
535 540 oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None))
536 541 if oldnode != ctx.node() or opts.get(b'amend'):
537 542 # Create or update Differential Revision
538 543 revision, diff = createdifferentialrevision(
539 544 ctx, revid, lastrevid, oldnode, olddiff, actions)
540 545 diffmap[ctx.node()] = diff
541 newrevid = int(revision[r'object'][r'id'])
546 newrevid = int(revision[b'object'][b'id'])
542 547 if revid:
543 548 action = b'updated'
544 549 else:
545 550 action = b'created'
546 551
547 552 # Create a local tag to note the association, if commit message
548 553 # does not have it already
549 554 m = _differentialrevisiondescre.search(ctx.description())
550 555 if not m or int(m.group(b'id')) != newrevid:
551 556 tagname = b'D%d' % newrevid
552 557 tags.tag(repo, tagname, ctx.node(), message=None, user=None,
553 558 date=None, local=True)
554 559 else:
555 560 # Nothing changed. But still set "newrevid" so the next revision
556 561 # could depend on this one.
557 562 newrevid = revid
558 563 action = b'skipped'
559 564
560 565 actiondesc = ui.label(
561 566 {b'created': _(b'created'),
562 567 b'skipped': _(b'skipped'),
563 568 b'updated': _(b'updated')}[action],
564 569 b'phabricator.action.%s' % action)
565 570 drevdesc = ui.label(b'D%s' % newrevid, b'phabricator.drev')
566 571 nodedesc = ui.label(bytes(ctx), b'phabricator.node')
567 572 desc = ui.label(ctx.description().split(b'\n')[0], b'phabricator.desc')
568 573 ui.write(_(b'%s - %s - %s: %s\n') % (drevdesc, actiondesc, nodedesc,
569 574 desc))
570 575 drevids.append(newrevid)
571 576 lastrevid = newrevid
572 577
573 578 # Update commit messages and remove tags
574 579 if opts.get(b'amend'):
575 580 unfi = repo.unfiltered()
576 581 drevs = callconduit(repo, b'differential.query', {b'ids': drevids})
577 582 with repo.wlock(), repo.lock(), repo.transaction(b'phabsend'):
578 583 wnode = unfi[b'.'].node()
579 584 mapping = {} # {oldnode: [newnode]}
580 585 for i, rev in enumerate(revs):
581 586 old = unfi[rev]
582 587 drevid = drevids[i]
583 drev = [d for d in drevs if int(d[r'id']) == drevid][0]
588 drev = [d for d in drevs if int(d[b'id']) == drevid][0]
584 589 newdesc = getdescfromdrev(drev)
585 newdesc = encoding.unitolocal(newdesc)
586 590 # Make sure commit message contain "Differential Revision"
587 591 if old.description() != newdesc:
588 592 if old.phase() == phases.public:
589 593 ui.warn(_("warning: not updating public commit %s\n")
590 594 % scmutil.formatchangeid(old))
591 595 continue
592 596 parents = [
593 597 mapping.get(old.p1().node(), (old.p1(),))[0],
594 598 mapping.get(old.p2().node(), (old.p2(),))[0],
595 599 ]
596 600 new = context.metadataonlyctx(
597 601 repo, old, parents=parents, text=newdesc,
598 602 user=old.user(), date=old.date(), extra=old.extra())
599 603
600 604 newnode = new.commit()
601 605
602 606 mapping[old.node()] = [newnode]
603 607 # Update diff property
604 608 writediffproperties(unfi[newnode], diffmap[old.node()])
605 609 # Remove local tags since it's no longer necessary
606 610 tagname = b'D%d' % drevid
607 611 if tagname in repo.tags():
608 612 tags.tag(repo, tagname, nullid, message=None, user=None,
609 613 date=None, local=True)
610 614 scmutil.cleanupnodes(repo, mapping, b'phabsend', fixphase=True)
611 615 if wnode in mapping:
612 616 unfi.setparents(mapping[wnode][0])
613 617
614 618 # Map from "hg:meta" keys to header understood by "hg import". The order is
615 619 # consistent with "hg export" output.
616 _metanamemap = util.sortdict([(r'user', b'User'), (r'date', b'Date'),
617 (r'node', b'Node ID'), (r'parent', b'Parent ')])
620 _metanamemap = util.sortdict([(b'user', b'User'), (b'date', b'Date'),
621 (b'node', b'Node ID'), (b'parent', b'Parent ')])
618 622
619 623 def _confirmbeforesend(repo, revs, oldmap):
620 624 url, token = readurltoken(repo)
621 625 ui = repo.ui
622 626 for rev in revs:
623 627 ctx = repo[rev]
624 628 desc = ctx.description().splitlines()[0]
625 629 oldnode, olddiff, drevid = oldmap.get(ctx.node(), (None, None, None))
626 630 if drevid:
627 631 drevdesc = ui.label(b'D%s' % drevid, b'phabricator.drev')
628 632 else:
629 633 drevdesc = ui.label(_(b'NEW'), b'phabricator.drev')
630 634
631 635 ui.write(_(b'%s - %s: %s\n')
632 636 % (drevdesc,
633 637 ui.label(bytes(ctx), b'phabricator.node'),
634 638 ui.label(desc, b'phabricator.desc')))
635 639
636 640 if ui.promptchoice(_(b'Send the above changes to %s (yn)?'
637 641 b'$$ &Yes $$ &No') % url):
638 642 return False
639 643
640 644 return True
641 645
642 646 _knownstatusnames = {b'accepted', b'needsreview', b'needsrevision', b'closed',
643 647 b'abandoned'}
644 648
645 649 def _getstatusname(drev):
646 650 """get normalized status name from a Differential Revision"""
647 return drev[r'statusName'].replace(b' ', b'').lower()
651 return drev[b'statusName'].replace(b' ', b'').lower()
648 652
649 653 # Small language to specify differential revisions. Support symbols: (), :X,
650 654 # +, and -.
651 655
652 656 _elements = {
653 657 # token-type: binding-strength, primary, prefix, infix, suffix
654 658 b'(': (12, None, (b'group', 1, b')'), None, None),
655 659 b':': (8, None, (b'ancestors', 8), None, None),
656 660 b'&': (5, None, None, (b'and_', 5), None),
657 661 b'+': (4, None, None, (b'add', 4), None),
658 662 b'-': (4, None, None, (b'sub', 4), None),
659 663 b')': (0, None, None, None, None),
660 664 b'symbol': (0, b'symbol', None, None, None),
661 665 b'end': (0, None, None, None, None),
662 666 }
663 667
664 668 def _tokenize(text):
665 669 view = memoryview(text) # zero-copy slice
666 670 special = b'():+-& '
667 671 pos = 0
668 672 length = len(text)
669 673 while pos < length:
670 674 symbol = b''.join(itertools.takewhile(lambda ch: ch not in special,
671 675 view[pos:]))
672 676 if symbol:
673 677 yield (b'symbol', symbol, pos)
674 678 pos += len(symbol)
675 679 else: # special char, ignore space
676 680 if text[pos] != b' ':
677 681 yield (text[pos], None, pos)
678 682 pos += 1
679 683 yield (b'end', None, pos)
680 684
681 685 def _parse(text):
682 686 tree, pos = parser.parser(_elements).parse(_tokenize(text))
683 687 if pos != len(text):
684 688 raise error.ParseError(b'invalid token', pos)
685 689 return tree
686 690
687 691 def _parsedrev(symbol):
688 692 """str -> int or None, ex. 'D45' -> 45; '12' -> 12; 'x' -> None"""
689 693 if symbol.startswith(b'D') and symbol[1:].isdigit():
690 694 return int(symbol[1:])
691 695 if symbol.isdigit():
692 696 return int(symbol)
693 697
694 698 def _prefetchdrevs(tree):
695 699 """return ({single-drev-id}, {ancestor-drev-id}) to prefetch"""
696 700 drevs = set()
697 701 ancestordrevs = set()
698 702 op = tree[0]
699 703 if op == b'symbol':
700 704 r = _parsedrev(tree[1])
701 705 if r:
702 706 drevs.add(r)
703 707 elif op == b'ancestors':
704 708 r, a = _prefetchdrevs(tree[1])
705 709 drevs.update(r)
706 710 ancestordrevs.update(r)
707 711 ancestordrevs.update(a)
708 712 else:
709 713 for t in tree[1:]:
710 714 r, a = _prefetchdrevs(t)
711 715 drevs.update(r)
712 716 ancestordrevs.update(a)
713 717 return drevs, ancestordrevs
714 718
715 719 def querydrev(repo, spec):
716 720 """return a list of "Differential Revision" dicts
717 721
718 722 spec is a string using a simple query language, see docstring in phabread
719 723 for details.
720 724
721 725 A "Differential Revision dict" looks like:
722 726
723 727 {
724 728 "id": "2",
725 729 "phid": "PHID-DREV-672qvysjcczopag46qty",
726 730 "title": "example",
727 731 "uri": "https://phab.example.com/D2",
728 732 "dateCreated": "1499181406",
729 733 "dateModified": "1499182103",
730 734 "authorPHID": "PHID-USER-tv3ohwc4v4jeu34otlye",
731 735 "status": "0",
732 736 "statusName": "Needs Review",
733 737 "properties": [],
734 738 "branch": null,
735 739 "summary": "",
736 740 "testPlan": "",
737 741 "lineCount": "2",
738 742 "activeDiffPHID": "PHID-DIFF-xoqnjkobbm6k4dk6hi72",
739 743 "diffs": [
740 744 "3",
741 745 "4",
742 746 ],
743 747 "commits": [],
744 748 "reviewers": [],
745 749 "ccs": [],
746 750 "hashes": [],
747 751 "auxiliary": {
748 752 "phabricator:projects": [],
749 753 "phabricator:depends-on": [
750 754 "PHID-DREV-gbapp366kutjebt7agcd"
751 755 ]
752 756 },
753 757 "repositoryPHID": "PHID-REPO-hub2hx62ieuqeheznasv",
754 758 "sourcePath": null
755 759 }
756 760 """
757 761 def fetch(params):
758 762 """params -> single drev or None"""
759 763 key = (params.get(r'ids') or params.get(r'phids') or [None])[0]
760 764 if key in prefetched:
761 765 return prefetched[key]
762 766 drevs = callconduit(repo, b'differential.query', params)
763 767 # Fill prefetched with the result
764 768 for drev in drevs:
765 prefetched[drev[r'phid']] = drev
766 prefetched[int(drev[r'id'])] = drev
769 prefetched[drev[b'phid']] = drev
770 prefetched[int(drev[b'id'])] = drev
767 771 if key not in prefetched:
768 772 raise error.Abort(_(b'cannot get Differential Revision %r')
769 773 % params)
770 774 return prefetched[key]
771 775
772 776 def getstack(topdrevids):
773 777 """given a top, get a stack from the bottom, [id] -> [id]"""
774 778 visited = set()
775 779 result = []
776 780 queue = [{r'ids': [i]} for i in topdrevids]
777 781 while queue:
778 782 params = queue.pop()
779 783 drev = fetch(params)
780 if drev[r'id'] in visited:
784 if drev[b'id'] in visited:
781 785 continue
782 visited.add(drev[r'id'])
783 result.append(int(drev[r'id']))
784 auxiliary = drev.get(r'auxiliary', {})
785 depends = auxiliary.get(r'phabricator:depends-on', [])
786 visited.add(drev[b'id'])
787 result.append(int(drev[b'id']))
788 auxiliary = drev.get(b'auxiliary', {})
789 depends = auxiliary.get(b'phabricator:depends-on', [])
786 790 for phid in depends:
787 791 queue.append({b'phids': [phid]})
788 792 result.reverse()
789 793 return smartset.baseset(result)
790 794
791 795 # Initialize prefetch cache
792 796 prefetched = {} # {id or phid: drev}
793 797
794 798 tree = _parse(spec)
795 799 drevs, ancestordrevs = _prefetchdrevs(tree)
796 800
797 801 # developer config: phabricator.batchsize
798 802 batchsize = repo.ui.configint(b'phabricator', b'batchsize')
799 803
800 804 # Prefetch Differential Revisions in batch
801 805 tofetch = set(drevs)
802 806 for r in ancestordrevs:
803 807 tofetch.update(range(max(1, r - batchsize), r + 1))
804 808 if drevs:
805 fetch({r'ids': list(tofetch)})
809 fetch({b'ids': list(tofetch)})
806 810 validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs))
807 811
808 812 # Walk through the tree, return smartsets
809 813 def walk(tree):
810 814 op = tree[0]
811 815 if op == b'symbol':
812 816 drev = _parsedrev(tree[1])
813 817 if drev:
814 818 return smartset.baseset([drev])
815 819 elif tree[1] in _knownstatusnames:
816 820 drevs = [r for r in validids
817 821 if _getstatusname(prefetched[r]) == tree[1]]
818 822 return smartset.baseset(drevs)
819 823 else:
820 824 raise error.Abort(_(b'unknown symbol: %s') % tree[1])
821 825 elif op in {b'and_', b'add', b'sub'}:
822 826 assert len(tree) == 3
823 827 return getattr(operator, op)(walk(tree[1]), walk(tree[2]))
824 828 elif op == b'group':
825 829 return walk(tree[1])
826 830 elif op == b'ancestors':
827 831 return getstack(walk(tree[1]))
828 832 else:
829 833 raise error.ProgrammingError(b'illegal tree: %r' % tree)
830 834
831 835 return [prefetched[r] for r in walk(tree)]
832 836
833 837 def getdescfromdrev(drev):
834 838 """get description (commit message) from "Differential Revision"
835 839
836 840 This is similar to differential.getcommitmessage API. But we only care
837 841 about limited fields: title, summary, test plan, and URL.
838 842 """
839 title = drev[r'title']
840 summary = drev[r'summary'].rstrip()
841 testplan = drev[r'testPlan'].rstrip()
843 title = drev[b'title']
844 summary = drev[b'summary'].rstrip()
845 testplan = drev[b'testPlan'].rstrip()
842 846 if testplan:
843 847 testplan = b'Test Plan:\n%s' % testplan
844 uri = b'Differential Revision: %s' % drev[r'uri']
848 uri = b'Differential Revision: %s' % drev[b'uri']
845 849 return b'\n\n'.join(filter(None, [title, summary, testplan, uri]))
846 850
847 851 def getdiffmeta(diff):
848 852 """get commit metadata (date, node, user, p1) from a diff object
849 853
850 854 The metadata could be "hg:meta", sent by phabsend, like:
851 855
852 856 "properties": {
853 857 "hg:meta": {
854 858 "date": "1499571514 25200",
855 859 "node": "98c08acae292b2faf60a279b4189beb6cff1414d",
856 860 "user": "Foo Bar <foo@example.com>",
857 861 "parent": "6d0abad76b30e4724a37ab8721d630394070fe16"
858 862 }
859 863 }
860 864
861 865 Or converted from "local:commits", sent by "arc", like:
862 866
863 867 "properties": {
864 868 "local:commits": {
865 869 "98c08acae292b2faf60a279b4189beb6cff1414d": {
866 870 "author": "Foo Bar",
867 871 "time": 1499546314,
868 872 "branch": "default",
869 873 "tag": "",
870 874 "commit": "98c08acae292b2faf60a279b4189beb6cff1414d",
871 875 "rev": "98c08acae292b2faf60a279b4189beb6cff1414d",
872 876 "local": "1000",
873 877 "parents": ["6d0abad76b30e4724a37ab8721d630394070fe16"],
874 878 "summary": "...",
875 879 "message": "...",
876 880 "authorEmail": "foo@example.com"
877 881 }
878 882 }
879 883 }
880 884
881 885 Note: metadata extracted from "local:commits" will lose time zone
882 886 information.
883 887 """
884 props = diff.get(r'properties') or {}
885 meta = props.get(r'hg:meta')
886 if not meta and props.get(r'local:commits'):
887 commit = sorted(props[r'local:commits'].values())[0]
888 props = diff.get(b'properties') or {}
889 meta = props.get(b'hg:meta')
890 if not meta and props.get(b'local:commits'):
891 commit = sorted(props[b'local:commits'].values())[0]
888 892 meta = {
889 r'date': r'%d 0' % commit[r'time'],
890 r'node': commit[r'rev'],
891 r'user': r'%s <%s>' % (commit[r'author'], commit[r'authorEmail']),
893 b'date': b'%d 0' % commit[b'time'],
894 b'node': commit[b'rev'],
895 b'user': b'%s <%s>' % (commit[b'author'], commit[b'authorEmail']),
892 896 }
893 if len(commit.get(r'parents', ())) >= 1:
894 meta[r'parent'] = commit[r'parents'][0]
897 if len(commit.get(b'parents', ())) >= 1:
898 meta[b'parent'] = commit[b'parents'][0]
895 899 return meta or {}
896 900
897 901 def readpatch(repo, drevs, write):
898 902 """generate plain-text patch readable by 'hg import'
899 903
900 904 write is usually ui.write. drevs is what "querydrev" returns, results of
901 905 "differential.query".
902 906 """
903 907 # Prefetch hg:meta property for all diffs
904 diffids = sorted(set(max(int(v) for v in drev[r'diffs']) for drev in drevs))
908 diffids = sorted(set(max(int(v) for v in drev[b'diffs']) for drev in drevs))
905 909 diffs = callconduit(repo, b'differential.querydiffs', {b'ids': diffids})
906 910
907 911 # Generate patch for each drev
908 912 for drev in drevs:
909 repo.ui.note(_(b'reading D%s\n') % drev[r'id'])
913 repo.ui.note(_(b'reading D%s\n') % drev[b'id'])
910 914
911 diffid = max(int(v) for v in drev[r'diffs'])
915 diffid = max(int(v) for v in drev[b'diffs'])
912 916 body = callconduit(repo, b'differential.getrawdiff',
913 917 {b'diffID': diffid})
914 918 desc = getdescfromdrev(drev)
915 919 header = b'# HG changeset patch\n'
916 920
917 921 # Try to preserve metadata from hg:meta property. Write hg patch
918 922 # headers that can be read by the "import" command. See patchheadermap
919 923 # and extract in mercurial/patch.py for supported headers.
920 924 meta = getdiffmeta(diffs[str(diffid)])
921 925 for k in _metanamemap.keys():
922 926 if k in meta:
923 927 header += b'# %s %s\n' % (_metanamemap[k], meta[k])
924 928
925 929 content = b'%s%s\n%s' % (header, desc, body)
926 write(encoding.unitolocal(content))
930 write(content)
927 931
928 932 @vcrcommand(b'phabread',
929 933 [(b'', b'stack', False, _(b'read dependencies'))],
930 934 _(b'DREVSPEC [OPTIONS]'),
931 935 helpcategory=command.CATEGORY_IMPORT_EXPORT)
932 936 def phabread(ui, repo, spec, **opts):
933 937 """print patches from Phabricator suitable for importing
934 938
935 939 DREVSPEC could be a Differential Revision identity, like ``D123``, or just
936 940 the number ``123``. It could also have common operators like ``+``, ``-``,
937 941 ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to
938 942 select a stack.
939 943
940 944 ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision``
941 945 could be used to filter patches by status. For performance reason, they
942 946 only represent a subset of non-status selections and cannot be used alone.
943 947
944 948 For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude
945 949 D2 and D4. ``:D9 & needsreview`` selects "Needs Review" revisions in a
946 950 stack up to D9.
947 951
948 952 If --stack is given, follow dependencies information and read all patches.
949 953 It is equivalent to the ``:`` operator.
950 954 """
951 955 if opts.get(b'stack'):
952 956 spec = b':(%s)' % spec
953 957 drevs = querydrev(repo, spec)
954 958 readpatch(repo, drevs, ui.write)
955 959
956 960 @vcrcommand(b'phabupdate',
957 961 [(b'', b'accept', False, _(b'accept revisions')),
958 962 (b'', b'reject', False, _(b'reject revisions')),
959 963 (b'', b'abandon', False, _(b'abandon revisions')),
960 964 (b'', b'reclaim', False, _(b'reclaim revisions')),
961 965 (b'm', b'comment', b'', _(b'comment on the last revision')),
962 966 ], _(b'DREVSPEC [OPTIONS]'),
963 967 helpcategory=command.CATEGORY_IMPORT_EXPORT)
964 968 def phabupdate(ui, repo, spec, **opts):
965 969 """update Differential Revision in batch
966 970
967 971 DREVSPEC selects revisions. See :hg:`help phabread` for its usage.
968 972 """
969 973 flags = [n for n in b'accept reject abandon reclaim'.split() if opts.get(n)]
970 974 if len(flags) > 1:
971 975 raise error.Abort(_(b'%s cannot be used together') % b', '.join(flags))
972 976
973 977 actions = []
974 978 for f in flags:
975 979 actions.append({b'type': f, b'value': b'true'})
976 980
977 981 drevs = querydrev(repo, spec)
978 982 for i, drev in enumerate(drevs):
979 983 if i + 1 == len(drevs) and opts.get(b'comment'):
980 984 actions.append({b'type': b'comment', b'value': opts[b'comment']})
981 985 if actions:
982 params = {b'objectIdentifier': drev[r'phid'],
986 params = {b'objectIdentifier': drev[b'phid'],
983 987 b'transactions': actions}
984 988 callconduit(repo, b'differential.revision.edit', params)
985 989
986 990 templatekeyword = registrar.templatekeyword()
987 991
988 992 @templatekeyword(b'phabreview', requires={b'ctx'})
989 993 def template_review(context, mapping):
990 994 """:phabreview: Object describing the review for this changeset.
991 995 Has attributes `url` and `id`.
992 996 """
993 997 ctx = context.resource(mapping, b'ctx')
994 998 m = _differentialrevisiondescre.search(ctx.description())
995 999 if m:
996 1000 return templateutil.hybriddict({
997 1001 b'url': m.group(b'url'),
998 1002 b'id': b"D{}".format(m.group(b'id')),
999 1003 })
1000 1004 else:
1001 1005 tags = ctx.repo().nodetags(ctx.node())
1002 1006 for t in tags:
1003 1007 if _differentialrevisiontagre.match(t):
1004 1008 url = ctx.repo().ui.config(b'phabricator', b'url')
1005 1009 if not url.endswith(b'/'):
1006 1010 url += b'/'
1007 1011 url += t
1008 1012
1009 1013 return templateutil.hybriddict({
1010 1014 b'url': url,
1011 1015 b'id': t,
1012 1016 })
1013 1017 return None
This diff has been collapsed as it changes many lines, (901 lines changed) Show them Hide them
@@ -1,590 +1,617 b''
1 1 {
2 "version": 1,
3 2 "interactions": [
4 3 {
4 "request": {
5 "method": "POST",
6 "body": "constraints%5Bcallsigns%5D%5B0%5D=HG&api.token=cli-hahayouwish",
7 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
8 "headers": {
9 "content-type": [
10 "application/x-www-form-urlencoded"
11 ],
12 "accept": [
13 "application/mercurial-0.1"
14 ],
15 "user-agent": [
16 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
17 ],
18 "host": [
19 "phab.mercurial-scm.org"
20 ],
21 "content-length": [
22 "79"
23 ]
24 }
25 },
5 26 "response": {
6 27 "status": {
7 "message": "OK",
8 "code": 200
9 },
28 "code": 200,
29 "message": "OK"
30 },
10 31 "body": {
11 32 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
12 },
33 },
13 34 "headers": {
14 "x-xss-protection": [
15 "1; mode=block"
16 ],
17 35 "expires": [
18 36 "Sat, 01 Jan 2000 00:00:00 GMT"
19 ],
20 "set-cookie": [
21 "phsid=A%2F4wycgjx3wajuukr7ggfpqedpe7czucr7mvmaems3; expires=Thu, 14-Sep-2023 04:47:40 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
22 ],
37 ],
38 "x-xss-protection": [
39 "1; mode=block"
40 ],
41 "transfer-encoding": [
42 "chunked"
43 ],
44 "date": [
45 "Sun, 03 Mar 2019 00:12:23 GMT"
46 ],
23 47 "x-frame-options": [
24 48 "Deny"
25 ],
49 ],
50 "cache-control": [
51 "no-store"
52 ],
53 "content-type": [
54 "application/json"
55 ],
26 56 "x-content-type-options": [
27 57 "nosniff"
28 ],
58 ],
59 "server": [
60 "Apache/2.4.10 (Debian)"
61 ],
62 "set-cookie": [
63 "phsid=A%2Fpywot5xerq4gs2tjxw3gnadzdg6vomqmfcnwqddp; expires=Fri, 01-Mar-2024 00:12:23 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
64 ],
29 65 "strict-transport-security": [
30 66 "max-age=0; includeSubdomains; preload"
31 ],
32 "server": [
33 "Apache/2.4.10 (Debian)"
34 ],
35 "date": [
36 "Sat, 15 Sep 2018 04:47:40 GMT"
37 ],
38 "content-type": [
39 "application/json"
40 ],
41 "cache-control": [
42 "no-store"
43 ]
44 }
45 },
46 "request": {
47 "method": "POST",
48 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
49 "body": "constraints%5Bcallsigns%5D%5B0%5D=HG&api.token=cli-hahayouwish",
50 "headers": {
51 "accept": [
52 "application/mercurial-0.1"
53 ],
54 "content-type": [
55 "application/x-www-form-urlencoded"
56 ],
57 "host": [
58 "phab.mercurial-scm.org"
59 ],
60 "content-length": [
61 "79"
62 ],
63 "user-agent": [
64 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
65 67 ]
66 68 }
67 69 }
68 },
70 },
69 71 {
72 "request": {
73 "method": "POST",
74 "body": "repositoryPHID=PHID-REPO-bvunnehri4u2isyr7bc3&api.token=cli-hahayouwish&diff=diff+--git+a%2Falpha+b%2Falpha%0Anew+file+mode+100644%0A---+%2Fdev%2Fnull%0A%2B%2B%2B+b%2Falpha%0A%40%40+-0%2C0+%2B1%2C1+%40%40%0A%2Balpha%0A",
75 "uri": "https://phab.mercurial-scm.org//api/differential.createrawdiff",
76 "headers": {
77 "content-type": [
78 "application/x-www-form-urlencoded"
79 ],
80 "accept": [
81 "application/mercurial-0.1"
82 ],
83 "user-agent": [
84 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
85 ],
86 "host": [
87 "phab.mercurial-scm.org"
88 ],
89 "content-length": [
90 "235"
91 ]
92 }
93 },
70 94 "response": {
71 95 "status": {
72 "message": "OK",
73 "code": 200
74 },
96 "code": 200,
97 "message": "OK"
98 },
75 99 "body": {
76 "string": "{\"result\":{\"id\":11072,\"phid\":\"PHID-DIFF-xm6cw76uivc6g56xiuv2\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/11072\\/\"},\"error_code\":null,\"error_info\":null}"
77 },
100 "string": "{\"result\":{\"id\":14303,\"phid\":\"PHID-DIFF-allzuauvigfjpv4z6dpi\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/14303\\/\"},\"error_code\":null,\"error_info\":null}"
101 },
78 102 "headers": {
103 "expires": [
104 "Sat, 01 Jan 2000 00:00:00 GMT"
105 ],
79 106 "x-xss-protection": [
80 107 "1; mode=block"
81 ],
82 "expires": [
83 "Sat, 01 Jan 2000 00:00:00 GMT"
84 ],
85 "set-cookie": [
86 "phsid=A%2Fll65pt562b6d7ifhjva4jwqqzxh2oopj4tuc6lfa; expires=Thu, 14-Sep-2023 04:47:40 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
87 ],
108 ],
109 "transfer-encoding": [
110 "chunked"
111 ],
112 "date": [
113 "Sun, 03 Mar 2019 00:12:24 GMT"
114 ],
88 115 "x-frame-options": [
89 116 "Deny"
90 ],
117 ],
118 "cache-control": [
119 "no-store"
120 ],
121 "content-type": [
122 "application/json"
123 ],
91 124 "x-content-type-options": [
92 125 "nosniff"
93 ],
94 "strict-transport-security": [
95 "max-age=0; includeSubdomains; preload"
96 ],
126 ],
97 127 "server": [
98 128 "Apache/2.4.10 (Debian)"
99 ],
100 "date": [
101 "Sat, 15 Sep 2018 04:47:40 GMT"
102 ],
103 "content-type": [
104 "application/json"
105 ],
106 "cache-control": [
107 "no-store"
108 ]
109 }
110 },
111 "request": {
112 "method": "POST",
113 "uri": "https://phab.mercurial-scm.org//api/differential.createrawdiff",
114 "body": "repositoryPHID=PHID-REPO-bvunnehri4u2isyr7bc3&diff=diff+--git+a%2Falpha+b%2Falpha%0Anew+file+mode+100644%0A---+%2Fdev%2Fnull%0A%2B%2B%2B+b%2Falpha%0A%40%40+-0%2C0+%2B1%2C1+%40%40%0A%2Balpha%0A&api.token=cli-hahayouwish",
115 "headers": {
116 "accept": [
117 "application/mercurial-0.1"
118 ],
119 "content-type": [
120 "application/x-www-form-urlencoded"
121 ],
122 "host": [
123 "phab.mercurial-scm.org"
124 ],
125 "content-length": [
126 "235"
127 ],
128 "user-agent": [
129 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
129 ],
130 "set-cookie": [
131 "phsid=A%2F2n2dlkkwzljrpzfghpdsflbt4ftnrwcc446dzcy5; expires=Fri, 01-Mar-2024 00:12:24 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
132 ],
133 "strict-transport-security": [
134 "max-age=0; includeSubdomains; preload"
130 135 ]
131 136 }
132 137 }
133 },
138 },
134 139 {
140 "request": {
141 "method": "POST",
142 "body": "diff_id=14303&data=%7B%22user%22%3A+%22test%22%2C+%22parent%22%3A+%220000000000000000000000000000000000000000%22%2C+%22node%22%3A+%22d386117f30e6b1282897bdbde75ac21e095163d4%22%2C+%22date%22%3A+%220+0%22%7D&api.token=cli-hahayouwish&name=hg%3Ameta",
143 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
144 "headers": {
145 "content-type": [
146 "application/x-www-form-urlencoded"
147 ],
148 "accept": [
149 "application/mercurial-0.1"
150 ],
151 "user-agent": [
152 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
153 ],
154 "host": [
155 "phab.mercurial-scm.org"
156 ],
157 "content-length": [
158 "264"
159 ]
160 }
161 },
135 162 "response": {
136 163 "status": {
137 "message": "OK",
138 "code": 200
139 },
164 "code": 200,
165 "message": "OK"
166 },
140 167 "body": {
141 168 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
142 },
169 },
143 170 "headers": {
171 "expires": [
172 "Sat, 01 Jan 2000 00:00:00 GMT"
173 ],
144 174 "x-xss-protection": [
145 175 "1; mode=block"
146 ],
147 "expires": [
148 "Sat, 01 Jan 2000 00:00:00 GMT"
149 ],
150 "set-cookie": [
151 "phsid=A%2F5ivszbehkvbetlnks7omsqmbsu7r5by3p3yqw3ep; expires=Thu, 14-Sep-2023 04:47:41 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
152 ],
176 ],
177 "transfer-encoding": [
178 "chunked"
179 ],
180 "date": [
181 "Sun, 03 Mar 2019 00:12:25 GMT"
182 ],
153 183 "x-frame-options": [
154 184 "Deny"
155 ],
185 ],
186 "cache-control": [
187 "no-store"
188 ],
189 "content-type": [
190 "application/json"
191 ],
156 192 "x-content-type-options": [
157 193 "nosniff"
158 ],
159 "strict-transport-security": [
160 "max-age=0; includeSubdomains; preload"
161 ],
194 ],
162 195 "server": [
163 196 "Apache/2.4.10 (Debian)"
164 ],
165 "date": [
166 "Sat, 15 Sep 2018 04:47:41 GMT"
167 ],
168 "content-type": [
169 "application/json"
170 ],
171 "cache-control": [
172 "no-store"
173 ]
174 }
175 },
176 "request": {
177 "method": "POST",
178 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
179 "body": "data=%7B%22date%22%3A+%220+0%22%2C+%22node%22%3A+%225206a4fa1e6cd7dbc027640267c109e05a9d2341%22%2C+%22user%22%3A+%22test%22%2C+%22parent%22%3A+%220000000000000000000000000000000000000000%22%7D&name=hg%3Ameta&diff_id=11072&api.token=cli-hahayouwish",
180 "headers": {
181 "accept": [
182 "application/mercurial-0.1"
183 ],
184 "content-type": [
185 "application/x-www-form-urlencoded"
186 ],
187 "host": [
188 "phab.mercurial-scm.org"
189 ],
190 "content-length": [
191 "264"
192 ],
193 "user-agent": [
194 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
197 ],
198 "set-cookie": [
199 "phsid=A%2F5mq3t25wu5igv7oufpwcoy32fveozo7wn5wni3gw; expires=Fri, 01-Mar-2024 00:12:25 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
200 ],
201 "strict-transport-security": [
202 "max-age=0; includeSubdomains; preload"
195 203 ]
196 204 }
197 205 }
198 },
206 },
199 207 {
208 "request": {
209 "method": "POST",
210 "body": "diff_id=14303&data=%7B%22d386117f30e6b1282897bdbde75ac21e095163d4%22%3A+%7B%22author%22%3A+%22test%22%2C+%22authorEmail%22%3A+%22test%22%2C+%22time%22%3A+0.0%7D%7D&api.token=cli-hahayouwish&name=local%3Acommits",
211 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
212 "headers": {
213 "content-type": [
214 "application/x-www-form-urlencoded"
215 ],
216 "accept": [
217 "application/mercurial-0.1"
218 ],
219 "user-agent": [
220 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
221 ],
222 "host": [
223 "phab.mercurial-scm.org"
224 ],
225 "content-length": [
226 "227"
227 ]
228 }
229 },
200 230 "response": {
201 231 "status": {
202 "message": "OK",
203 "code": 200
204 },
232 "code": 200,
233 "message": "OK"
234 },
205 235 "body": {
206 236 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
207 },
237 },
208 238 "headers": {
239 "expires": [
240 "Sat, 01 Jan 2000 00:00:00 GMT"
241 ],
209 242 "x-xss-protection": [
210 243 "1; mode=block"
211 ],
212 "expires": [
213 "Sat, 01 Jan 2000 00:00:00 GMT"
214 ],
215 "set-cookie": [
216 "phsid=A%2Fxvwxxrmwpjntx6dlohrstyox7yjssdbzufiwygcg; expires=Thu, 14-Sep-2023 04:47:41 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
217 ],
244 ],
245 "transfer-encoding": [
246 "chunked"
247 ],
248 "date": [
249 "Sun, 03 Mar 2019 00:12:25 GMT"
250 ],
218 251 "x-frame-options": [
219 252 "Deny"
220 ],
253 ],
254 "cache-control": [
255 "no-store"
256 ],
257 "content-type": [
258 "application/json"
259 ],
221 260 "x-content-type-options": [
222 261 "nosniff"
223 ],
224 "strict-transport-security": [
225 "max-age=0; includeSubdomains; preload"
226 ],
262 ],
227 263 "server": [
228 264 "Apache/2.4.10 (Debian)"
229 ],
230 "date": [
231 "Sat, 15 Sep 2018 04:47:41 GMT"
232 ],
233 "content-type": [
234 "application/json"
235 ],
236 "cache-control": [
237 "no-store"
238 ]
239 }
240 },
241 "request": {
242 "method": "POST",
243 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
244 "body": "data=%7B%225206a4fa1e6cd7dbc027640267c109e05a9d2341%22%3A+%7B%22time%22%3A+0.0%2C+%22author%22%3A+%22test%22%2C+%22authorEmail%22%3A+%22test%22%7D%7D&name=local%3Acommits&diff_id=11072&api.token=cli-hahayouwish",
245 "headers": {
246 "accept": [
247 "application/mercurial-0.1"
248 ],
249 "content-type": [
250 "application/x-www-form-urlencoded"
251 ],
252 "host": [
253 "phab.mercurial-scm.org"
254 ],
255 "content-length": [
256 "227"
257 ],
258 "user-agent": [
259 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
265 ],
266 "set-cookie": [
267 "phsid=A%2F5nja6g4cnpt63ctjjwykxyceyb7kokfptrzbejoc; expires=Fri, 01-Mar-2024 00:12:25 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
268 ],
269 "strict-transport-security": [
270 "max-age=0; includeSubdomains; preload"
260 271 ]
261 272 }
262 273 }
263 },
274 },
264 275 {
276 "request": {
277 "method": "POST",
278 "body": "api.token=cli-hahayouwish&corpus=create+alpha+for+phabricator+test+%E2%82%AC",
279 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
280 "headers": {
281 "content-type": [
282 "application/x-www-form-urlencoded"
283 ],
284 "accept": [
285 "application/mercurial-0.1"
286 ],
287 "user-agent": [
288 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
289 ],
290 "host": [
291 "phab.mercurial-scm.org"
292 ],
293 "content-length": [
294 "93"
295 ]
296 }
297 },
265 298 "response": {
266 299 "status": {
267 "message": "OK",
268 "code": 200
269 },
300 "code": 200,
301 "message": "OK"
302 },
270 303 "body": {
271 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"create alpha for phabricator test\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"}},\"error_code\":null,\"error_info\":null}"
272 },
304 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"create alpha for phabricator test \\u20ac\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"}},\"error_code\":null,\"error_info\":null}"
305 },
273 306 "headers": {
307 "expires": [
308 "Sat, 01 Jan 2000 00:00:00 GMT"
309 ],
274 310 "x-xss-protection": [
275 311 "1; mode=block"
276 ],
277 "expires": [
278 "Sat, 01 Jan 2000 00:00:00 GMT"
279 ],
280 "set-cookie": [
281 "phsid=A%2Fy3s5iysh6h2javfdo2u7myspyjypv4mvojegqr6j; expires=Thu, 14-Sep-2023 04:47:42 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
282 ],
312 ],
313 "transfer-encoding": [
314 "chunked"
315 ],
316 "date": [
317 "Sun, 03 Mar 2019 00:12:26 GMT"
318 ],
283 319 "x-frame-options": [
284 320 "Deny"
285 ],
321 ],
322 "cache-control": [
323 "no-store"
324 ],
325 "content-type": [
326 "application/json"
327 ],
286 328 "x-content-type-options": [
287 329 "nosniff"
288 ],
289 "strict-transport-security": [
290 "max-age=0; includeSubdomains; preload"
291 ],
330 ],
292 331 "server": [
293 332 "Apache/2.4.10 (Debian)"
294 ],
295 "date": [
296 "Sat, 15 Sep 2018 04:47:42 GMT"
297 ],
298 "content-type": [
299 "application/json"
300 ],
301 "cache-control": [
302 "no-store"
303 ]
304 }
305 },
306 "request": {
307 "method": "POST",
308 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
309 "body": "corpus=create+alpha+for+phabricator+test&api.token=cli-hahayouwish",
310 "headers": {
311 "accept": [
312 "application/mercurial-0.1"
313 ],
314 "content-type": [
315 "application/x-www-form-urlencoded"
316 ],
317 "host": [
318 "phab.mercurial-scm.org"
319 ],
320 "content-length": [
321 "83"
322 ],
323 "user-agent": [
324 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
333 ],
334 "set-cookie": [
335 "phsid=A%2Fkrxawhyvcd4jhv77inuwdmzcci4f7kql6c7l3smz; expires=Fri, 01-Mar-2024 00:12:26 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
336 ],
337 "strict-transport-security": [
338 "max-age=0; includeSubdomains; preload"
325 339 ]
326 340 }
327 341 }
328 },
342 },
329 343 {
344 "request": {
345 "method": "POST",
346 "body": "transactions%5B0%5D%5Btype%5D=update&transactions%5B0%5D%5Bvalue%5D=PHID-DIFF-allzuauvigfjpv4z6dpi&transactions%5B1%5D%5Btype%5D=title&transactions%5B1%5D%5Bvalue%5D=create+alpha+for+phabricator+test+%E2%82%AC&api.token=cli-hahayouwish",
347 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
348 "headers": {
349 "content-type": [
350 "application/x-www-form-urlencoded"
351 ],
352 "accept": [
353 "application/mercurial-0.1"
354 ],
355 "user-agent": [
356 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
357 ],
358 "host": [
359 "phab.mercurial-scm.org"
360 ],
361 "content-length": [
362 "252"
363 ]
364 }
365 },
330 366 "response": {
331 367 "status": {
332 "message": "OK",
333 "code": 200
334 },
368 "code": 200,
369 "message": "OK"
370 },
335 371 "body": {
336 "string": "{\"result\":{\"object\":{\"id\":4596,\"phid\":\"PHID-DREV-bntcdwe74cw3vwkzt6nq\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-mnqxquobbhdgttd\"},{\"phid\":\"PHID-XACT-DREV-nd34pqrjamxbhop\"},{\"phid\":\"PHID-XACT-DREV-4ka4rghn6b7xooc\"},{\"phid\":\"PHID-XACT-DREV-mfuvfyiijdqwpyg\"},{\"phid\":\"PHID-XACT-DREV-ckar54h6yenx24s\"}]},\"error_code\":null,\"error_info\":null}"
337 },
372 "string": "{\"result\":{\"object\":{\"id\":6054,\"phid\":\"PHID-DREV-6pczsbtdpqjc2nskmxwy\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-efgl4j4fesixjog\"},{\"phid\":\"PHID-XACT-DREV-xj7ksjeyfadwf5m\"},{\"phid\":\"PHID-XACT-DREV-gecx5zw42kkuffc\"},{\"phid\":\"PHID-XACT-DREV-asda7zcwgzdadoi\"},{\"phid\":\"PHID-XACT-DREV-ku26t33y6iiugjw\"}]},\"error_code\":null,\"error_info\":null}"
373 },
338 374 "headers": {
375 "expires": [
376 "Sat, 01 Jan 2000 00:00:00 GMT"
377 ],
339 378 "x-xss-protection": [
340 379 "1; mode=block"
341 ],
342 "expires": [
343 "Sat, 01 Jan 2000 00:00:00 GMT"
344 ],
345 "set-cookie": [
346 "phsid=A%2Foe7kd7hhldo25tzbegntkyfxm6wnztgdfmsfubo2; expires=Thu, 14-Sep-2023 04:47:42 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
347 ],
380 ],
381 "transfer-encoding": [
382 "chunked"
383 ],
384 "date": [
385 "Sun, 03 Mar 2019 00:12:27 GMT"
386 ],
348 387 "x-frame-options": [
349 388 "Deny"
350 ],
389 ],
390 "cache-control": [
391 "no-store"
392 ],
393 "content-type": [
394 "application/json"
395 ],
351 396 "x-content-type-options": [
352 397 "nosniff"
353 ],
354 "strict-transport-security": [
355 "max-age=0; includeSubdomains; preload"
356 ],
398 ],
357 399 "server": [
358 400 "Apache/2.4.10 (Debian)"
359 ],
360 "date": [
361 "Sat, 15 Sep 2018 04:47:42 GMT"
362 ],
363 "content-type": [
364 "application/json"
365 ],
366 "cache-control": [
367 "no-store"
368 ]
369 }
370 },
371 "request": {
372 "method": "POST",
373 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
374 "body": "transactions%5B0%5D%5Bvalue%5D=PHID-DIFF-xm6cw76uivc6g56xiuv2&transactions%5B0%5D%5Btype%5D=update&transactions%5B1%5D%5Bvalue%5D=create+alpha+for+phabricator+test&transactions%5B1%5D%5Btype%5D=title&api.token=cli-hahayouwish",
375 "headers": {
376 "accept": [
377 "application/mercurial-0.1"
378 ],
379 "content-type": [
380 "application/x-www-form-urlencoded"
381 ],
382 "host": [
383 "phab.mercurial-scm.org"
384 ],
385 "content-length": [
386 "242"
387 ],
388 "user-agent": [
389 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
401 ],
402 "set-cookie": [
403 "phsid=A%2Fjwgcqb5hvbltjq4jqbpauz7rmmhpuh2rb7phsdmf; expires=Fri, 01-Mar-2024 00:12:27 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
404 ],
405 "strict-transport-security": [
406 "max-age=0; includeSubdomains; preload"
390 407 ]
391 408 }
392 409 }
393 },
410 },
394 411 {
412 "request": {
413 "method": "POST",
414 "body": "api.token=cli-hahayouwish&ids%5B0%5D=6054",
415 "uri": "https://phab.mercurial-scm.org//api/differential.query",
416 "headers": {
417 "content-type": [
418 "application/x-www-form-urlencoded"
419 ],
420 "accept": [
421 "application/mercurial-0.1"
422 ],
423 "user-agent": [
424 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
425 ],
426 "host": [
427 "phab.mercurial-scm.org"
428 ],
429 "content-length": [
430 "58"
431 ]
432 }
433 },
395 434 "response": {
396 435 "status": {
397 "message": "OK",
398 "code": 200
399 },
436 "code": 200,
437 "message": "OK"
438 },
400 439 "body": {
401 "string": "{\"result\":[{\"id\":\"4596\",\"phid\":\"PHID-DREV-bntcdwe74cw3vwkzt6nq\",\"title\":\"create alpha for phabricator test\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D4596\",\"dateCreated\":\"1536986862\",\"dateModified\":\"1536986862\",\"authorPHID\":\"PHID-USER-cgcdlc6c3gpxapbmkwa2\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":[],\"branch\":null,\"summary\":\"\",\"testPlan\":\"\",\"lineCount\":\"1\",\"activeDiffPHID\":\"PHID-DIFF-xm6cw76uivc6g56xiuv2\",\"diffs\":[\"11072\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":null}],\"error_code\":null,\"error_info\":null}"
402 },
440 "string": "{\"result\":[{\"id\":\"6054\",\"phid\":\"PHID-DREV-6pczsbtdpqjc2nskmxwy\",\"title\":\"create alpha for phabricator test \\u20ac\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D6054\",\"dateCreated\":\"1551571947\",\"dateModified\":\"1551571947\",\"authorPHID\":\"PHID-USER-5iy6mkoveguhm2zthvww\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":[],\"branch\":null,\"summary\":\"\",\"testPlan\":\"\",\"lineCount\":\"1\",\"activeDiffPHID\":\"PHID-DIFF-allzuauvigfjpv4z6dpi\",\"diffs\":[\"14303\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":null}],\"error_code\":null,\"error_info\":null}"
441 },
403 442 "headers": {
443 "expires": [
444 "Sat, 01 Jan 2000 00:00:00 GMT"
445 ],
404 446 "x-xss-protection": [
405 447 "1; mode=block"
406 ],
407 "expires": [
408 "Sat, 01 Jan 2000 00:00:00 GMT"
409 ],
410 "set-cookie": [
411 "phsid=A%2F5d2bgafhoqhg5thqxeu6y4fngq7lqezf5h6eo5pd; expires=Thu, 14-Sep-2023 04:47:43 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
412 ],
448 ],
449 "transfer-encoding": [
450 "chunked"
451 ],
452 "date": [
453 "Sun, 03 Mar 2019 00:12:28 GMT"
454 ],
413 455 "x-frame-options": [
414 456 "Deny"
415 ],
457 ],
458 "cache-control": [
459 "no-store"
460 ],
461 "content-type": [
462 "application/json"
463 ],
416 464 "x-content-type-options": [
417 465 "nosniff"
418 ],
419 "strict-transport-security": [
420 "max-age=0; includeSubdomains; preload"
421 ],
466 ],
422 467 "server": [
423 468 "Apache/2.4.10 (Debian)"
424 ],
425 "date": [
426 "Sat, 15 Sep 2018 04:47:43 GMT"
427 ],
428 "content-type": [
429 "application/json"
430 ],
431 "cache-control": [
432 "no-store"
433 ]
434 }
435 },
436 "request": {
437 "method": "POST",
438 "uri": "https://phab.mercurial-scm.org//api/differential.query",
439 "body": "api.token=cli-hahayouwish&ids%5B0%5D=4596",
440 "headers": {
441 "accept": [
442 "application/mercurial-0.1"
443 ],
444 "content-type": [
445 "application/x-www-form-urlencoded"
446 ],
447 "host": [
448 "phab.mercurial-scm.org"
449 ],
450 "content-length": [
451 "58"
452 ],
453 "user-agent": [
454 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
469 ],
470 "set-cookie": [
471 "phsid=A%2F3lgkbbyaa646ng5klghjyehsbjxtaqblipnvocuz; expires=Fri, 01-Mar-2024 00:12:28 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
472 ],
473 "strict-transport-security": [
474 "max-age=0; includeSubdomains; preload"
455 475 ]
456 476 }
457 477 }
458 },
478 },
459 479 {
480 "request": {
481 "method": "POST",
482 "body": "diff_id=14303&data=%7B%22user%22%3A+%22test%22%2C+%22parent%22%3A+%220000000000000000000000000000000000000000%22%2C+%22node%22%3A+%22cb03845d6dd98c72bec766c7ed08c693cc49817a%22%2C+%22date%22%3A+%220+0%22%7D&api.token=cli-hahayouwish&name=hg%3Ameta",
483 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
484 "headers": {
485 "content-type": [
486 "application/x-www-form-urlencoded"
487 ],
488 "accept": [
489 "application/mercurial-0.1"
490 ],
491 "user-agent": [
492 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
493 ],
494 "host": [
495 "phab.mercurial-scm.org"
496 ],
497 "content-length": [
498 "264"
499 ]
500 }
501 },
460 502 "response": {
461 503 "status": {
462 "message": "OK",
463 "code": 200
464 },
504 "code": 200,
505 "message": "OK"
506 },
465 507 "body": {
466 508 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
467 },
509 },
468 510 "headers": {
511 "expires": [
512 "Sat, 01 Jan 2000 00:00:00 GMT"
513 ],
469 514 "x-xss-protection": [
470 515 "1; mode=block"
471 ],
472 "expires": [
473 "Sat, 01 Jan 2000 00:00:00 GMT"
474 ],
475 "set-cookie": [
476 "phsid=A%2F2cewrqifmvko6evm2sy2nvksvcvhk6hpsj36lcv2; expires=Thu, 14-Sep-2023 04:47:43 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
477 ],
516 ],
517 "transfer-encoding": [
518 "chunked"
519 ],
520 "date": [
521 "Sun, 03 Mar 2019 00:12:28 GMT"
522 ],
478 523 "x-frame-options": [
479 524 "Deny"
480 ],
525 ],
526 "cache-control": [
527 "no-store"
528 ],
529 "content-type": [
530 "application/json"
531 ],
481 532 "x-content-type-options": [
482 533 "nosniff"
483 ],
484 "strict-transport-security": [
485 "max-age=0; includeSubdomains; preload"
486 ],
534 ],
487 535 "server": [
488 536 "Apache/2.4.10 (Debian)"
489 ],
490 "date": [
491 "Sat, 15 Sep 2018 04:47:43 GMT"
492 ],
493 "content-type": [
494 "application/json"
495 ],
496 "cache-control": [
497 "no-store"
498 ]
499 }
500 },
501 "request": {
502 "method": "POST",
503 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
504 "body": "data=%7B%22date%22%3A+%220+0%22%2C+%22node%22%3A+%22d8f232f7d799e1064d3da179df41a2b5d04334e9%22%2C+%22user%22%3A+%22test%22%2C+%22parent%22%3A+%220000000000000000000000000000000000000000%22%7D&name=hg%3Ameta&diff_id=11072&api.token=cli-hahayouwish",
505 "headers": {
506 "accept": [
507 "application/mercurial-0.1"
508 ],
509 "content-type": [
510 "application/x-www-form-urlencoded"
511 ],
512 "host": [
513 "phab.mercurial-scm.org"
514 ],
515 "content-length": [
516 "264"
517 ],
518 "user-agent": [
519 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
537 ],
538 "set-cookie": [
539 "phsid=A%2Fwjxvlsjqmqwvcljfv6oe2sbometi3gebps6vzrlw; expires=Fri, 01-Mar-2024 00:12:28 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
540 ],
541 "strict-transport-security": [
542 "max-age=0; includeSubdomains; preload"
520 543 ]
521 544 }
522 545 }
523 },
546 },
524 547 {
548 "request": {
549 "method": "POST",
550 "body": "diff_id=14303&data=%7B%22cb03845d6dd98c72bec766c7ed08c693cc49817a%22%3A+%7B%22author%22%3A+%22test%22%2C+%22authorEmail%22%3A+%22test%22%2C+%22time%22%3A+0.0%7D%7D&api.token=cli-hahayouwish&name=local%3Acommits",
551 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
552 "headers": {
553 "content-type": [
554 "application/x-www-form-urlencoded"
555 ],
556 "accept": [
557 "application/mercurial-0.1"
558 ],
559 "user-agent": [
560 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
561 ],
562 "host": [
563 "phab.mercurial-scm.org"
564 ],
565 "content-length": [
566 "227"
567 ]
568 }
569 },
525 570 "response": {
526 571 "status": {
527 "message": "OK",
528 "code": 200
529 },
572 "code": 200,
573 "message": "OK"
574 },
530 575 "body": {
531 576 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
532 },
577 },
533 578 "headers": {
579 "expires": [
580 "Sat, 01 Jan 2000 00:00:00 GMT"
581 ],
534 582 "x-xss-protection": [
535 583 "1; mode=block"
536 ],
537 "expires": [
538 "Sat, 01 Jan 2000 00:00:00 GMT"
539 ],
540 "set-cookie": [
541 "phsid=A%2Fped6v7jlldydnkfolkdmecyyjrkciqhkr7opvbt2; expires=Thu, 14-Sep-2023 04:47:44 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
542 ],
584 ],
585 "transfer-encoding": [
586 "chunked"
587 ],
588 "date": [
589 "Sun, 03 Mar 2019 00:12:29 GMT"
590 ],
543 591 "x-frame-options": [
544 592 "Deny"
545 ],
593 ],
594 "cache-control": [
595 "no-store"
596 ],
597 "content-type": [
598 "application/json"
599 ],
546 600 "x-content-type-options": [
547 601 "nosniff"
548 ],
549 "strict-transport-security": [
550 "max-age=0; includeSubdomains; preload"
551 ],
602 ],
552 603 "server": [
553 604 "Apache/2.4.10 (Debian)"
554 ],
555 "date": [
556 "Sat, 15 Sep 2018 04:47:44 GMT"
557 ],
558 "content-type": [
559 "application/json"
560 ],
561 "cache-control": [
562 "no-store"
563 ]
564 }
565 },
566 "request": {
567 "method": "POST",
568 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
569 "body": "data=%7B%22d8f232f7d799e1064d3da179df41a2b5d04334e9%22%3A+%7B%22time%22%3A+0.0%2C+%22author%22%3A+%22test%22%2C+%22authorEmail%22%3A+%22test%22%7D%7D&name=local%3Acommits&diff_id=11072&api.token=cli-hahayouwish",
570 "headers": {
571 "accept": [
572 "application/mercurial-0.1"
573 ],
574 "content-type": [
575 "application/x-www-form-urlencoded"
576 ],
577 "host": [
578 "phab.mercurial-scm.org"
579 ],
580 "content-length": [
581 "227"
582 ],
583 "user-agent": [
584 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
605 ],
606 "set-cookie": [
607 "phsid=A%2Foeyncgzaanzmnhgfc7ecvmu5pq7qju7ewq6tvgrp; expires=Fri, 01-Mar-2024 00:12:29 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
608 ],
609 "strict-transport-security": [
610 "max-age=0; includeSubdomains; preload"
585 611 ]
586 612 }
587 613 }
588 614 }
589 ]
615 ],
616 "version": 1
590 617 }
This diff has been collapsed as it changes many lines, (1432 lines changed) Show them Hide them
@@ -1,915 +1,1025 b''
1 1 {
2 "version": 1,
3 2 "interactions": [
4 3 {
5 4 "request": {
6 "body": "api.token=cli-hahayouwish&revisionIDs%5B0%5D=4596",
7 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
5 "method": "POST",
6 "body": "api.token=cli-hahayouwish&revisionIDs%5B0%5D=6054",
7 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
8 8 "headers": {
9 "content-length": [
10 "66"
11 ],
12 "host": [
13 "phab.mercurial-scm.org"
14 ],
15 9 "content-type": [
16 10 "application/x-www-form-urlencoded"
17 ],
11 ],
18 12 "accept": [
19 13 "application/mercurial-0.1"
20 ],
14 ],
21 15 "user-agent": [
22 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
16 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
17 ],
18 "host": [
19 "phab.mercurial-scm.org"
20 ],
21 "content-length": [
22 "66"
23 23 ]
24 },
25 "method": "POST"
26 },
24 }
25 },
27 26 "response": {
28 27 "status": {
29 "code": 200,
28 "code": 200,
30 29 "message": "OK"
31 },
32 "headers": {
33 "server": [
34 "Apache/2.4.10 (Debian)"
35 ],
36 "strict-transport-security": [
37 "max-age=0; includeSubdomains; preload"
38 ],
39 "x-frame-options": [
40 "Deny"
41 ],
42 "x-content-type-options": [
43 "nosniff"
44 ],
45 "expires": [
46 "Sat, 01 Jan 2000 00:00:00 GMT"
47 ],
48 "set-cookie": [
49 "phsid=A%2F5bjqjyefdbiq65cc3qepzxq7ncczgfqo2xxsybaf; expires=Thu, 14-Sep-2023 04:53:46 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
50 ],
51 "x-xss-protection": [
52 "1; mode=block"
53 ],
54 "content-type": [
55 "application/json"
56 ],
57 "cache-control": [
58 "no-store"
59 ],
60 "date": [
61 "Sat, 15 Sep 2018 04:53:46 GMT"
62 ]
63 },
30 },
64 31 "body": {
65 "string": "{\"result\":{\"11073\":{\"id\":\"11073\",\"revisionID\":\"4596\",\"dateCreated\":\"1536986866\",\"dateModified\":\"1536986868\",\"sourceControlBaseRevision\":null,\"sourceControlPath\":null,\"sourceControlSystem\":null,\"branch\":null,\"bookmark\":null,\"creationMethod\":\"web\",\"description\":null,\"unitStatus\":\"4\",\"lintStatus\":\"4\",\"changes\":[{\"id\":\"24417\",\"metadata\":{\"line:first\":1},\"oldPath\":null,\"currentPath\":\"alpha\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"2\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"2\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+alpha\\n+more\\n\"}]}],\"properties\":{\"hg:meta\":{\"parent\":\"0000000000000000000000000000000000000000\",\"node\":\"f70265671c65ab4b5416e611a6bd61887c013122\",\"user\":\"test\",\"date\":\"0 0\"},\"local:commits\":{\"f70265671c65ab4b5416e611a6bd61887c013122\":{\"time\":0,\"authorEmail\":\"test\",\"author\":\"test\"}}},\"authorName\":\"test\",\"authorEmail\":\"test\"},\"11072\":{\"id\":\"11072\",\"revisionID\":\"4596\",\"dateCreated\":\"1536986860\",\"dateModified\":\"1536986862\",\"sourceControlBaseRevision\":null,\"sourceControlPath\":null,\"sourceControlSystem\":null,\"branch\":null,\"bookmark\":null,\"creationMethod\":\"web\",\"description\":null,\"unitStatus\":\"4\",\"lintStatus\":\"4\",\"changes\":[{\"id\":\"24416\",\"metadata\":{\"line:first\":1},\"oldPath\":null,\"currentPath\":\"alpha\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+alpha\\n\"}]}],\"properties\":{\"hg:meta\":{\"date\":\"0 0\",\"node\":\"d8f232f7d799e1064d3da179df41a2b5d04334e9\",\"user\":\"test\",\"parent\":\"0000000000000000000000000000000000000000\"},\"local:commits\":{\"d8f232f7d799e1064d3da179df41a2b5d04334e9\":{\"time\":0,\"author\":\"test\",\"authorEmail\":\"test\"}}},\"authorName\":\"test\",\"authorEmail\":\"test\"}},\"error_code\":null,\"error_info\":null}"
66 }
67 }
68 },
69 {
70 "request": {
71 "body": "diff_id=11073&api.token=cli-hahayouwish&data=%7B%22parent%22%3A+%220000000000000000000000000000000000000000%22%2C+%22node%22%3A+%22f70265671c65ab4b5416e611a6bd61887c013122%22%2C+%22user%22%3A+%22test%22%2C+%22date%22%3A+%220+0%22%7D&name=hg%3Ameta",
72 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
32 "string": "{\"result\":{\"14303\":{\"id\":\"14303\",\"revisionID\":\"6054\",\"dateCreated\":\"1551571944\",\"dateModified\":\"1551571947\",\"sourceControlBaseRevision\":null,\"sourceControlPath\":null,\"sourceControlSystem\":null,\"branch\":null,\"bookmark\":null,\"creationMethod\":\"web\",\"description\":null,\"unitStatus\":\"4\",\"lintStatus\":\"4\",\"changes\":[{\"id\":\"32287\",\"metadata\":{\"line:first\":1},\"oldPath\":null,\"currentPath\":\"alpha\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+alpha\\n\"}]}],\"properties\":{\"hg:meta\":{\"user\":\"test\",\"parent\":\"0000000000000000000000000000000000000000\",\"node\":\"cb03845d6dd98c72bec766c7ed08c693cc49817a\",\"date\":\"0 0\"},\"local:commits\":{\"cb03845d6dd98c72bec766c7ed08c693cc49817a\":{\"author\":\"test\",\"authorEmail\":\"test\",\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"}},\"error_code\":null,\"error_info\":null}"
33 },
73 34 "headers": {
74 "content-length": [
75 "264"
76 ],
77 "host": [
78 "phab.mercurial-scm.org"
79 ],
80 "content-type": [
81 "application/x-www-form-urlencoded"
82 ],
83 "accept": [
84 "application/mercurial-0.1"
85 ],
86 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
88 ]
89 },
90 "method": "POST"
91 },
92 "response": {
93 "status": {
94 "code": 200,
95 "message": "OK"
96 },
97 "headers": {
98 "server": [
99 "Apache/2.4.10 (Debian)"
100 ],
101 "strict-transport-security": [
102 "max-age=0; includeSubdomains; preload"
103 ],
104 "x-frame-options": [
105 "Deny"
106 ],
107 "x-content-type-options": [
108 "nosniff"
109 ],
110 35 "expires": [
111 36 "Sat, 01 Jan 2000 00:00:00 GMT"
112 ],
113 "set-cookie": [
114 "phsid=A%2Ff6o4ingm2wmr3ma4aht2kytfrrxvrkitj6ipkf5k; expires=Thu, 14-Sep-2023 04:53:46 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
115 ],
37 ],
116 38 "x-xss-protection": [
117 39 "1; mode=block"
118 ],
119 "content-type": [
120 "application/json"
121 ],
40 ],
41 "transfer-encoding": [
42 "chunked"
43 ],
44 "date": [
45 "Sun, 03 Mar 2019 00:12:30 GMT"
46 ],
47 "x-frame-options": [
48 "Deny"
49 ],
122 50 "cache-control": [
123 51 "no-store"
124 ],
125 "date": [
126 "Sat, 15 Sep 2018 04:53:46 GMT"
127 ]
128 },
129 "body": {
130 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
131 }
132 }
133 },
134 {
135 "request": {
136 "body": "diff_id=11073&api.token=cli-hahayouwish&data=%7B%22f70265671c65ab4b5416e611a6bd61887c013122%22%3A+%7B%22time%22%3A+0.0%2C+%22authorEmail%22%3A+%22test%22%2C+%22author%22%3A+%22test%22%7D%7D&name=local%3Acommits",
137 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
138 "headers": {
139 "content-length": [
140 "227"
141 ],
142 "host": [
143 "phab.mercurial-scm.org"
144 ],
52 ],
145 53 "content-type": [
146 "application/x-www-form-urlencoded"
147 ],
148 "accept": [
149 "application/mercurial-0.1"
150 ],
151 "user-agent": [
152 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
153 ]
154 },
155 "method": "POST"
156 },
157 "response": {
158 "status": {
159 "code": 200,
160 "message": "OK"
161 },
162 "headers": {
54 "application/json"
55 ],
56 "x-content-type-options": [
57 "nosniff"
58 ],
163 59 "server": [
164 60 "Apache/2.4.10 (Debian)"
165 ],
61 ],
62 "set-cookie": [
63 "phsid=A%2Fnf3xdxgvvgky277foc7s2p6xrgtsvn4bzmayrbmb; expires=Fri, 01-Mar-2024 00:12:30 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
64 ],
166 65 "strict-transport-security": [
167 66 "max-age=0; includeSubdomains; preload"
168 ],
169 "x-frame-options": [
170 "Deny"
171 ],
172 "x-content-type-options": [
173 "nosniff"
174 ],
175 "expires": [
176 "Sat, 01 Jan 2000 00:00:00 GMT"
177 ],
178 "set-cookie": [
179 "phsid=A%2F4fitvy4kno46zkca6hq7npvuxvnh4dxlbvscmodb; expires=Thu, 14-Sep-2023 04:53:47 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
180 ],
181 "x-xss-protection": [
182 "1; mode=block"
183 ],
184 "content-type": [
185 "application/json"
186 ],
187 "cache-control": [
188 "no-store"
189 ],
190 "date": [
191 "Sat, 15 Sep 2018 04:53:47 GMT"
192 67 ]
193 },
194 "body": {
195 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
196 68 }
197 69 }
198 },
70 },
199 71 {
200 72 "request": {
201 "body": "api.token=cli-hahayouwish&corpus=create+alpha+for+phabricator+test%0A%0ADifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD4596",
202 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
73 "method": "POST",
74 "body": "constraints%5Bcallsigns%5D%5B0%5D=HG&api.token=cli-hahayouwish",
75 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
203 76 "headers": {
204 "content-length": [
205 "158"
206 ],
207 "host": [
208 "phab.mercurial-scm.org"
209 ],
210 77 "content-type": [
211 78 "application/x-www-form-urlencoded"
212 ],
79 ],
213 80 "accept": [
214 81 "application/mercurial-0.1"
215 ],
82 ],
216 83 "user-agent": [
217 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
84 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
85 ],
86 "host": [
87 "phab.mercurial-scm.org"
88 ],
89 "content-length": [
90 "79"
218 91 ]
219 },
220 "method": "POST"
221 },
92 }
93 },
222 94 "response": {
223 95 "status": {
224 "code": 200,
96 "code": 200,
225 97 "message": "OK"
226 },
98 },
99 "body": {
100 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
101 },
102 "headers": {
103 "expires": [
104 "Sat, 01 Jan 2000 00:00:00 GMT"
105 ],
106 "x-xss-protection": [
107 "1; mode=block"
108 ],
109 "transfer-encoding": [
110 "chunked"
111 ],
112 "date": [
113 "Sun, 03 Mar 2019 00:12:31 GMT"
114 ],
115 "x-frame-options": [
116 "Deny"
117 ],
118 "cache-control": [
119 "no-store"
120 ],
121 "content-type": [
122 "application/json"
123 ],
124 "x-content-type-options": [
125 "nosniff"
126 ],
127 "server": [
128 "Apache/2.4.10 (Debian)"
129 ],
130 "set-cookie": [
131 "phsid=A%2Fmlq7cl6pakmia2uecfcevwhdl3hyqe6rdb2y7usm; expires=Fri, 01-Mar-2024 00:12:31 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
132 ],
133 "strict-transport-security": [
134 "max-age=0; includeSubdomains; preload"
135 ]
136 }
137 }
138 },
139 {
140 "request": {
141 "method": "POST",
142 "body": "repositoryPHID=PHID-REPO-bvunnehri4u2isyr7bc3&api.token=cli-hahayouwish&diff=diff+--git+a%2Falpha+b%2Falpha%0Anew+file+mode+100644%0A---+%2Fdev%2Fnull%0A%2B%2B%2B+b%2Falpha%0A%40%40+-0%2C0+%2B1%2C2+%40%40%0A%2Balpha%0A%2Bmore%0A",
143 "uri": "https://phab.mercurial-scm.org//api/differential.createrawdiff",
227 144 "headers": {
145 "content-type": [
146 "application/x-www-form-urlencoded"
147 ],
148 "accept": [
149 "application/mercurial-0.1"
150 ],
151 "user-agent": [
152 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
153 ],
154 "host": [
155 "phab.mercurial-scm.org"
156 ],
157 "content-length": [
158 "245"
159 ]
160 }
161 },
162 "response": {
163 "status": {
164 "code": 200,
165 "message": "OK"
166 },
167 "body": {
168 "string": "{\"result\":{\"id\":14304,\"phid\":\"PHID-DIFF-3wv2fwmzp27uamb66xxg\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/14304\\/\"},\"error_code\":null,\"error_info\":null}"
169 },
170 "headers": {
171 "expires": [
172 "Sat, 01 Jan 2000 00:00:00 GMT"
173 ],
174 "x-xss-protection": [
175 "1; mode=block"
176 ],
177 "transfer-encoding": [
178 "chunked"
179 ],
180 "date": [
181 "Sun, 03 Mar 2019 00:12:32 GMT"
182 ],
183 "x-frame-options": [
184 "Deny"
185 ],
186 "cache-control": [
187 "no-store"
188 ],
189 "content-type": [
190 "application/json"
191 ],
192 "x-content-type-options": [
193 "nosniff"
194 ],
228 195 "server": [
229 196 "Apache/2.4.10 (Debian)"
230 ],
197 ],
198 "set-cookie": [
199 "phsid=A%2Fptjtujvqlcwhzs4yhneogb323aqessc5axlu4rif; expires=Fri, 01-Mar-2024 00:12:32 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
200 ],
231 201 "strict-transport-security": [
232 202 "max-age=0; includeSubdomains; preload"
233 ],
234 "x-frame-options": [
235 "Deny"
236 ],
237 "x-content-type-options": [
238 "nosniff"
239 ],
240 "expires": [
241 "Sat, 01 Jan 2000 00:00:00 GMT"
242 ],
243 "set-cookie": [
244 "phsid=A%2F7u2j7nsrtq2dtxqws7pnsnjyaufsamwj44e45euz; expires=Thu, 14-Sep-2023 04:53:47 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
245 ],
246 "x-xss-protection": [
247 "1; mode=block"
248 ],
249 "content-type": [
250 "application/json"
251 ],
252 "cache-control": [
253 "no-store"
254 ],
255 "date": [
256 "Sat, 15 Sep 2018 04:53:47 GMT"
257 203 ]
258 },
259 "body": {
260 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"create alpha for phabricator test\",\"revisionID\":4596},\"revisionIDFieldInfo\":{\"value\":4596,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"}},\"error_code\":null,\"error_info\":null}"
261 204 }
262 205 }
263 },
206 },
264 207 {
265 208 "request": {
266 "body": "api.token=cli-hahayouwish&objectIdentifier=4596&transactions%5B0%5D%5Btype%5D=title&transactions%5B0%5D%5Bvalue%5D=create+alpha+for+phabricator+test",
267 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
209 "method": "POST",
210 "body": "diff_id=14304&data=%7B%22user%22%3A+%22test%22%2C+%22parent%22%3A+%220000000000000000000000000000000000000000%22%2C+%22node%22%3A+%22939d862f03181a366fea64a540baf0bb33f85d92%22%2C+%22date%22%3A+%220+0%22%7D&api.token=cli-hahayouwish&name=hg%3Ameta",
211 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
268 212 "headers": {
269 "content-length": [
270 "165"
271 ],
272 "host": [
273 "phab.mercurial-scm.org"
274 ],
275 213 "content-type": [
276 214 "application/x-www-form-urlencoded"
277 ],
215 ],
278 216 "accept": [
279 217 "application/mercurial-0.1"
280 ],
218 ],
281 219 "user-agent": [
282 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
220 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
221 ],
222 "host": [
223 "phab.mercurial-scm.org"
224 ],
225 "content-length": [
226 "264"
283 227 ]
284 },
285 "method": "POST"
286 },
228 }
229 },
287 230 "response": {
288 231 "status": {
289 "code": 200,
232 "code": 200,
290 233 "message": "OK"
291 },
234 },
235 "body": {
236 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
237 },
292 238 "headers": {
293 "server": [
294 "Apache/2.4.10 (Debian)"
295 ],
296 "strict-transport-security": [
297 "max-age=0; includeSubdomains; preload"
298 ],
299 "x-frame-options": [
300 "Deny"
301 ],
302 "x-content-type-options": [
303 "nosniff"
304 ],
305 239 "expires": [
306 240 "Sat, 01 Jan 2000 00:00:00 GMT"
307 ],
308 "set-cookie": [
309 "phsid=A%2F7ubtculubfazivfxjxbmnyt3wzjcgdxnfdn57t42; expires=Thu, 14-Sep-2023 04:53:48 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
310 ],
241 ],
311 242 "x-xss-protection": [
312 243 "1; mode=block"
313 ],
314 "content-type": [
315 "application/json"
316 ],
244 ],
245 "transfer-encoding": [
246 "chunked"
247 ],
248 "date": [
249 "Sun, 03 Mar 2019 00:12:32 GMT"
250 ],
251 "x-frame-options": [
252 "Deny"
253 ],
317 254 "cache-control": [
318 255 "no-store"
319 ],
320 "date": [
321 "Sat, 15 Sep 2018 04:53:47 GMT"
256 ],
257 "content-type": [
258 "application/json"
259 ],
260 "x-content-type-options": [
261 "nosniff"
262 ],
263 "server": [
264 "Apache/2.4.10 (Debian)"
265 ],
266 "set-cookie": [
267 "phsid=A%2Feho2462w6mulsjeoz3e4rwgf37aekqwgpqmarn2f; expires=Fri, 01-Mar-2024 00:12:32 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
268 ],
269 "strict-transport-security": [
270 "max-age=0; includeSubdomains; preload"
322 271 ]
323 },
324 "body": {
325 "string": "{\"result\":{\"object\":{\"id\":\"4596\",\"phid\":\"PHID-DREV-bntcdwe74cw3vwkzt6nq\"},\"transactions\":[]},\"error_code\":null,\"error_info\":null}"
326 272 }
327 273 }
328 },
274 },
329 275 {
330 276 "request": {
331 "body": "api.token=cli-hahayouwish&constraints%5Bcallsigns%5D%5B0%5D=HG",
332 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
277 "method": "POST",
278 "body": "diff_id=14304&data=%7B%22939d862f03181a366fea64a540baf0bb33f85d92%22%3A+%7B%22author%22%3A+%22test%22%2C+%22authorEmail%22%3A+%22test%22%2C+%22time%22%3A+0.0%7D%7D&api.token=cli-hahayouwish&name=local%3Acommits",
279 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
333 280 "headers": {
334 "content-length": [
335 "79"
336 ],
337 "host": [
338 "phab.mercurial-scm.org"
339 ],
340 281 "content-type": [
341 282 "application/x-www-form-urlencoded"
342 ],
283 ],
343 284 "accept": [
344 285 "application/mercurial-0.1"
345 ],
286 ],
346 287 "user-agent": [
347 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
288 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
289 ],
290 "host": [
291 "phab.mercurial-scm.org"
292 ],
293 "content-length": [
294 "227"
348 295 ]
349 },
350 "method": "POST"
351 },
296 }
297 },
352 298 "response": {
353 299 "status": {
354 "code": 200,
300 "code": 200,
355 301 "message": "OK"
356 },
302 },
303 "body": {
304 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
305 },
357 306 "headers": {
358 "server": [
359 "Apache/2.4.10 (Debian)"
360 ],
361 "strict-transport-security": [
362 "max-age=0; includeSubdomains; preload"
363 ],
307 "expires": [
308 "Sat, 01 Jan 2000 00:00:00 GMT"
309 ],
310 "x-xss-protection": [
311 "1; mode=block"
312 ],
313 "transfer-encoding": [
314 "chunked"
315 ],
316 "date": [
317 "Sun, 03 Mar 2019 00:12:33 GMT"
318 ],
364 319 "x-frame-options": [
365 320 "Deny"
366 ],
321 ],
322 "cache-control": [
323 "no-store"
324 ],
325 "content-type": [
326 "application/json"
327 ],
367 328 "x-content-type-options": [
368 329 "nosniff"
369 ],
370 "expires": [
371 "Sat, 01 Jan 2000 00:00:00 GMT"
372 ],
330 ],
331 "server": [
332 "Apache/2.4.10 (Debian)"
333 ],
373 334 "set-cookie": [
374 "phsid=A%2Fdpvy3rwephm5krs7posuadvjmkh7o7wbytgdhisv; expires=Thu, 14-Sep-2023 04:53:48 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
375 ],
376 "x-xss-protection": [
377 "1; mode=block"
378 ],
379 "content-type": [
380 "application/json"
381 ],
382 "cache-control": [
383 "no-store"
384 ],
385 "date": [
386 "Sat, 15 Sep 2018 04:53:48 GMT"
335 "phsid=A%2F4ca3h5qhtwgn55t3zznczixyt2st4tm44t23aceg; expires=Fri, 01-Mar-2024 00:12:33 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
336 ],
337 "strict-transport-security": [
338 "max-age=0; includeSubdomains; preload"
387 339 ]
388 },
389 "body": {
390 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
391 340 }
392 341 }
393 },
342 },
394 343 {
395 344 "request": {
396 "body": "api.token=cli-hahayouwish&diff=diff+--git+a%2Fbeta+b%2Fbeta%0Anew+file+mode+100644%0A---+%2Fdev%2Fnull%0A%2B%2B%2B+b%2Fbeta%0A%40%40+-0%2C0+%2B1%2C1+%40%40%0A%2Bbeta%0A&repositoryPHID=PHID-REPO-bvunnehri4u2isyr7bc3",
397 "uri": "https://phab.mercurial-scm.org//api/differential.createrawdiff",
345 "method": "POST",
346 "body": "api.token=cli-hahayouwish&corpus=create+alpha+for+phabricator+test+%E2%82%AC%0A%0ADifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD6054",
347 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
398 348 "headers": {
399 "content-length": [
400 "231"
401 ],
402 "host": [
403 "phab.mercurial-scm.org"
404 ],
405 349 "content-type": [
406 350 "application/x-www-form-urlencoded"
407 ],
351 ],
408 352 "accept": [
409 353 "application/mercurial-0.1"
410 ],
354 ],
411 355 "user-agent": [
412 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
356 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
357 ],
358 "host": [
359 "phab.mercurial-scm.org"
360 ],
361 "content-length": [
362 "168"
413 363 ]
414 },
415 "method": "POST"
416 },
364 }
365 },
417 366 "response": {
418 367 "status": {
419 "code": 200,
368 "code": 200,
420 369 "message": "OK"
421 },
370 },
371 "body": {
372 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"create alpha for phabricator test \\u20ac\",\"revisionID\":6054},\"revisionIDFieldInfo\":{\"value\":6054,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"}},\"error_code\":null,\"error_info\":null}"
373 },
422 374 "headers": {
375 "expires": [
376 "Sat, 01 Jan 2000 00:00:00 GMT"
377 ],
378 "x-xss-protection": [
379 "1; mode=block"
380 ],
381 "transfer-encoding": [
382 "chunked"
383 ],
384 "date": [
385 "Sun, 03 Mar 2019 00:12:34 GMT"
386 ],
387 "x-frame-options": [
388 "Deny"
389 ],
390 "cache-control": [
391 "no-store"
392 ],
393 "content-type": [
394 "application/json"
395 ],
396 "x-content-type-options": [
397 "nosniff"
398 ],
423 399 "server": [
424 400 "Apache/2.4.10 (Debian)"
425 ],
401 ],
402 "set-cookie": [
403 "phsid=A%2F7pvtbpw2waiblbsbydew3vfpulqnccf4647ymipq; expires=Fri, 01-Mar-2024 00:12:34 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
404 ],
426 405 "strict-transport-security": [
427 406 "max-age=0; includeSubdomains; preload"
428 ],
429 "x-frame-options": [
430 "Deny"
431 ],
432 "x-content-type-options": [
433 "nosniff"
434 ],
407 ]
408 }
409 }
410 },
411 {
412 "request": {
413 "method": "POST",
414 "body": "api.token=cli-hahayouwish&transactions%5B0%5D%5Btype%5D=update&transactions%5B0%5D%5Bvalue%5D=PHID-DIFF-3wv2fwmzp27uamb66xxg&transactions%5B1%5D%5Btype%5D=title&transactions%5B1%5D%5Bvalue%5D=create+alpha+for+phabricator+test+%E2%82%AC&objectIdentifier=6054",
415 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
416 "headers": {
417 "content-type": [
418 "application/x-www-form-urlencoded"
419 ],
420 "accept": [
421 "application/mercurial-0.1"
422 ],
423 "user-agent": [
424 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
425 ],
426 "host": [
427 "phab.mercurial-scm.org"
428 ],
429 "content-length": [
430 "274"
431 ]
432 }
433 },
434 "response": {
435 "status": {
436 "code": 200,
437 "message": "OK"
438 },
439 "body": {
440 "string": "{\"result\":{\"object\":{\"id\":\"6054\",\"phid\":\"PHID-DREV-6pczsbtdpqjc2nskmxwy\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-mc2gfyoyhkfz7dy\"}]},\"error_code\":null,\"error_info\":null}"
441 },
442 "headers": {
435 443 "expires": [
436 444 "Sat, 01 Jan 2000 00:00:00 GMT"
437 ],
438 "set-cookie": [
439 "phsid=A%2Fafqgsnm7vbqi3vyfg5c7xgxyiv7fgi77vauw6wnv; expires=Thu, 14-Sep-2023 04:53:49 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
440 ],
445 ],
441 446 "x-xss-protection": [
442 447 "1; mode=block"
443 ],
448 ],
449 "transfer-encoding": [
450 "chunked"
451 ],
452 "date": [
453 "Sun, 03 Mar 2019 00:12:34 GMT"
454 ],
455 "x-frame-options": [
456 "Deny"
457 ],
458 "cache-control": [
459 "no-store"
460 ],
444 461 "content-type": [
445 462 "application/json"
446 ],
447 "cache-control": [
448 "no-store"
449 ],
450 "date": [
451 "Sat, 15 Sep 2018 04:53:49 GMT"
463 ],
464 "x-content-type-options": [
465 "nosniff"
466 ],
467 "server": [
468 "Apache/2.4.10 (Debian)"
469 ],
470 "set-cookie": [
471 "phsid=A%2Fhmyuw3lg6h4joaswqnfcmnzdkp6p2qxotsvahb7l; expires=Fri, 01-Mar-2024 00:12:34 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
472 ],
473 "strict-transport-security": [
474 "max-age=0; includeSubdomains; preload"
452 475 ]
453 },
454 "body": {
455 "string": "{\"result\":{\"id\":11074,\"phid\":\"PHID-DIFF-sitmath22fwgsfsbdmne\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/11074\\/\"},\"error_code\":null,\"error_info\":null}"
456 476 }
457 477 }
458 },
478 },
459 479 {
460 480 "request": {
461 "body": "diff_id=11074&api.token=cli-hahayouwish&data=%7B%22parent%22%3A+%22f70265671c65ab4b5416e611a6bd61887c013122%22%2C+%22node%22%3A+%221a5640df7bbfc26fc4f6ef38e4d1581d5b2a3122%22%2C+%22user%22%3A+%22test%22%2C+%22date%22%3A+%220+0%22%7D&name=hg%3Ameta",
462 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
481 "method": "POST",
482 "body": "repositoryPHID=PHID-REPO-bvunnehri4u2isyr7bc3&api.token=cli-hahayouwish&diff=diff+--git+a%2Fbeta+b%2Fbeta%0Anew+file+mode+100644%0A---+%2Fdev%2Fnull%0A%2B%2B%2B+b%2Fbeta%0A%40%40+-0%2C0+%2B1%2C1+%40%40%0A%2Bbeta%0A",
483 "uri": "https://phab.mercurial-scm.org//api/differential.createrawdiff",
463 484 "headers": {
464 "content-length": [
465 "264"
466 ],
485 "content-type": [
486 "application/x-www-form-urlencoded"
487 ],
488 "accept": [
489 "application/mercurial-0.1"
490 ],
491 "user-agent": [
492 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
493 ],
467 494 "host": [
468 495 "phab.mercurial-scm.org"
469 ],
470 "content-type": [
471 "application/x-www-form-urlencoded"
472 ],
473 "accept": [
474 "application/mercurial-0.1"
475 ],
476 "user-agent": [
477 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
496 ],
497 "content-length": [
498 "231"
478 499 ]
479 },
480 "method": "POST"
481 },
500 }
501 },
482 502 "response": {
483 503 "status": {
484 "code": 200,
504 "code": 200,
485 505 "message": "OK"
486 },
506 },
507 "body": {
508 "string": "{\"result\":{\"id\":14305,\"phid\":\"PHID-DIFF-pofynzhmmqm2czm33teg\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/14305\\/\"},\"error_code\":null,\"error_info\":null}"
509 },
487 510 "headers": {
488 "server": [
489 "Apache/2.4.10 (Debian)"
490 ],
491 "strict-transport-security": [
492 "max-age=0; includeSubdomains; preload"
493 ],
511 "expires": [
512 "Sat, 01 Jan 2000 00:00:00 GMT"
513 ],
514 "x-xss-protection": [
515 "1; mode=block"
516 ],
517 "transfer-encoding": [
518 "chunked"
519 ],
520 "date": [
521 "Sun, 03 Mar 2019 00:12:35 GMT"
522 ],
494 523 "x-frame-options": [
495 524 "Deny"
496 ],
497 "x-content-type-options": [
498 "nosniff"
499 ],
500 "expires": [
501 "Sat, 01 Jan 2000 00:00:00 GMT"
502 ],
503 "set-cookie": [
504 "phsid=A%2Frvpld6nyjmtrq3qynmldbquhgwbrhcdhythbot6r; expires=Thu, 14-Sep-2023 04:53:49 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
505 ],
506 "x-xss-protection": [
507 "1; mode=block"
508 ],
525 ],
526 "cache-control": [
527 "no-store"
528 ],
509 529 "content-type": [
510 530 "application/json"
511 ],
512 "cache-control": [
513 "no-store"
514 ],
515 "date": [
516 "Sat, 15 Sep 2018 04:53:49 GMT"
531 ],
532 "x-content-type-options": [
533 "nosniff"
534 ],
535 "server": [
536 "Apache/2.4.10 (Debian)"
537 ],
538 "set-cookie": [
539 "phsid=A%2F2xpzt6bryn7n3gug3ll7iu2gfqyy4zss5d7nolew; expires=Fri, 01-Mar-2024 00:12:35 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
540 ],
541 "strict-transport-security": [
542 "max-age=0; includeSubdomains; preload"
517 543 ]
518 },
519 "body": {
520 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
521 544 }
522 545 }
523 },
546 },
524 547 {
525 548 "request": {
526 "body": "diff_id=11074&api.token=cli-hahayouwish&data=%7B%221a5640df7bbfc26fc4f6ef38e4d1581d5b2a3122%22%3A+%7B%22time%22%3A+0.0%2C+%22authorEmail%22%3A+%22test%22%2C+%22author%22%3A+%22test%22%7D%7D&name=local%3Acommits",
527 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
549 "method": "POST",
550 "body": "diff_id=14305&data=%7B%22user%22%3A+%22test%22%2C+%22parent%22%3A+%22939d862f03181a366fea64a540baf0bb33f85d92%22%2C+%22node%22%3A+%22f55f947ed0f8ad80a04b7e87a0bf9febda2070b1%22%2C+%22date%22%3A+%220+0%22%7D&api.token=cli-hahayouwish&name=hg%3Ameta",
551 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
528 552 "headers": {
529 "content-length": [
530 "227"
531 ],
532 "host": [
533 "phab.mercurial-scm.org"
534 ],
535 553 "content-type": [
536 554 "application/x-www-form-urlencoded"
537 ],
555 ],
538 556 "accept": [
539 557 "application/mercurial-0.1"
540 ],
558 ],
541 559 "user-agent": [
542 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
560 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
561 ],
562 "host": [
563 "phab.mercurial-scm.org"
564 ],
565 "content-length": [
566 "264"
543 567 ]
544 },
545 "method": "POST"
546 },
568 }
569 },
547 570 "response": {
548 571 "status": {
549 "code": 200,
572 "code": 200,
550 573 "message": "OK"
551 },
574 },
575 "body": {
576 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
577 },
552 578 "headers": {
553 "server": [
554 "Apache/2.4.10 (Debian)"
555 ],
556 "strict-transport-security": [
557 "max-age=0; includeSubdomains; preload"
558 ],
559 "x-frame-options": [
560 "Deny"
561 ],
562 "x-content-type-options": [
563 "nosniff"
564 ],
565 579 "expires": [
566 580 "Sat, 01 Jan 2000 00:00:00 GMT"
567 ],
568 "set-cookie": [
569 "phsid=A%2Flpkv333zitgztqx2clpg2uibjy633myliembguf2; expires=Thu, 14-Sep-2023 04:53:50 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
570 ],
581 ],
571 582 "x-xss-protection": [
572 583 "1; mode=block"
573 ],
574 "content-type": [
575 "application/json"
576 ],
584 ],
585 "transfer-encoding": [
586 "chunked"
587 ],
588 "date": [
589 "Sun, 03 Mar 2019 00:12:36 GMT"
590 ],
591 "x-frame-options": [
592 "Deny"
593 ],
577 594 "cache-control": [
578 595 "no-store"
579 ],
580 "date": [
581 "Sat, 15 Sep 2018 04:53:49 GMT"
582 ]
583 },
584 "body": {
585 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
586 }
587 }
588 },
589 {
590 "request": {
591 "body": "api.token=cli-hahayouwish&corpus=create+beta+for+phabricator+test",
592 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
593 "headers": {
594 "content-length": [
595 "82"
596 ],
597 "host": [
598 "phab.mercurial-scm.org"
599 ],
596 ],
600 597 "content-type": [
601 "application/x-www-form-urlencoded"
602 ],
603 "accept": [
604 "application/mercurial-0.1"
605 ],
606 "user-agent": [
607 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
608 ]
609 },
610 "method": "POST"
611 },
612 "response": {
613 "status": {
614 "code": 200,
615 "message": "OK"
616 },
617 "headers": {
598 "application/json"
599 ],
600 "x-content-type-options": [
601 "nosniff"
602 ],
618 603 "server": [
619 604 "Apache/2.4.10 (Debian)"
620 ],
605 ],
606 "set-cookie": [
607 "phsid=A%2Fygzbpe74xh6shrejkd3tj32t4gaqnvumy63iudrd; expires=Fri, 01-Mar-2024 00:12:36 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
608 ],
621 609 "strict-transport-security": [
622 610 "max-age=0; includeSubdomains; preload"
623 ],
624 "x-frame-options": [
625 "Deny"
626 ],
627 "x-content-type-options": [
628 "nosniff"
629 ],
630 "expires": [
631 "Sat, 01 Jan 2000 00:00:00 GMT"
632 ],
633 "set-cookie": [
634 "phsid=A%2Fav6ovbqxoy3dijysouoabcz7jqescejugeedwspi; expires=Thu, 14-Sep-2023 04:53:50 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
635 ],
636 "x-xss-protection": [
637 "1; mode=block"
638 ],
639 "content-type": [
640 "application/json"
641 ],
642 "cache-control": [
643 "no-store"
644 ],
645 "date": [
646 "Sat, 15 Sep 2018 04:53:50 GMT"
647 611 ]
648 },
649 "body": {
650 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"create beta for phabricator test\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"}},\"error_code\":null,\"error_info\":null}"
651 612 }
652 613 }
653 },
614 },
654 615 {
655 616 "request": {
656 "body": "api.token=cli-hahayouwish&transactions%5B0%5D%5Btype%5D=update&transactions%5B0%5D%5Bvalue%5D=PHID-DIFF-sitmath22fwgsfsbdmne&transactions%5B1%5D%5Btype%5D=summary&transactions%5B1%5D%5Bvalue%5D=Depends+on+D4596&transactions%5B2%5D%5Btype%5D=summary&transactions%5B2%5D%5Bvalue%5D=+&transactions%5B3%5D%5Btype%5D=title&transactions%5B3%5D%5Bvalue%5D=create+beta+for+phabricator+test",
657 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
617 "method": "POST",
618 "body": "diff_id=14305&data=%7B%22f55f947ed0f8ad80a04b7e87a0bf9febda2070b1%22%3A+%7B%22author%22%3A+%22test%22%2C+%22authorEmail%22%3A+%22test%22%2C+%22time%22%3A+0.0%7D%7D&api.token=cli-hahayouwish&name=local%3Acommits",
619 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
658 620 "headers": {
659 "content-length": [
660 "398"
661 ],
662 "host": [
663 "phab.mercurial-scm.org"
664 ],
665 621 "content-type": [
666 622 "application/x-www-form-urlencoded"
667 ],
623 ],
668 624 "accept": [
669 625 "application/mercurial-0.1"
670 ],
626 ],
671 627 "user-agent": [
672 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
628 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
629 ],
630 "host": [
631 "phab.mercurial-scm.org"
632 ],
633 "content-length": [
634 "227"
673 635 ]
674 },
675 "method": "POST"
676 },
636 }
637 },
677 638 "response": {
678 639 "status": {
679 "code": 200,
640 "code": 200,
680 641 "message": "OK"
681 },
642 },
643 "body": {
644 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
645 },
646 "headers": {
647 "expires": [
648 "Sat, 01 Jan 2000 00:00:00 GMT"
649 ],
650 "x-xss-protection": [
651 "1; mode=block"
652 ],
653 "transfer-encoding": [
654 "chunked"
655 ],
656 "date": [
657 "Sun, 03 Mar 2019 00:12:37 GMT"
658 ],
659 "x-frame-options": [
660 "Deny"
661 ],
662 "cache-control": [
663 "no-store"
664 ],
665 "content-type": [
666 "application/json"
667 ],
668 "x-content-type-options": [
669 "nosniff"
670 ],
671 "server": [
672 "Apache/2.4.10 (Debian)"
673 ],
674 "set-cookie": [
675 "phsid=A%2Fgw67yfcsx7vvxkymeac52ca5is4jkxjwqqkhayco; expires=Fri, 01-Mar-2024 00:12:37 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
676 ],
677 "strict-transport-security": [
678 "max-age=0; includeSubdomains; preload"
679 ]
680 }
681 }
682 },
683 {
684 "request": {
685 "method": "POST",
686 "body": "api.token=cli-hahayouwish&corpus=create+beta+for+phabricator+test",
687 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
682 688 "headers": {
689 "content-type": [
690 "application/x-www-form-urlencoded"
691 ],
692 "accept": [
693 "application/mercurial-0.1"
694 ],
695 "user-agent": [
696 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
697 ],
698 "host": [
699 "phab.mercurial-scm.org"
700 ],
701 "content-length": [
702 "82"
703 ]
704 }
705 },
706 "response": {
707 "status": {
708 "code": 200,
709 "message": "OK"
710 },
711 "body": {
712 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"create beta for phabricator test\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"}},\"error_code\":null,\"error_info\":null}"
713 },
714 "headers": {
715 "expires": [
716 "Sat, 01 Jan 2000 00:00:00 GMT"
717 ],
718 "x-xss-protection": [
719 "1; mode=block"
720 ],
721 "transfer-encoding": [
722 "chunked"
723 ],
724 "date": [
725 "Sun, 03 Mar 2019 00:12:37 GMT"
726 ],
727 "x-frame-options": [
728 "Deny"
729 ],
730 "cache-control": [
731 "no-store"
732 ],
733 "content-type": [
734 "application/json"
735 ],
736 "x-content-type-options": [
737 "nosniff"
738 ],
683 739 "server": [
684 740 "Apache/2.4.10 (Debian)"
685 ],
741 ],
742 "set-cookie": [
743 "phsid=A%2Fyt5ejs6pgvjdxzms7geaxup63jpqkisngu3cprk6; expires=Fri, 01-Mar-2024 00:12:37 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
744 ],
686 745 "strict-transport-security": [
687 746 "max-age=0; includeSubdomains; preload"
688 ],
689 "x-frame-options": [
690 "Deny"
691 ],
692 "x-content-type-options": [
693 "nosniff"
694 ],
695 "expires": [
696 "Sat, 01 Jan 2000 00:00:00 GMT"
697 ],
698 "set-cookie": [
699 "phsid=A%2Fywrdtdafcn5p267qiqfgfh7h4buaqxmnrgan6fh2; expires=Thu, 14-Sep-2023 04:53:50 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
700 ],
701 "x-xss-protection": [
702 "1; mode=block"
703 ],
704 "content-type": [
705 "application/json"
706 ],
707 "cache-control": [
708 "no-store"
709 ],
710 "date": [
711 "Sat, 15 Sep 2018 04:53:50 GMT"
712 747 ]
713 },
714 "body": {
715 "string": "{\"result\":{\"object\":{\"id\":4597,\"phid\":\"PHID-DREV-as7flhipq636gqvnyrsf\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-bwzosyyqmzlhe6g\"},{\"phid\":\"PHID-XACT-DREV-ina5ktuwp6eiwv6\"},{\"phid\":\"PHID-XACT-DREV-22bjztn3szeyicy\"},{\"phid\":\"PHID-XACT-DREV-kcv6zk2yboepbmo\"},{\"phid\":\"PHID-XACT-DREV-mnbp6f6sq54hzs2\"},{\"phid\":\"PHID-XACT-DREV-qlakltzsdzclpha\"},{\"phid\":\"PHID-XACT-DREV-a5347cobhvqnc22\"},{\"phid\":\"PHID-XACT-DREV-sciqq5cqfuqfh67\"}]},\"error_code\":null,\"error_info\":null}"
716 748 }
717 749 }
718 },
750 },
719 751 {
720 752 "request": {
721 "body": "api.token=cli-hahayouwish&ids%5B0%5D=4596&ids%5B1%5D=4597",
722 "uri": "https://phab.mercurial-scm.org//api/differential.query",
753 "method": "POST",
754 "body": "transactions%5B0%5D%5Btype%5D=update&transactions%5B0%5D%5Bvalue%5D=PHID-DIFF-pofynzhmmqm2czm33teg&transactions%5B1%5D%5Btype%5D=summary&transactions%5B1%5D%5Bvalue%5D=Depends+on+D6054&transactions%5B2%5D%5Btype%5D=summary&transactions%5B2%5D%5Bvalue%5D=+&transactions%5B3%5D%5Btype%5D=title&transactions%5B3%5D%5Bvalue%5D=create+beta+for+phabricator+test&api.token=cli-hahayouwish",
755 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
723 756 "headers": {
724 "content-length": [
725 "74"
726 ],
727 "host": [
728 "phab.mercurial-scm.org"
729 ],
730 757 "content-type": [
731 758 "application/x-www-form-urlencoded"
732 ],
759 ],
733 760 "accept": [
734 761 "application/mercurial-0.1"
735 ],
762 ],
736 763 "user-agent": [
737 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
764 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
765 ],
766 "host": [
767 "phab.mercurial-scm.org"
768 ],
769 "content-length": [
770 "398"
738 771 ]
739 },
740 "method": "POST"
741 },
772 }
773 },
742 774 "response": {
743 775 "status": {
744 "code": 200,
776 "code": 200,
745 777 "message": "OK"
746 },
778 },
779 "body": {
780 "string": "{\"result\":{\"object\":{\"id\":6055,\"phid\":\"PHID-DREV-k2hin2iytzuvu3j5icm3\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-3xjvwemev7dqsj3\"},{\"phid\":\"PHID-XACT-DREV-giypqlavgemr56i\"},{\"phid\":\"PHID-XACT-DREV-tcfqd4aj6rxtxzz\"},{\"phid\":\"PHID-XACT-DREV-2timgnudaxeln7a\"},{\"phid\":\"PHID-XACT-DREV-vb6564lrsxpsw4l\"},{\"phid\":\"PHID-XACT-DREV-maym4xi2tdhysvo\"},{\"phid\":\"PHID-XACT-DREV-bna5heyckxkk5ke\"},{\"phid\":\"PHID-XACT-DREV-b2eig3stbdic7k7\"}]},\"error_code\":null,\"error_info\":null}"
781 },
747 782 "headers": {
748 "server": [
749 "Apache/2.4.10 (Debian)"
750 ],
751 "strict-transport-security": [
752 "max-age=0; includeSubdomains; preload"
753 ],
754 "x-frame-options": [
755 "Deny"
756 ],
757 "x-content-type-options": [
758 "nosniff"
759 ],
760 783 "expires": [
761 784 "Sat, 01 Jan 2000 00:00:00 GMT"
762 ],
763 "set-cookie": [
764 "phsid=A%2F2iio6iugurtd7ml2tnwfwv24hkrfhs62yshvmouv; expires=Thu, 14-Sep-2023 04:53:51 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
765 ],
785 ],
766 786 "x-xss-protection": [
767 787 "1; mode=block"
768 ],
769 "content-type": [
770 "application/json"
771 ],
788 ],
789 "transfer-encoding": [
790 "chunked"
791 ],
792 "date": [
793 "Sun, 03 Mar 2019 00:12:38 GMT"
794 ],
795 "x-frame-options": [
796 "Deny"
797 ],
772 798 "cache-control": [
773 799 "no-store"
774 ],
775 "date": [
776 "Sat, 15 Sep 2018 04:53:51 GMT"
800 ],
801 "content-type": [
802 "application/json"
803 ],
804 "x-content-type-options": [
805 "nosniff"
806 ],
807 "server": [
808 "Apache/2.4.10 (Debian)"
809 ],
810 "set-cookie": [
811 "phsid=A%2Fgqyrj3op7rar26t6crqlt6rpdsxcefnrofqkw5rt; expires=Fri, 01-Mar-2024 00:12:38 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
812 ],
813 "strict-transport-security": [
814 "max-age=0; includeSubdomains; preload"
777 815 ]
778 },
779 "body": {
780 "string": "{\"result\":[{\"id\":\"4597\",\"phid\":\"PHID-DREV-as7flhipq636gqvnyrsf\",\"title\":\"create beta for phabricator test\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D4597\",\"dateCreated\":\"1536987231\",\"dateModified\":\"1536987231\",\"authorPHID\":\"PHID-USER-cgcdlc6c3gpxapbmkwa2\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":[],\"branch\":null,\"summary\":\" \",\"testPlan\":\"\",\"lineCount\":\"1\",\"activeDiffPHID\":\"PHID-DIFF-sitmath22fwgsfsbdmne\",\"diffs\":[\"11074\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[\"PHID-DREV-bntcdwe74cw3vwkzt6nq\"]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":null},{\"id\":\"4596\",\"phid\":\"PHID-DREV-bntcdwe74cw3vwkzt6nq\",\"title\":\"create alpha for phabricator test\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D4596\",\"dateCreated\":\"1536986862\",\"dateModified\":\"1536987231\",\"authorPHID\":\"PHID-USER-cgcdlc6c3gpxapbmkwa2\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":[],\"branch\":null,\"summary\":\"\",\"testPlan\":\"\",\"lineCount\":\"2\",\"activeDiffPHID\":\"PHID-DIFF-vwre7kpjdq52wbt56ftl\",\"diffs\":[\"11073\",\"11072\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":null}],\"error_code\":null,\"error_info\":null}"
781 816 }
782 817 }
783 },
818 },
784 819 {
785 820 "request": {
786 "body": "diff_id=11074&api.token=cli-hahayouwish&data=%7B%22parent%22%3A+%22f70265671c65ab4b5416e611a6bd61887c013122%22%2C+%22node%22%3A+%22c2b605ada280b38c38031b5d31622869c72b0d8d%22%2C+%22user%22%3A+%22test%22%2C+%22date%22%3A+%220+0%22%7D&name=hg%3Ameta",
787 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
821 "method": "POST",
822 "body": "api.token=cli-hahayouwish&ids%5B0%5D=6054&ids%5B1%5D=6055",
823 "uri": "https://phab.mercurial-scm.org//api/differential.query",
788 824 "headers": {
789 "content-length": [
790 "264"
791 ],
792 "host": [
793 "phab.mercurial-scm.org"
794 ],
795 825 "content-type": [
796 826 "application/x-www-form-urlencoded"
797 ],
827 ],
798 828 "accept": [
799 829 "application/mercurial-0.1"
800 ],
830 ],
801 831 "user-agent": [
802 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
832 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
833 ],
834 "host": [
835 "phab.mercurial-scm.org"
836 ],
837 "content-length": [
838 "74"
803 839 ]
804 },
805 "method": "POST"
806 },
840 }
841 },
807 842 "response": {
808 843 "status": {
809 "code": 200,
844 "code": 200,
810 845 "message": "OK"
811 },
846 },
847 "body": {
848 "string": "{\"result\":[{\"id\":\"6055\",\"phid\":\"PHID-DREV-k2hin2iytzuvu3j5icm3\",\"title\":\"create beta for phabricator test\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D6055\",\"dateCreated\":\"1551571958\",\"dateModified\":\"1551571958\",\"authorPHID\":\"PHID-USER-5iy6mkoveguhm2zthvww\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":[],\"branch\":null,\"summary\":\" \",\"testPlan\":\"\",\"lineCount\":\"1\",\"activeDiffPHID\":\"PHID-DIFF-pofynzhmmqm2czm33teg\",\"diffs\":[\"14305\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[\"PHID-DREV-6pczsbtdpqjc2nskmxwy\"]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":null},{\"id\":\"6054\",\"phid\":\"PHID-DREV-6pczsbtdpqjc2nskmxwy\",\"title\":\"create alpha for phabricator test \\u20ac\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D6054\",\"dateCreated\":\"1551571947\",\"dateModified\":\"1551571958\",\"authorPHID\":\"PHID-USER-5iy6mkoveguhm2zthvww\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":[],\"branch\":null,\"summary\":\"\",\"testPlan\":\"\",\"lineCount\":\"2\",\"activeDiffPHID\":\"PHID-DIFF-3wv2fwmzp27uamb66xxg\",\"diffs\":[\"14304\",\"14303\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":null}],\"error_code\":null,\"error_info\":null}"
849 },
812 850 "headers": {
813 "server": [
814 "Apache/2.4.10 (Debian)"
815 ],
816 "strict-transport-security": [
817 "max-age=0; includeSubdomains; preload"
818 ],
851 "expires": [
852 "Sat, 01 Jan 2000 00:00:00 GMT"
853 ],
854 "x-xss-protection": [
855 "1; mode=block"
856 ],
857 "transfer-encoding": [
858 "chunked"
859 ],
860 "date": [
861 "Sun, 03 Mar 2019 00:12:39 GMT"
862 ],
819 863 "x-frame-options": [
820 864 "Deny"
821 ],
865 ],
866 "cache-control": [
867 "no-store"
868 ],
869 "content-type": [
870 "application/json"
871 ],
822 872 "x-content-type-options": [
823 873 "nosniff"
824 ],
825 "expires": [
826 "Sat, 01 Jan 2000 00:00:00 GMT"
827 ],
874 ],
875 "server": [
876 "Apache/2.4.10 (Debian)"
877 ],
828 878 "set-cookie": [
829 "phsid=A%2Fvwsd2gtkeg64gticvthsxnpufne42t4eqityra25; expires=Thu, 14-Sep-2023 04:53:52 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
830 ],
831 "x-xss-protection": [
832 "1; mode=block"
833 ],
834 "content-type": [
835 "application/json"
836 ],
837 "cache-control": [
838 "no-store"
839 ],
840 "date": [
841 "Sat, 15 Sep 2018 04:53:52 GMT"
879 "phsid=A%2F5wxg6sdf2mby5iljd5e5qpgoex6uefo5pgltav7k; expires=Fri, 01-Mar-2024 00:12:39 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
880 ],
881 "strict-transport-security": [
882 "max-age=0; includeSubdomains; preload"
842 883 ]
843 },
844 "body": {
845 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
846 884 }
847 885 }
848 },
886 },
849 887 {
850 888 "request": {
851 "body": "diff_id=11074&api.token=cli-hahayouwish&data=%7B%22c2b605ada280b38c38031b5d31622869c72b0d8d%22%3A+%7B%22time%22%3A+0.0%2C+%22authorEmail%22%3A+%22test%22%2C+%22author%22%3A+%22test%22%7D%7D&name=local%3Acommits",
852 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
889 "method": "POST",
890 "body": "diff_id=14305&data=%7B%22user%22%3A+%22test%22%2C+%22parent%22%3A+%22939d862f03181a366fea64a540baf0bb33f85d92%22%2C+%22node%22%3A+%229c64e1fc33e1b9a70eb60643fe96a4d5badad9dc%22%2C+%22date%22%3A+%220+0%22%7D&api.token=cli-hahayouwish&name=hg%3Ameta",
891 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
853 892 "headers": {
854 "content-length": [
855 "227"
856 ],
857 "host": [
858 "phab.mercurial-scm.org"
859 ],
860 893 "content-type": [
861 894 "application/x-www-form-urlencoded"
862 ],
895 ],
863 896 "accept": [
864 897 "application/mercurial-0.1"
865 ],
898 ],
866 899 "user-agent": [
867 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
900 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
901 ],
902 "host": [
903 "phab.mercurial-scm.org"
904 ],
905 "content-length": [
906 "264"
868 907 ]
869 },
870 "method": "POST"
871 },
908 }
909 },
872 910 "response": {
873 911 "status": {
874 "code": 200,
912 "code": 200,
875 913 "message": "OK"
876 },
914 },
915 "body": {
916 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
917 },
877 918 "headers": {
919 "expires": [
920 "Sat, 01 Jan 2000 00:00:00 GMT"
921 ],
922 "x-xss-protection": [
923 "1; mode=block"
924 ],
925 "transfer-encoding": [
926 "chunked"
927 ],
928 "date": [
929 "Sun, 03 Mar 2019 00:12:40 GMT"
930 ],
931 "x-frame-options": [
932 "Deny"
933 ],
934 "cache-control": [
935 "no-store"
936 ],
937 "content-type": [
938 "application/json"
939 ],
940 "x-content-type-options": [
941 "nosniff"
942 ],
878 943 "server": [
879 944 "Apache/2.4.10 (Debian)"
880 ],
945 ],
946 "set-cookie": [
947 "phsid=A%2F4c7iamnsn57y6qpccmbesf4ooflmkqvt4m6udawl; expires=Fri, 01-Mar-2024 00:12:40 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
948 ],
881 949 "strict-transport-security": [
882 950 "max-age=0; includeSubdomains; preload"
883 ],
884 "x-frame-options": [
885 "Deny"
886 ],
887 "x-content-type-options": [
888 "nosniff"
889 ],
951 ]
952 }
953 }
954 },
955 {
956 "request": {
957 "method": "POST",
958 "body": "diff_id=14305&data=%7B%229c64e1fc33e1b9a70eb60643fe96a4d5badad9dc%22%3A+%7B%22author%22%3A+%22test%22%2C+%22authorEmail%22%3A+%22test%22%2C+%22time%22%3A+0.0%7D%7D&api.token=cli-hahayouwish&name=local%3Acommits",
959 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
960 "headers": {
961 "content-type": [
962 "application/x-www-form-urlencoded"
963 ],
964 "accept": [
965 "application/mercurial-0.1"
966 ],
967 "user-agent": [
968 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
969 ],
970 "host": [
971 "phab.mercurial-scm.org"
972 ],
973 "content-length": [
974 "227"
975 ]
976 }
977 },
978 "response": {
979 "status": {
980 "code": 200,
981 "message": "OK"
982 },
983 "body": {
984 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
985 },
986 "headers": {
890 987 "expires": [
891 988 "Sat, 01 Jan 2000 00:00:00 GMT"
892 ],
893 "set-cookie": [
894 "phsid=A%2Fflxjbmx24qcq7qhggolo6b7iue7utwp7kyoazduk; expires=Thu, 14-Sep-2023 04:53:52 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
895 ],
989 ],
896 990 "x-xss-protection": [
897 991 "1; mode=block"
898 ],
992 ],
993 "transfer-encoding": [
994 "chunked"
995 ],
996 "date": [
997 "Sun, 03 Mar 2019 00:12:40 GMT"
998 ],
999 "x-frame-options": [
1000 "Deny"
1001 ],
1002 "cache-control": [
1003 "no-store"
1004 ],
899 1005 "content-type": [
900 1006 "application/json"
901 ],
902 "cache-control": [
903 "no-store"
904 ],
905 "date": [
906 "Sat, 15 Sep 2018 04:53:52 GMT"
1007 ],
1008 "x-content-type-options": [
1009 "nosniff"
1010 ],
1011 "server": [
1012 "Apache/2.4.10 (Debian)"
1013 ],
1014 "set-cookie": [
1015 "phsid=A%2Ftdudqohojcq4hyc7gl4kthzkhuq3nmcxgnunpbjm; expires=Fri, 01-Mar-2024 00:12:40 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
1016 ],
1017 "strict-transport-security": [
1018 "max-age=0; includeSubdomains; preload"
907 1019 ]
908 },
909 "body": {
910 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
911 1020 }
912 1021 }
913 1022 }
914 ]
1023 ],
1024 "version": 1
915 1025 }
@@ -1,119 +1,121 b''
1 1 #require vcr
2 2 $ cat >> $HGRCPATH <<EOF
3 3 > [extensions]
4 4 > phabricator =
5 5 > EOF
6 6 $ hg init repo
7 7 $ cd repo
8 8 $ cat >> .hg/hgrc <<EOF
9 9 > [phabricator]
10 10 > url = https://phab.mercurial-scm.org/
11 11 > callsign = HG
12 12 >
13 13 > [auth]
14 14 > hgphab.schemes = https
15 15 > hgphab.prefix = phab.mercurial-scm.org
16 16 > # When working on the extension and making phabricator interaction
17 17 > # changes, edit this to be a real phabricator token. When done, edit
18 18 > # it back, and make sure to also edit your VCR transcripts to match
19 19 > # whatever value you put here.
20 20 > hgphab.phabtoken = cli-hahayouwish
21 21 > EOF
22 22 $ VCR="$TESTDIR/phabricator"
23 23
24 24 Error is handled reasonably. We override the phabtoken here so that
25 25 when you're developing changes to phabricator.py you can edit the
26 26 above config and have a real token in the test but not have to edit
27 27 this test.
28 28 $ hg phabread --config auth.hgphab.phabtoken=cli-notavalidtoken \
29 29 > --test-vcr "$VCR/phabread-conduit-error.json" D4480 | head
30 30 abort: Conduit Error (ERR-INVALID-AUTH): API token "cli-notavalidtoken" has the wrong length. API tokens should be 32 characters long.
31 31
32 32 Basic phabread:
33 33 $ hg phabread --test-vcr "$VCR/phabread-4480.json" D4480 | head
34 34 # HG changeset patch
35 35 exchangev2: start to implement pull with wire protocol v2
36 36
37 37 Wire protocol version 2 will take a substantially different
38 38 approach to exchange than version 1 (at least as far as pulling
39 39 is concerned).
40 40
41 41 This commit establishes a new exchangev2 module for holding
42 42 code related to exchange using wire protocol v2. I could have
43 43 added things to the existing exchange module. But it is already
44 44
45 45 phabupdate with an accept:
46 46 $ hg phabupdate --accept D4564 \
47 47 > -m 'I think I like where this is headed. Will read rest of series later.'\
48 48 > --test-vcr "$VCR/accept-4564.json"
49 49
50 50 Create a differential diff:
51 $ HGENCODING=utf-8; export HGENCODING
51 52 $ echo alpha > alpha
52 $ hg ci --addremove -m 'create alpha for phabricator test'
53 $ hg ci --addremove -m 'create alpha for phabricator test '
53 54 adding alpha
54 55 $ hg phabsend -r . --test-vcr "$VCR/phabsend-create-alpha.json"
55 D4596 - created - 5206a4fa1e6c: create alpha for phabricator test
56 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/5206a4fa1e6c-dec9e777-phabsend.hg
56 D6054 - created - d386117f30e6: create alpha for phabricator test \xe2\x82\xac (esc)
57 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d386117f30e6-24ffe649-phabsend.hg
57 58 $ echo more >> alpha
58 59 $ HGEDITOR=true hg ci --amend
59 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d8f232f7d799-c573510a-amend.hg
60 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/cb03845d6dd9-870f61a6-amend.hg
60 61 $ echo beta > beta
61 62 $ hg ci --addremove -m 'create beta for phabricator test'
62 63 adding beta
63 64 $ hg phabsend -r ".^::" --test-vcr "$VCR/phabsend-update-alpha-create-beta.json"
64 D4596 - updated - f70265671c65: create alpha for phabricator test
65 D4597 - created - 1a5640df7bbf: create beta for phabricator test
66 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/1a5640df7bbf-6daf3e6e-phabsend.hg
65 D6054 - updated - 939d862f0318: create alpha for phabricator test \xe2\x82\xac (esc)
66 D6055 - created - f55f947ed0f8: create beta for phabricator test
67 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/f55f947ed0f8-0d1e502e-phabsend.hg
68 $ unset HGENCODING
67 69
68 70 The amend won't explode after posting a public commit. The local tag is left
69 71 behind to identify it.
70 72
71 73 $ echo 'public change' > beta
72 74 $ hg ci -m 'create public change for phabricator testing'
73 75 $ hg phase --public .
74 76 $ echo 'draft change' > alpha
75 77 $ hg ci -m 'create draft change for phabricator testing'
76 78 $ hg phabsend --amend -r '.^::' --test-vcr "$VCR/phabsend-create-public.json"
77 D5544 - created - 540a21d3fbeb: create public change for phabricator testing
78 D5545 - created - 6bca752686cd: create draft change for phabricator testing
79 warning: not updating public commit 2:540a21d3fbeb
80 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/6bca752686cd-41faefb4-phabsend.hg
79 D5544 - created - a56e5ebd77e6: create public change for phabricator testing
80 D5545 - created - 6a0ade3e3ec2: create draft change for phabricator testing
81 warning: not updating public commit 2:a56e5ebd77e6
82 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/6a0ade3e3ec2-aca7d23c-phabsend.hg
81 83 $ hg tags -v
82 tip 3:620a50fd6ed9
83 D5544 2:540a21d3fbeb local
84 tip 3:90532860b5e1
85 D5544 2:a56e5ebd77e6 local
84 86
85 87 $ hg debugcallconduit user.search --test-vcr "$VCR/phab-conduit.json" <<EOF
86 88 > {
87 89 > "constraints": {
88 90 > "isBot": true
89 91 > }
90 92 > }
91 93 > EOF
92 94 {
93 95 "cursor": {
94 96 "after": null,
95 97 "before": null,
96 98 "limit": 100,
97 99 "order": null
98 100 },
99 101 "data": [],
100 102 "maps": {},
101 103 "query": {
102 104 "queryKey": null
103 105 }
104 106 }
105 107
106 108 Template keywords
107 109 $ hg log -T'{rev} {phabreview|json}\n'
108 110 3 {"id": "D5545", "url": "https://phab.mercurial-scm.org/D5545"}
109 111 2 {"id": "D5544", "url": "https://phab.mercurial-scm.org/D5544"}
110 1 {"id": "D4597", "url": "https://phab.mercurial-scm.org/D4597"}
111 0 {"id": "D4596", "url": "https://phab.mercurial-scm.org/D4596"}
112 1 {"id": "D6055", "url": "https://phab.mercurial-scm.org/D6055"}
113 0 {"id": "D6054", "url": "https://phab.mercurial-scm.org/D6054"}
112 114
113 115 $ hg log -T'{rev} {if(phabreview, "{phabreview.url} {phabreview.id}")}\n'
114 116 3 https://phab.mercurial-scm.org/D5545 D5545
115 117 2 https://phab.mercurial-scm.org/D5544 D5544
116 1 https://phab.mercurial-scm.org/D4597 D4597
117 0 https://phab.mercurial-scm.org/D4596 D4596
118 1 https://phab.mercurial-scm.org/D6055 D6055
119 0 https://phab.mercurial-scm.org/D6054 D6054
118 120
119 121 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now