##// 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, (719 lines changed) Show them Hide them
@@ -1,590 +1,617 b''
1 1 {
2 "version": 1,
3 2 "interactions": [
4 3 {
5 "response": {
6 "status": {
7 "message": "OK",
8 "code": 200
9 },
10 "body": {
11 "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 },
13 "headers": {
14 "x-xss-protection": [
15 "1; mode=block"
16 ],
17 "expires": [
18 "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 ],
23 "x-frame-options": [
24 "Deny"
25 ],
26 "x-content-type-options": [
27 "nosniff"
28 ],
29 "strict-transport-security": [
30 "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 4 "request": {
47 5 "method": "POST",
6 "body": "constraints%5Bcallsigns%5D%5B0%5D=HG&api.token=cli-hahayouwish",
48 7 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
49 "body": "constraints%5Bcallsigns%5D%5B0%5D=HG&api.token=cli-hahayouwish",
50 8 "headers": {
9 "content-type": [
10 "application/x-www-form-urlencoded"
11 ],
51 12 "accept": [
52 13 "application/mercurial-0.1"
53 14 ],
54 "content-type": [
55 "application/x-www-form-urlencoded"
15 "user-agent": [
16 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
56 17 ],
57 18 "host": [
58 19 "phab.mercurial-scm.org"
59 20 ],
60 21 "content-length": [
61 22 "79"
23 ]
24 }
25 },
26 "response": {
27 "status": {
28 "code": 200,
29 "message": "OK"
30 },
31 "body": {
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}"
33 },
34 "headers": {
35 "expires": [
36 "Sat, 01 Jan 2000 00:00:00 GMT"
62 37 ],
63 "user-agent": [
64 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
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 ],
47 "x-frame-options": [
48 "Deny"
49 ],
50 "cache-control": [
51 "no-store"
52 ],
53 "content-type": [
54 "application/json"
55 ],
56 "x-content-type-options": [
57 "nosniff"
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 ],
65 "strict-transport-security": [
66 "max-age=0; includeSubdomains; preload"
65 67 ]
66 68 }
67 69 }
68 70 },
69 71 {
70 "response": {
71 "status": {
72 "message": "OK",
73 "code": 200
74 },
75 "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 },
78 "headers": {
79 "x-xss-protection": [
80 "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 ],
88 "x-frame-options": [
89 "Deny"
90 ],
91 "x-content-type-options": [
92 "nosniff"
93 ],
94 "strict-transport-security": [
95 "max-age=0; includeSubdomains; preload"
96 ],
97 "server": [
98 "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 72 "request": {
112 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",
113 75 "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 76 "headers": {
77 "content-type": [
78 "application/x-www-form-urlencoded"
79 ],
116 80 "accept": [
117 81 "application/mercurial-0.1"
118 82 ],
119 "content-type": [
120 "application/x-www-form-urlencoded"
83 "user-agent": [
84 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
121 85 ],
122 86 "host": [
123 87 "phab.mercurial-scm.org"
124 88 ],
125 89 "content-length": [
126 90 "235"
91 ]
92 }
93 },
94 "response": {
95 "status": {
96 "code": 200,
97 "message": "OK"
98 },
99 "body": {
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 },
102 "headers": {
103 "expires": [
104 "Sat, 01 Jan 2000 00:00:00 GMT"
127 105 ],
128 "user-agent": [
129 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
106 "x-xss-protection": [
107 "1; mode=block"
108 ],
109 "transfer-encoding": [
110 "chunked"
111 ],
112 "date": [
113 "Sun, 03 Mar 2019 00:12:24 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%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 {
135 "response": {
136 "status": {
137 "message": "OK",
138 "code": 200
139 },
140 "body": {
141 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
142 },
143 "headers": {
144 "x-xss-protection": [
145 "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 ],
153 "x-frame-options": [
154 "Deny"
155 ],
156 "x-content-type-options": [
157 "nosniff"
158 ],
159 "strict-transport-security": [
160 "max-age=0; includeSubdomains; preload"
161 ],
162 "server": [
163 "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 140 "request": {
177 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",
178 143 "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 144 "headers": {
145 "content-type": [
146 "application/x-www-form-urlencoded"
147 ],
181 148 "accept": [
182 149 "application/mercurial-0.1"
183 150 ],
184 "content-type": [
185 "application/x-www-form-urlencoded"
151 "user-agent": [
152 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
186 153 ],
187 154 "host": [
188 155 "phab.mercurial-scm.org"
189 156 ],
190 157 "content-length": [
191 158 "264"
192 ],
193 "user-agent": [
194 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
195 159 ]
196 160 }
197 }
198 161 },
199 {
200 162 "response": {
201 163 "status": {
202 "message": "OK",
203 "code": 200
164 "code": 200,
165 "message": "OK"
204 166 },
205 167 "body": {
206 168 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
207 169 },
208 170 "headers": {
171 "expires": [
172 "Sat, 01 Jan 2000 00:00:00 GMT"
173 ],
209 174 "x-xss-protection": [
210 175 "1; mode=block"
211 176 ],
212 "expires": [
213 "Sat, 01 Jan 2000 00:00:00 GMT"
177 "transfer-encoding": [
178 "chunked"
214 179 ],
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"
180 "date": [
181 "Sun, 03 Mar 2019 00:12:25 GMT"
217 182 ],
218 183 "x-frame-options": [
219 184 "Deny"
220 185 ],
186 "cache-control": [
187 "no-store"
188 ],
189 "content-type": [
190 "application/json"
191 ],
221 192 "x-content-type-options": [
222 193 "nosniff"
223 194 ],
224 "strict-transport-security": [
225 "max-age=0; includeSubdomains; preload"
226 ],
227 195 "server": [
228 196 "Apache/2.4.10 (Debian)"
229 197 ],
230 "date": [
231 "Sat, 15 Sep 2018 04:47:41 GMT"
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"
232 200 ],
233 "content-type": [
234 "application/json"
235 ],
236 "cache-control": [
237 "no-store"
201 "strict-transport-security": [
202 "max-age=0; includeSubdomains; preload"
238 203 ]
239 204 }
205 }
240 206 },
207 {
241 208 "request": {
242 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",
243 211 "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 212 "headers": {
213 "content-type": [
214 "application/x-www-form-urlencoded"
215 ],
246 216 "accept": [
247 217 "application/mercurial-0.1"
248 218 ],
249 "content-type": [
250 "application/x-www-form-urlencoded"
219 "user-agent": [
220 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
251 221 ],
252 222 "host": [
253 223 "phab.mercurial-scm.org"
254 224 ],
255 225 "content-length": [
256 226 "227"
257 ],
258 "user-agent": [
259 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
260 227 ]
261 228 }
262 }
263 229 },
264 {
265 230 "response": {
266 231 "status": {
267 "message": "OK",
268 "code": 200
232 "code": 200,
233 "message": "OK"
269 234 },
270 235 "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}"
236 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
272 237 },
273 238 "headers": {
239 "expires": [
240 "Sat, 01 Jan 2000 00:00:00 GMT"
241 ],
274 242 "x-xss-protection": [
275 243 "1; mode=block"
276 244 ],
277 "expires": [
278 "Sat, 01 Jan 2000 00:00:00 GMT"
245 "transfer-encoding": [
246 "chunked"
279 247 ],
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"
248 "date": [
249 "Sun, 03 Mar 2019 00:12:25 GMT"
282 250 ],
283 251 "x-frame-options": [
284 252 "Deny"
285 253 ],
254 "cache-control": [
255 "no-store"
256 ],
257 "content-type": [
258 "application/json"
259 ],
286 260 "x-content-type-options": [
287 261 "nosniff"
288 262 ],
289 "strict-transport-security": [
290 "max-age=0; includeSubdomains; preload"
291 ],
292 263 "server": [
293 264 "Apache/2.4.10 (Debian)"
294 265 ],
295 "date": [
296 "Sat, 15 Sep 2018 04:47:42 GMT"
297 ],
298 "content-type": [
299 "application/json"
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"
300 268 ],
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)"
269 "strict-transport-security": [
270 "max-age=0; includeSubdomains; preload"
325 271 ]
326 272 }
327 273 }
328 274 },
329 275 {
330 "response": {
331 "status": {
332 "message": "OK",
333 "code": 200
334 },
335 "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 },
338 "headers": {
339 "x-xss-protection": [
340 "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 ],
348 "x-frame-options": [
349 "Deny"
350 ],
351 "x-content-type-options": [
352 "nosniff"
353 ],
354 "strict-transport-security": [
355 "max-age=0; includeSubdomains; preload"
356 ],
357 "server": [
358 "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 276 "request": {
372 277 "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",
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",
375 280 "headers": {
281 "content-type": [
282 "application/x-www-form-urlencoded"
283 ],
376 284 "accept": [
377 285 "application/mercurial-0.1"
378 286 ],
379 "content-type": [
380 "application/x-www-form-urlencoded"
287 "user-agent": [
288 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
381 289 ],
382 290 "host": [
383 291 "phab.mercurial-scm.org"
384 292 ],
385 293 "content-length": [
386 "242"
294 "93"
295 ]
296 }
297 },
298 "response": {
299 "status": {
300 "code": 200,
301 "message": "OK"
302 },
303 "body": {
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 },
306 "headers": {
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"
387 315 ],
388 "user-agent": [
389 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
316 "date": [
317 "Sun, 03 Mar 2019 00:12:26 GMT"
318 ],
319 "x-frame-options": [
320 "Deny"
321 ],
322 "cache-control": [
323 "no-store"
324 ],
325 "content-type": [
326 "application/json"
327 ],
328 "x-content-type-options": [
329 "nosniff"
330 ],
331 "server": [
332 "Apache/2.4.10 (Debian)"
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"
390 339 ]
391 340 }
392 341 }
393 342 },
394 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 },
395 366 "response": {
396 367 "status": {
397 "message": "OK",
398 "code": 200
368 "code": 200,
369 "message": "OK"
399 370 },
400 371 "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}"
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}"
402 373 },
403 374 "headers": {
375 "expires": [
376 "Sat, 01 Jan 2000 00:00:00 GMT"
377 ],
404 378 "x-xss-protection": [
405 379 "1; mode=block"
406 380 ],
407 "expires": [
408 "Sat, 01 Jan 2000 00:00:00 GMT"
381 "transfer-encoding": [
382 "chunked"
409 383 ],
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"
384 "date": [
385 "Sun, 03 Mar 2019 00:12:27 GMT"
412 386 ],
413 387 "x-frame-options": [
414 388 "Deny"
415 389 ],
390 "cache-control": [
391 "no-store"
392 ],
393 "content-type": [
394 "application/json"
395 ],
416 396 "x-content-type-options": [
417 397 "nosniff"
418 398 ],
419 "strict-transport-security": [
420 "max-age=0; includeSubdomains; preload"
421 ],
422 399 "server": [
423 400 "Apache/2.4.10 (Debian)"
424 401 ],
425 "date": [
426 "Sat, 15 Sep 2018 04:47:43 GMT"
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"
427 404 ],
428 "content-type": [
429 "application/json"
430 ],
431 "cache-control": [
432 "no-store"
405 "strict-transport-security": [
406 "max-age=0; includeSubdomains; preload"
433 407 ]
434 408 }
409 }
435 410 },
411 {
436 412 "request": {
437 413 "method": "POST",
414 "body": "api.token=cli-hahayouwish&ids%5B0%5D=6054",
438 415 "uri": "https://phab.mercurial-scm.org//api/differential.query",
439 "body": "api.token=cli-hahayouwish&ids%5B0%5D=4596",
440 416 "headers": {
417 "content-type": [
418 "application/x-www-form-urlencoded"
419 ],
441 420 "accept": [
442 421 "application/mercurial-0.1"
443 422 ],
444 "content-type": [
445 "application/x-www-form-urlencoded"
423 "user-agent": [
424 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
446 425 ],
447 426 "host": [
448 427 "phab.mercurial-scm.org"
449 428 ],
450 429 "content-length": [
451 430 "58"
431 ]
432 }
433 },
434 "response": {
435 "status": {
436 "code": 200,
437 "message": "OK"
438 },
439 "body": {
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 },
442 "headers": {
443 "expires": [
444 "Sat, 01 Jan 2000 00:00:00 GMT"
452 445 ],
453 "user-agent": [
454 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
446 "x-xss-protection": [
447 "1; mode=block"
448 ],
449 "transfer-encoding": [
450 "chunked"
451 ],
452 "date": [
453 "Sun, 03 Mar 2019 00:12:28 GMT"
454 ],
455 "x-frame-options": [
456 "Deny"
457 ],
458 "cache-control": [
459 "no-store"
460 ],
461 "content-type": [
462 "application/json"
463 ],
464 "x-content-type-options": [
465 "nosniff"
466 ],
467 "server": [
468 "Apache/2.4.10 (Debian)"
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 {
460 "response": {
461 "status": {
462 "message": "OK",
463 "code": 200
464 },
465 "body": {
466 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
467 },
468 "headers": {
469 "x-xss-protection": [
470 "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 ],
478 "x-frame-options": [
479 "Deny"
480 ],
481 "x-content-type-options": [
482 "nosniff"
483 ],
484 "strict-transport-security": [
485 "max-age=0; includeSubdomains; preload"
486 ],
487 "server": [
488 "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 480 "request": {
502 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",
503 483 "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 484 "headers": {
485 "content-type": [
486 "application/x-www-form-urlencoded"
487 ],
506 488 "accept": [
507 489 "application/mercurial-0.1"
508 490 ],
509 "content-type": [
510 "application/x-www-form-urlencoded"
491 "user-agent": [
492 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
511 493 ],
512 494 "host": [
513 495 "phab.mercurial-scm.org"
514 496 ],
515 497 "content-length": [
516 498 "264"
517 ],
518 "user-agent": [
519 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
520 499 ]
521 500 }
522 }
523 501 },
524 {
525 502 "response": {
526 503 "status": {
527 "message": "OK",
528 "code": 200
504 "code": 200,
505 "message": "OK"
529 506 },
530 507 "body": {
531 508 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
532 509 },
533 510 "headers": {
511 "expires": [
512 "Sat, 01 Jan 2000 00:00:00 GMT"
513 ],
534 514 "x-xss-protection": [
535 515 "1; mode=block"
536 516 ],
537 "expires": [
538 "Sat, 01 Jan 2000 00:00:00 GMT"
517 "transfer-encoding": [
518 "chunked"
539 519 ],
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"
520 "date": [
521 "Sun, 03 Mar 2019 00:12:28 GMT"
542 522 ],
543 523 "x-frame-options": [
544 524 "Deny"
545 525 ],
526 "cache-control": [
527 "no-store"
528 ],
529 "content-type": [
530 "application/json"
531 ],
546 532 "x-content-type-options": [
547 533 "nosniff"
548 534 ],
549 "strict-transport-security": [
550 "max-age=0; includeSubdomains; preload"
551 ],
552 535 "server": [
553 536 "Apache/2.4.10 (Debian)"
554 537 ],
555 "date": [
556 "Sat, 15 Sep 2018 04:47:44 GMT"
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"
557 540 ],
558 "content-type": [
559 "application/json"
560 ],
561 "cache-control": [
562 "no-store"
541 "strict-transport-security": [
542 "max-age=0; includeSubdomains; preload"
563 543 ]
564 544 }
545 }
565 546 },
547 {
566 548 "request": {
567 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",
568 551 "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 552 "headers": {
553 "content-type": [
554 "application/x-www-form-urlencoded"
555 ],
571 556 "accept": [
572 557 "application/mercurial-0.1"
573 558 ],
574 "content-type": [
575 "application/x-www-form-urlencoded"
559 "user-agent": [
560 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
576 561 ],
577 562 "host": [
578 563 "phab.mercurial-scm.org"
579 564 ],
580 565 "content-length": [
581 566 "227"
567 ]
568 }
569 },
570 "response": {
571 "status": {
572 "code": 200,
573 "message": "OK"
574 },
575 "body": {
576 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
577 },
578 "headers": {
579 "expires": [
580 "Sat, 01 Jan 2000 00:00:00 GMT"
582 581 ],
583 "user-agent": [
584 "mercurial/proto-1.0 (Mercurial 4.7.1+866-5f07496726a1+20180915)"
582 "x-xss-protection": [
583 "1; mode=block"
584 ],
585 "transfer-encoding": [
586 "chunked"
587 ],
588 "date": [
589 "Sun, 03 Mar 2019 00:12:29 GMT"
590 ],
591 "x-frame-options": [
592 "Deny"
593 ],
594 "cache-control": [
595 "no-store"
596 ],
597 "content-type": [
598 "application/json"
599 ],
600 "x-content-type-options": [
601 "nosniff"
602 ],
603 "server": [
604 "Apache/2.4.10 (Debian)"
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, (980 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",
5 "method": "POST",
6 "body": "api.token=cli-hahayouwish&revisionIDs%5B0%5D=6054",
7 7 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
8 8 "headers": {
9 "content-length": [
10 "66"
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)"
11 17 ],
12 18 "host": [
13 19 "phab.mercurial-scm.org"
14 20 ],
21 "content-length": [
22 "66"
23 ]
24 }
25 },
26 "response": {
27 "status": {
28 "code": 200,
29 "message": "OK"
30 },
31 "body": {
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 },
34 "headers": {
35 "expires": [
36 "Sat, 01 Jan 2000 00:00:00 GMT"
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:30 GMT"
46 ],
47 "x-frame-options": [
48 "Deny"
49 ],
50 "cache-control": [
51 "no-store"
52 ],
53 "content-type": [
54 "application/json"
55 ],
56 "x-content-type-options": [
57 "nosniff"
58 ],
59 "server": [
60 "Apache/2.4.10 (Debian)"
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 ],
65 "strict-transport-security": [
66 "max-age=0; includeSubdomains; preload"
67 ]
68 }
69 }
70 },
71 {
72 "request": {
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",
76 "headers": {
15 77 "content-type": [
16 78 "application/x-www-form-urlencoded"
17 79 ],
18 80 "accept": [
19 81 "application/mercurial-0.1"
20 82 ],
21 83 "user-agent": [
22 "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"
23 91 ]
24 },
25 "method": "POST"
92 }
26 93 },
27 94 "response": {
28 95 "status": {
29 96 "code": 200,
30 97 "message": "OK"
31 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 },
32 102 "headers": {
33 "server": [
34 "Apache/2.4.10 (Debian)"
103 "expires": [
104 "Sat, 01 Jan 2000 00:00:00 GMT"
105 ],
106 "x-xss-protection": [
107 "1; mode=block"
35 108 ],
36 "strict-transport-security": [
37 "max-age=0; includeSubdomains; preload"
109 "transfer-encoding": [
110 "chunked"
111 ],
112 "date": [
113 "Sun, 03 Mar 2019 00:12:31 GMT"
38 114 ],
39 115 "x-frame-options": [
40 116 "Deny"
41 117 ],
118 "cache-control": [
119 "no-store"
120 ],
121 "content-type": [
122 "application/json"
123 ],
42 124 "x-content-type-options": [
43 125 "nosniff"
44 126 ],
45 "expires": [
46 "Sat, 01 Jan 2000 00:00:00 GMT"
127 "server": [
128 "Apache/2.4.10 (Debian)"
47 129 ],
48 130 "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"
131 "phsid=A%2Fmlq7cl6pakmia2uecfcevwhdl3hyqe6rdb2y7usm; expires=Fri, 01-Mar-2024 00:12:31 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
56 132 ],
57 "cache-control": [
58 "no-store"
59 ],
60 "date": [
61 "Sat, 15 Sep 2018 04:53:46 GMT"
133 "strict-transport-security": [
134 "max-age=0; includeSubdomains; preload"
62 135 ]
63 },
64 "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 136 }
67 137 }
68 138 },
69 139 {
70 140 "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",
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",
73 144 "headers": {
74 "content-length": [
75 "264"
76 ],
77 "host": [
78 "phab.mercurial-scm.org"
79 ],
80 145 "content-type": [
81 146 "application/x-www-form-urlencoded"
82 147 ],
83 148 "accept": [
84 149 "application/mercurial-0.1"
85 150 ],
86 151 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
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"
88 159 ]
89 },
90 "method": "POST"
160 }
91 161 },
92 162 "response": {
93 163 "status": {
94 164 "code": 200,
95 165 "message": "OK"
96 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 },
97 170 "headers": {
98 "server": [
99 "Apache/2.4.10 (Debian)"
171 "expires": [
172 "Sat, 01 Jan 2000 00:00:00 GMT"
173 ],
174 "x-xss-protection": [
175 "1; mode=block"
100 176 ],
101 "strict-transport-security": [
102 "max-age=0; includeSubdomains; preload"
177 "transfer-encoding": [
178 "chunked"
179 ],
180 "date": [
181 "Sun, 03 Mar 2019 00:12:32 GMT"
103 182 ],
104 183 "x-frame-options": [
105 184 "Deny"
106 185 ],
186 "cache-control": [
187 "no-store"
188 ],
189 "content-type": [
190 "application/json"
191 ],
107 192 "x-content-type-options": [
108 193 "nosniff"
109 194 ],
110 "expires": [
111 "Sat, 01 Jan 2000 00:00:00 GMT"
195 "server": [
196 "Apache/2.4.10 (Debian)"
112 197 ],
113 198 "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 ],
116 "x-xss-protection": [
117 "1; mode=block"
118 ],
119 "content-type": [
120 "application/json"
199 "phsid=A%2Fptjtujvqlcwhzs4yhneogb323aqessc5axlu4rif; expires=Fri, 01-Mar-2024 00:12:32 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
121 200 ],
122 "cache-control": [
123 "no-store"
124 ],
125 "date": [
126 "Sat, 15 Sep 2018 04:53:46 GMT"
201 "strict-transport-security": [
202 "max-age=0; includeSubdomains; preload"
127 203 ]
128 },
129 "body": {
130 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
131 204 }
132 205 }
133 206 },
134 207 {
135 208 "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",
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",
137 211 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
138 212 "headers": {
139 "content-length": [
140 "227"
141 ],
142 "host": [
143 "phab.mercurial-scm.org"
144 ],
145 213 "content-type": [
146 214 "application/x-www-form-urlencoded"
147 215 ],
148 216 "accept": [
149 217 "application/mercurial-0.1"
150 218 ],
151 219 "user-agent": [
152 "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"
153 227 ]
154 },
155 "method": "POST"
228 }
156 229 },
157 230 "response": {
158 231 "status": {
159 232 "code": 200,
160 233 "message": "OK"
161 234 },
235 "body": {
236 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
237 },
162 238 "headers": {
163 "server": [
164 "Apache/2.4.10 (Debian)"
239 "expires": [
240 "Sat, 01 Jan 2000 00:00:00 GMT"
241 ],
242 "x-xss-protection": [
243 "1; mode=block"
165 244 ],
166 "strict-transport-security": [
167 "max-age=0; includeSubdomains; preload"
245 "transfer-encoding": [
246 "chunked"
247 ],
248 "date": [
249 "Sun, 03 Mar 2019 00:12:32 GMT"
168 250 ],
169 251 "x-frame-options": [
170 252 "Deny"
171 253 ],
254 "cache-control": [
255 "no-store"
256 ],
257 "content-type": [
258 "application/json"
259 ],
172 260 "x-content-type-options": [
173 261 "nosniff"
174 262 ],
175 "expires": [
176 "Sat, 01 Jan 2000 00:00:00 GMT"
263 "server": [
264 "Apache/2.4.10 (Debian)"
177 265 ],
178 266 "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"
267 "phsid=A%2Feho2462w6mulsjeoz3e4rwgf37aekqwgpqmarn2f; expires=Fri, 01-Mar-2024 00:12:32 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
186 268 ],
187 "cache-control": [
188 "no-store"
189 ],
190 "date": [
191 "Sat, 15 Sep 2018 04:53:47 GMT"
269 "strict-transport-security": [
270 "max-age=0; includeSubdomains; preload"
192 271 ]
193 },
194 "body": {
195 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
196 272 }
197 273 }
198 274 },
199 275 {
200 276 "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",
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",
203 280 "headers": {
204 "content-length": [
205 "158"
206 ],
207 "host": [
208 "phab.mercurial-scm.org"
209 ],
210 281 "content-type": [
211 282 "application/x-www-form-urlencoded"
212 283 ],
213 284 "accept": [
214 285 "application/mercurial-0.1"
215 286 ],
216 287 "user-agent": [
217 "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"
218 295 ]
219 },
220 "method": "POST"
296 }
221 297 },
222 298 "response": {
223 299 "status": {
224 300 "code": 200,
225 301 "message": "OK"
226 302 },
303 "body": {
304 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
305 },
227 306 "headers": {
228 "server": [
229 "Apache/2.4.10 (Debian)"
307 "expires": [
308 "Sat, 01 Jan 2000 00:00:00 GMT"
309 ],
310 "x-xss-protection": [
311 "1; mode=block"
230 312 ],
231 "strict-transport-security": [
232 "max-age=0; includeSubdomains; preload"
313 "transfer-encoding": [
314 "chunked"
315 ],
316 "date": [
317 "Sun, 03 Mar 2019 00:12:33 GMT"
233 318 ],
234 319 "x-frame-options": [
235 320 "Deny"
236 321 ],
322 "cache-control": [
323 "no-store"
324 ],
325 "content-type": [
326 "application/json"
327 ],
237 328 "x-content-type-options": [
238 329 "nosniff"
239 330 ],
240 "expires": [
241 "Sat, 01 Jan 2000 00:00:00 GMT"
331 "server": [
332 "Apache/2.4.10 (Debian)"
242 333 ],
243 334 "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"
335 "phsid=A%2F4ca3h5qhtwgn55t3zznczixyt2st4tm44t23aceg; expires=Fri, 01-Mar-2024 00:12:33 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
251 336 ],
252 "cache-control": [
253 "no-store"
254 ],
255 "date": [
256 "Sat, 15 Sep 2018 04:53:47 GMT"
337 "strict-transport-security": [
338 "max-age=0; includeSubdomains; preload"
257 339 ]
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 340 }
262 341 }
263 342 },
264 343 {
265 344 "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",
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",
268 348 "headers": {
269 "content-length": [
270 "165"
271 ],
272 "host": [
273 "phab.mercurial-scm.org"
274 ],
275 349 "content-type": [
276 350 "application/x-www-form-urlencoded"
277 351 ],
278 352 "accept": [
279 353 "application/mercurial-0.1"
280 354 ],
281 355 "user-agent": [
282 "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"
283 363 ]
284 },
285 "method": "POST"
364 }
286 365 },
287 366 "response": {
288 367 "status": {
289 368 "code": 200,
290 369 "message": "OK"
291 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 },
292 374 "headers": {
293 "server": [
294 "Apache/2.4.10 (Debian)"
375 "expires": [
376 "Sat, 01 Jan 2000 00:00:00 GMT"
377 ],
378 "x-xss-protection": [
379 "1; mode=block"
295 380 ],
296 "strict-transport-security": [
297 "max-age=0; includeSubdomains; preload"
381 "transfer-encoding": [
382 "chunked"
383 ],
384 "date": [
385 "Sun, 03 Mar 2019 00:12:34 GMT"
298 386 ],
299 387 "x-frame-options": [
300 388 "Deny"
301 389 ],
390 "cache-control": [
391 "no-store"
392 ],
393 "content-type": [
394 "application/json"
395 ],
302 396 "x-content-type-options": [
303 397 "nosniff"
304 398 ],
305 "expires": [
306 "Sat, 01 Jan 2000 00:00:00 GMT"
399 "server": [
400 "Apache/2.4.10 (Debian)"
307 401 ],
308 402 "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 ],
311 "x-xss-protection": [
312 "1; mode=block"
313 ],
314 "content-type": [
315 "application/json"
403 "phsid=A%2F7pvtbpw2waiblbsbydew3vfpulqnccf4647ymipq; expires=Fri, 01-Mar-2024 00:12:34 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
316 404 ],
317 "cache-control": [
318 "no-store"
319 ],
320 "date": [
321 "Sat, 15 Sep 2018 04:53:47 GMT"
405 "strict-transport-security": [
406 "max-age=0; includeSubdomains; preload"
322 407 ]
323 },
324 "body": {
325 "string": "{\"result\":{\"object\":{\"id\":\"4596\",\"phid\":\"PHID-DREV-bntcdwe74cw3vwkzt6nq\"},\"transactions\":[]},\"error_code\":null,\"error_info\":null}"
326 408 }
327 409 }
328 410 },
329 411 {
330 412 "request": {
331 "body": "api.token=cli-hahayouwish&constraints%5Bcallsigns%5D%5B0%5D=HG",
332 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
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",
333 416 "headers": {
334 "content-length": [
335 "79"
336 ],
337 "host": [
338 "phab.mercurial-scm.org"
339 ],
340 417 "content-type": [
341 418 "application/x-www-form-urlencoded"
342 419 ],
343 420 "accept": [
344 421 "application/mercurial-0.1"
345 422 ],
346 423 "user-agent": [
347 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
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"
348 431 ]
349 },
350 "method": "POST"
432 }
351 433 },
352 434 "response": {
353 435 "status": {
354 436 "code": 200,
355 437 "message": "OK"
356 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 },
357 442 "headers": {
358 "server": [
359 "Apache/2.4.10 (Debian)"
443 "expires": [
444 "Sat, 01 Jan 2000 00:00:00 GMT"
445 ],
446 "x-xss-protection": [
447 "1; mode=block"
360 448 ],
361 "strict-transport-security": [
362 "max-age=0; includeSubdomains; preload"
449 "transfer-encoding": [
450 "chunked"
451 ],
452 "date": [
453 "Sun, 03 Mar 2019 00:12:34 GMT"
363 454 ],
364 455 "x-frame-options": [
365 456 "Deny"
366 457 ],
458 "cache-control": [
459 "no-store"
460 ],
461 "content-type": [
462 "application/json"
463 ],
367 464 "x-content-type-options": [
368 465 "nosniff"
369 466 ],
370 "expires": [
371 "Sat, 01 Jan 2000 00:00:00 GMT"
467 "server": [
468 "Apache/2.4.10 (Debian)"
372 469 ],
373 470 "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"
471 "phsid=A%2Fhmyuw3lg6h4joaswqnfcmnzdkp6p2qxotsvahb7l; expires=Fri, 01-Mar-2024 00:12:34 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
381 472 ],
382 "cache-control": [
383 "no-store"
384 ],
385 "date": [
386 "Sat, 15 Sep 2018 04:53:48 GMT"
473 "strict-transport-security": [
474 "max-age=0; includeSubdomains; preload"
387 475 ]
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 476 }
392 477 }
393 478 },
394 479 {
395 480 "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",
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",
397 483 "uri": "https://phab.mercurial-scm.org//api/differential.createrawdiff",
398 484 "headers": {
399 "content-length": [
400 "231"
401 ],
402 "host": [
403 "phab.mercurial-scm.org"
404 ],
405 485 "content-type": [
406 486 "application/x-www-form-urlencoded"
407 487 ],
408 488 "accept": [
409 489 "application/mercurial-0.1"
410 490 ],
411 491 "user-agent": [
412 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
492 "mercurial/proto-1.0 (Mercurial 4.9+477-7c86ec0ca5c5+20190303)"
493 ],
494 "host": [
495 "phab.mercurial-scm.org"
496 ],
497 "content-length": [
498 "231"
413 499 ]
414 },
415 "method": "POST"
500 }
416 501 },
417 502 "response": {
418 503 "status": {
419 504 "code": 200,
420 505 "message": "OK"
421 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 },
422 510 "headers": {
423 "server": [
424 "Apache/2.4.10 (Debian)"
511 "expires": [
512 "Sat, 01 Jan 2000 00:00:00 GMT"
513 ],
514 "x-xss-protection": [
515 "1; mode=block"
425 516 ],
426 "strict-transport-security": [
427 "max-age=0; includeSubdomains; preload"
517 "transfer-encoding": [
518 "chunked"
519 ],
520 "date": [
521 "Sun, 03 Mar 2019 00:12:35 GMT"
428 522 ],
429 523 "x-frame-options": [
430 524 "Deny"
431 525 ],
526 "cache-control": [
527 "no-store"
528 ],
529 "content-type": [
530 "application/json"
531 ],
432 532 "x-content-type-options": [
433 533 "nosniff"
434 534 ],
435 "expires": [
436 "Sat, 01 Jan 2000 00:00:00 GMT"
535 "server": [
536 "Apache/2.4.10 (Debian)"
437 537 ],
438 538 "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 ],
441 "x-xss-protection": [
442 "1; mode=block"
443 ],
444 "content-type": [
445 "application/json"
539 "phsid=A%2F2xpzt6bryn7n3gug3ll7iu2gfqyy4zss5d7nolew; expires=Fri, 01-Mar-2024 00:12:35 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
446 540 ],
447 "cache-control": [
448 "no-store"
449 ],
450 "date": [
451 "Sat, 15 Sep 2018 04:53:49 GMT"
541 "strict-transport-security": [
542 "max-age=0; includeSubdomains; preload"
452 543 ]
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 544 }
457 545 }
458 546 },
459 547 {
460 548 "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",
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",
462 551 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
463 552 "headers": {
464 "content-length": [
465 "264"
466 ],
467 "host": [
468 "phab.mercurial-scm.org"
469 ],
470 553 "content-type": [
471 554 "application/x-www-form-urlencoded"
472 555 ],
473 556 "accept": [
474 557 "application/mercurial-0.1"
475 558 ],
476 559 "user-agent": [
477 "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"
478 567 ]
479 },
480 "method": "POST"
568 }
481 569 },
482 570 "response": {
483 571 "status": {
484 572 "code": 200,
485 573 "message": "OK"
486 574 },
575 "body": {
576 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
577 },
487 578 "headers": {
488 "server": [
489 "Apache/2.4.10 (Debian)"
579 "expires": [
580 "Sat, 01 Jan 2000 00:00:00 GMT"
581 ],
582 "x-xss-protection": [
583 "1; mode=block"
490 584 ],
491 "strict-transport-security": [
492 "max-age=0; includeSubdomains; preload"
585 "transfer-encoding": [
586 "chunked"
587 ],
588 "date": [
589 "Sun, 03 Mar 2019 00:12:36 GMT"
493 590 ],
494 591 "x-frame-options": [
495 592 "Deny"
496 593 ],
594 "cache-control": [
595 "no-store"
596 ],
597 "content-type": [
598 "application/json"
599 ],
497 600 "x-content-type-options": [
498 601 "nosniff"
499 602 ],
500 "expires": [
501 "Sat, 01 Jan 2000 00:00:00 GMT"
603 "server": [
604 "Apache/2.4.10 (Debian)"
502 605 ],
503 606 "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 ],
509 "content-type": [
510 "application/json"
607 "phsid=A%2Fygzbpe74xh6shrejkd3tj32t4gaqnvumy63iudrd; expires=Fri, 01-Mar-2024 00:12:36 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
511 608 ],
512 "cache-control": [
513 "no-store"
514 ],
515 "date": [
516 "Sat, 15 Sep 2018 04:53:49 GMT"
609 "strict-transport-security": [
610 "max-age=0; includeSubdomains; preload"
517 611 ]
518 },
519 "body": {
520 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
521 612 }
522 613 }
523 614 },
524 615 {
525 616 "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",
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",
527 619 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
528 620 "headers": {
529 "content-length": [
530 "227"
531 ],
532 "host": [
533 "phab.mercurial-scm.org"
534 ],
535 621 "content-type": [
536 622 "application/x-www-form-urlencoded"
537 623 ],
538 624 "accept": [
539 625 "application/mercurial-0.1"
540 626 ],
541 627 "user-agent": [
542 "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"
543 635 ]
544 },
545 "method": "POST"
636 }
546 637 },
547 638 "response": {
548 639 "status": {
549 640 "code": 200,
550 641 "message": "OK"
551 642 },
643 "body": {
644 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
645 },
552 646 "headers": {
553 "server": [
554 "Apache/2.4.10 (Debian)"
647 "expires": [
648 "Sat, 01 Jan 2000 00:00:00 GMT"
649 ],
650 "x-xss-protection": [
651 "1; mode=block"
555 652 ],
556 "strict-transport-security": [
557 "max-age=0; includeSubdomains; preload"
653 "transfer-encoding": [
654 "chunked"
655 ],
656 "date": [
657 "Sun, 03 Mar 2019 00:12:37 GMT"
558 658 ],
559 659 "x-frame-options": [
560 660 "Deny"
561 661 ],
662 "cache-control": [
663 "no-store"
664 ],
665 "content-type": [
666 "application/json"
667 ],
562 668 "x-content-type-options": [
563 669 "nosniff"
564 670 ],
565 "expires": [
566 "Sat, 01 Jan 2000 00:00:00 GMT"
671 "server": [
672 "Apache/2.4.10 (Debian)"
567 673 ],
568 674 "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 ],
571 "x-xss-protection": [
572 "1; mode=block"
573 ],
574 "content-type": [
575 "application/json"
675 "phsid=A%2Fgw67yfcsx7vvxkymeac52ca5is4jkxjwqqkhayco; expires=Fri, 01-Mar-2024 00:12:37 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
576 676 ],
577 "cache-control": [
578 "no-store"
579 ],
580 "date": [
581 "Sat, 15 Sep 2018 04:53:49 GMT"
677 "strict-transport-security": [
678 "max-age=0; includeSubdomains; preload"
582 679 ]
583 },
584 "body": {
585 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
586 680 }
587 681 }
588 682 },
589 683 {
590 684 "request": {
685 "method": "POST",
591 686 "body": "api.token=cli-hahayouwish&corpus=create+beta+for+phabricator+test",
592 687 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
593 688 "headers": {
594 "content-length": [
595 "82"
596 ],
597 "host": [
598 "phab.mercurial-scm.org"
599 ],
600 689 "content-type": [
601 690 "application/x-www-form-urlencoded"
602 691 ],
603 692 "accept": [
604 693 "application/mercurial-0.1"
605 694 ],
606 695 "user-agent": [
607 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
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"
608 703 ]
609 },
610 "method": "POST"
704 }
611 705 },
612 706 "response": {
613 707 "status": {
614 708 "code": 200,
615 709 "message": "OK"
616 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 },
617 714 "headers": {
618 "server": [
619 "Apache/2.4.10 (Debian)"
715 "expires": [
716 "Sat, 01 Jan 2000 00:00:00 GMT"
717 ],
718 "x-xss-protection": [
719 "1; mode=block"
620 720 ],
621 "strict-transport-security": [
622 "max-age=0; includeSubdomains; preload"
721 "transfer-encoding": [
722 "chunked"
723 ],
724 "date": [
725 "Sun, 03 Mar 2019 00:12:37 GMT"
623 726 ],
624 727 "x-frame-options": [
625 728 "Deny"
626 729 ],
730 "cache-control": [
731 "no-store"
732 ],
733 "content-type": [
734 "application/json"
735 ],
627 736 "x-content-type-options": [
628 737 "nosniff"
629 738 ],
630 "expires": [
631 "Sat, 01 Jan 2000 00:00:00 GMT"
739 "server": [
740 "Apache/2.4.10 (Debian)"
632 741 ],
633 742 "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"
743 "phsid=A%2Fyt5ejs6pgvjdxzms7geaxup63jpqkisngu3cprk6; expires=Fri, 01-Mar-2024 00:12:37 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
641 744 ],
642 "cache-control": [
643 "no-store"
644 ],
645 "date": [
646 "Sat, 15 Sep 2018 04:53:50 GMT"
745 "strict-transport-security": [
746 "max-age=0; includeSubdomains; preload"
647 747 ]
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 748 }
652 749 }
653 750 },
654 751 {
655 752 "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",
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",
657 755 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
658 756 "headers": {
659 "content-length": [
660 "398"
661 ],
662 "host": [
663 "phab.mercurial-scm.org"
664 ],
665 757 "content-type": [
666 758 "application/x-www-form-urlencoded"
667 759 ],
668 760 "accept": [
669 761 "application/mercurial-0.1"
670 762 ],
671 763 "user-agent": [
672 "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"
673 771 ]
674 },
675 "method": "POST"
772 }
676 773 },
677 774 "response": {
678 775 "status": {
679 776 "code": 200,
680 777 "message": "OK"
681 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 },
682 782 "headers": {
683 "server": [
684 "Apache/2.4.10 (Debian)"
783 "expires": [
784 "Sat, 01 Jan 2000 00:00:00 GMT"
785 ],
786 "x-xss-protection": [
787 "1; mode=block"
685 788 ],
686 "strict-transport-security": [
687 "max-age=0; includeSubdomains; preload"
789 "transfer-encoding": [
790 "chunked"
791 ],
792 "date": [
793 "Sun, 03 Mar 2019 00:12:38 GMT"
688 794 ],
689 795 "x-frame-options": [
690 796 "Deny"
691 797 ],
798 "cache-control": [
799 "no-store"
800 ],
801 "content-type": [
802 "application/json"
803 ],
692 804 "x-content-type-options": [
693 805 "nosniff"
694 806 ],
695 "expires": [
696 "Sat, 01 Jan 2000 00:00:00 GMT"
807 "server": [
808 "Apache/2.4.10 (Debian)"
697 809 ],
698 810 "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"
811 "phsid=A%2Fgqyrj3op7rar26t6crqlt6rpdsxcefnrofqkw5rt; expires=Fri, 01-Mar-2024 00:12:38 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
706 812 ],
707 "cache-control": [
708 "no-store"
709 ],
710 "date": [
711 "Sat, 15 Sep 2018 04:53:50 GMT"
813 "strict-transport-security": [
814 "max-age=0; includeSubdomains; preload"
712 815 ]
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 816 }
717 817 }
718 818 },
719 819 {
720 820 "request": {
721 "body": "api.token=cli-hahayouwish&ids%5B0%5D=4596&ids%5B1%5D=4597",
821 "method": "POST",
822 "body": "api.token=cli-hahayouwish&ids%5B0%5D=6054&ids%5B1%5D=6055",
722 823 "uri": "https://phab.mercurial-scm.org//api/differential.query",
723 824 "headers": {
724 "content-length": [
725 "74"
726 ],
727 "host": [
728 "phab.mercurial-scm.org"
729 ],
730 825 "content-type": [
731 826 "application/x-www-form-urlencoded"
732 827 ],
733 828 "accept": [
734 829 "application/mercurial-0.1"
735 830 ],
736 831 "user-agent": [
737 "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"
738 839 ]
739 },
740 "method": "POST"
840 }
741 841 },
742 842 "response": {
743 843 "status": {
744 844 "code": 200,
745 845 "message": "OK"
746 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 },
747 850 "headers": {
748 "server": [
749 "Apache/2.4.10 (Debian)"
851 "expires": [
852 "Sat, 01 Jan 2000 00:00:00 GMT"
853 ],
854 "x-xss-protection": [
855 "1; mode=block"
750 856 ],
751 "strict-transport-security": [
752 "max-age=0; includeSubdomains; preload"
857 "transfer-encoding": [
858 "chunked"
859 ],
860 "date": [
861 "Sun, 03 Mar 2019 00:12:39 GMT"
753 862 ],
754 863 "x-frame-options": [
755 864 "Deny"
756 865 ],
866 "cache-control": [
867 "no-store"
868 ],
869 "content-type": [
870 "application/json"
871 ],
757 872 "x-content-type-options": [
758 873 "nosniff"
759 874 ],
760 "expires": [
761 "Sat, 01 Jan 2000 00:00:00 GMT"
875 "server": [
876 "Apache/2.4.10 (Debian)"
762 877 ],
763 878 "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 ],
766 "x-xss-protection": [
767 "1; mode=block"
768 ],
769 "content-type": [
770 "application/json"
879 "phsid=A%2F5wxg6sdf2mby5iljd5e5qpgoex6uefo5pgltav7k; expires=Fri, 01-Mar-2024 00:12:39 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
771 880 ],
772 "cache-control": [
773 "no-store"
774 ],
775 "date": [
776 "Sat, 15 Sep 2018 04:53:51 GMT"
881 "strict-transport-security": [
882 "max-age=0; includeSubdomains; preload"
777 883 ]
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 884 }
782 885 }
783 886 },
784 887 {
785 888 "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",
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",
787 891 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
788 892 "headers": {
789 "content-length": [
790 "264"
791 ],
792 "host": [
793 "phab.mercurial-scm.org"
794 ],
795 893 "content-type": [
796 894 "application/x-www-form-urlencoded"
797 895 ],
798 896 "accept": [
799 897 "application/mercurial-0.1"
800 898 ],
801 899 "user-agent": [
802 "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"
803 907 ]
804 },
805 "method": "POST"
908 }
806 909 },
807 910 "response": {
808 911 "status": {
809 912 "code": 200,
810 913 "message": "OK"
811 914 },
915 "body": {
916 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
917 },
812 918 "headers": {
813 "server": [
814 "Apache/2.4.10 (Debian)"
919 "expires": [
920 "Sat, 01 Jan 2000 00:00:00 GMT"
921 ],
922 "x-xss-protection": [
923 "1; mode=block"
815 924 ],
816 "strict-transport-security": [
817 "max-age=0; includeSubdomains; preload"
925 "transfer-encoding": [
926 "chunked"
927 ],
928 "date": [
929 "Sun, 03 Mar 2019 00:12:40 GMT"
818 930 ],
819 931 "x-frame-options": [
820 932 "Deny"
821 933 ],
934 "cache-control": [
935 "no-store"
936 ],
937 "content-type": [
938 "application/json"
939 ],
822 940 "x-content-type-options": [
823 941 "nosniff"
824 942 ],
825 "expires": [
826 "Sat, 01 Jan 2000 00:00:00 GMT"
943 "server": [
944 "Apache/2.4.10 (Debian)"
827 945 ],
828 946 "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"
947 "phsid=A%2F4c7iamnsn57y6qpccmbesf4ooflmkqvt4m6udawl; expires=Fri, 01-Mar-2024 00:12:40 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
836 948 ],
837 "cache-control": [
838 "no-store"
839 ],
840 "date": [
841 "Sat, 15 Sep 2018 04:53:52 GMT"
949 "strict-transport-security": [
950 "max-age=0; includeSubdomains; preload"
842 951 ]
843 },
844 "body": {
845 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
846 952 }
847 953 }
848 954 },
849 955 {
850 956 "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",
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",
852 959 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
853 960 "headers": {
854 "content-length": [
855 "227"
856 ],
857 "host": [
858 "phab.mercurial-scm.org"
859 ],
860 961 "content-type": [
861 962 "application/x-www-form-urlencoded"
862 963 ],
863 964 "accept": [
864 965 "application/mercurial-0.1"
865 966 ],
866 967 "user-agent": [
867 "mercurial/proto-1.0 (Mercurial 4.7.1+867-34bcd3af7109+20180915)"
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"
868 975 ]
869 },
870 "method": "POST"
976 }
871 977 },
872 978 "response": {
873 979 "status": {
874 980 "code": 200,
875 981 "message": "OK"
876 982 },
983 "body": {
984 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
985 },
877 986 "headers": {
878 "server": [
879 "Apache/2.4.10 (Debian)"
987 "expires": [
988 "Sat, 01 Jan 2000 00:00:00 GMT"
989 ],
990 "x-xss-protection": [
991 "1; mode=block"
880 992 ],
881 "strict-transport-security": [
882 "max-age=0; includeSubdomains; preload"
993 "transfer-encoding": [
994 "chunked"
995 ],
996 "date": [
997 "Sun, 03 Mar 2019 00:12:40 GMT"
883 998 ],
884 999 "x-frame-options": [
885 1000 "Deny"
886 1001 ],
1002 "cache-control": [
1003 "no-store"
1004 ],
1005 "content-type": [
1006 "application/json"
1007 ],
887 1008 "x-content-type-options": [
888 1009 "nosniff"
889 1010 ],
890 "expires": [
891 "Sat, 01 Jan 2000 00:00:00 GMT"
1011 "server": [
1012 "Apache/2.4.10 (Debian)"
892 1013 ],
893 1014 "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 ],
896 "x-xss-protection": [
897 "1; mode=block"
898 ],
899 "content-type": [
900 "application/json"
1015 "phsid=A%2Ftdudqohojcq4hyc7gl4kthzkhuq3nmcxgnunpbjm; expires=Fri, 01-Mar-2024 00:12:40 GMT; Max-Age=157680000; path=/; domain=phab.mercurial-scm.org; secure; httponly"
901 1016 ],
902 "cache-control": [
903 "no-store"
904 ],
905 "date": [
906 "Sat, 15 Sep 2018 04:53:52 GMT"
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