Mercurial > public > mercurial-scm > hg-stable
annotate hgext/phabricator.py @ 42465:c19d259fd6ad
phabricator: use parents.set to always set dependencies
Now that Mercurial's Phabricator instance has been updated to a version that
supports the parents.set transaction on revision.edit we can use that to set
dependency relationships in patch stacks instead of abusing the summary.
This has the advantage that we can use it on every `phabsend` so commit
reordering is picked up without spamming changes like abusing the summary would,
and using parents.set will clear previous parents unlike parents.add.
Differential Revision: https://phab.mercurial-scm.org/D6514
author | Ian Moody <moz-ian@perix.co.uk> |
---|---|
date | Wed, 12 Jun 2019 17:22:37 +0100 |
parents | f33d3ee110da |
children | c17e6a3e7356 |
rev | line source |
---|---|
33200 | 1 # phabricator.py - simple Phabricator integration |
2 # | |
3 # Copyright 2017 Facebook, Inc. | |
4 # | |
5 # This software may be used and distributed according to the terms of the | |
6 # GNU General Public License version 2 or any later version. | |
39671
87539f615b87
phabricator: mark extension as experimental for now
Augie Fackler <raf@durin42.com>
parents:
39670
diff
changeset
|
7 """simple Phabricator integration (EXPERIMENTAL) |
33200 | 8 |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
9 This extension provides a ``phabsend`` command which sends a stack of |
33993 | 10 changesets to Phabricator, and a ``phabread`` command which prints a stack of |
11 revisions in a format suitable for :hg:`import`, and a ``phabupdate`` command | |
12 to update statuses in batch. | |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
13 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
14 By default, Phabricator requires ``Test Plan`` which might prevent some |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
15 changeset from being sent. The requirement could be disabled by changing |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
16 ``differential.require-test-plan-field`` config server side. |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
17 |
33200 | 18 Config:: |
19 | |
20 [phabricator] | |
21 # Phabricator URL | |
22 url = https://phab.example.com/ | |
23 | |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
24 # Repo callsign. If a repo has a URL https://$HOST/diffusion/FOO, then its |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
25 # callsign is "FOO". |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
26 callsign = FOO |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
27 |
34081
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
28 # curl command to use. If not set (default), use builtin HTTP library to |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
29 # communicate. If set, use the specified curl command. This could be useful |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
30 # if you need to specify advanced options that is not easily supported by |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
31 # the internal library. |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
32 curlcmd = curl --connect-timeout 2 --retry 3 --silent |
36795
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36543
diff
changeset
|
33 |
38039
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
34 [auth] |
38040
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
35 example.schemes = https |
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
36 example.prefix = phab.example.com |
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
37 |
36795
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36543
diff
changeset
|
38 # API token. Get it from https://$HOST/conduit/login/ |
38039
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
39 example.phabtoken = cli-xxxxxxxxxxxxxxxxxxxxxxxxxxxx |
33200 | 40 """ |
41 | |
42 from __future__ import absolute_import | |
43 | |
41083
9d35ae3d9999
phabricator: ensure that the return of urlopener.open() is closed
Matt Harbison <matt_harbison@yahoo.com>
parents:
41081
diff
changeset
|
44 import contextlib |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
45 import itertools |
33200 | 46 import json |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
47 import operator |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
48 import re |
33200 | 49 |
33443
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
50 from mercurial.node import bin, nullid |
33200 | 51 from mercurial.i18n import _ |
52 from mercurial import ( | |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
53 cmdutil, |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
54 context, |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
55 encoding, |
33200 | 56 error, |
38040
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
57 httpconnection as httpconnectionmod, |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
58 mdiff, |
33761
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33718
diff
changeset
|
59 obsutil, |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
60 parser, |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
61 patch, |
41163
0101a35deae2
phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents:
41083
diff
changeset
|
62 phases, |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
63 pycompat, |
33200 | 64 registrar, |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
65 scmutil, |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
66 smartset, |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
67 tags, |
42226
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
68 templatefilters, |
39670
4057e38bba76
phabricator: fix templating bug by using hybriddict
Augie Fackler <raf@durin42.com>
parents:
39668
diff
changeset
|
69 templateutil, |
33200 | 70 url as urlmod, |
71 util, | |
72 ) | |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36826
diff
changeset
|
73 from mercurial.utils import ( |
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36826
diff
changeset
|
74 procutil, |
37800
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37123
diff
changeset
|
75 stringutil, |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36826
diff
changeset
|
76 ) |
33200 | 77 |
39751
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39671
diff
changeset
|
78 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39671
diff
changeset
|
79 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39671
diff
changeset
|
80 # be specifying the version(s) of Mercurial they are tested with, or |
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39671
diff
changeset
|
81 # leave the attribute unspecified. |
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39671
diff
changeset
|
82 testedwith = 'ships-with-hg-core' |
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39671
diff
changeset
|
83 |
33200 | 84 cmdtable = {} |
85 command = registrar.command(cmdtable) | |
86 | |
38075
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
87 configtable = {} |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
88 configitem = registrar.configitem(configtable) |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
89 |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
90 # developer config: phabricator.batchsize |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
91 configitem(b'phabricator', b'batchsize', |
38075
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
92 default=12, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
93 ) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
94 configitem(b'phabricator', b'callsign', |
38075
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
95 default=None, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
96 ) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
97 configitem(b'phabricator', b'curlcmd', |
38075
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
98 default=None, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
99 ) |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
100 # developer config: phabricator.repophid |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
101 configitem(b'phabricator', b'repophid', |
38075
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
102 default=None, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
103 ) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
104 configitem(b'phabricator', b'url', |
38075
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
105 default=None, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
106 ) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
107 configitem(b'phabsend', b'confirm', |
38075
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
108 default=False, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
109 ) |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
38040
diff
changeset
|
110 |
34080 | 111 colortable = { |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
112 b'phabricator.action.created': b'green', |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
113 b'phabricator.action.skipped': b'magenta', |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
114 b'phabricator.action.updated': b'magenta', |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
115 b'phabricator.desc': b'', |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
116 b'phabricator.drev': b'bold', |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
117 b'phabricator.node': b'', |
34080 | 118 } |
119 | |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
120 _VCR_FLAGS = [ |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
121 (b'', b'test-vcr', b'', |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
122 _(b'Path to a vcr file. If nonexistent, will record a new vcr transcript' |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
123 b', otherwise will mock all http requests using the specified vcr file.' |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
124 b' (ADVANCED)' |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
125 )), |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
126 ] |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
127 |
42451
16312ea45a8b
phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42450
diff
changeset
|
128 def vcrcommand(name, flags, spec, helpcategory=None, optionalrepo=False): |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
129 fullflags = flags + _VCR_FLAGS |
42295
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
130 def hgmatcher(r1, r2): |
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
131 if r1.uri != r2.uri or r1.method != r2.method: |
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
132 return False |
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
133 r1params = r1.body.split(b'&') |
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
134 r2params = r2.body.split(b'&') |
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
135 return set(r1params) == set(r2params) |
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
136 |
42459
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
137 def sanitiserequest(request): |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
138 request.body = re.sub( |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
139 r'cli-[a-z0-9]+', |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
140 r'cli-hahayouwish', |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
141 request.body |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
142 ) |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
143 return request |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
144 |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
145 def sanitiseresponse(response): |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
146 if r'set-cookie' in response[r'headers']: |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
147 del response[r'headers'][r'set-cookie'] |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
148 return response |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
149 |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
150 def decorate(fn): |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
151 def inner(*args, **kwargs): |
41903
2bad8f92cebf
py3: use fsencode for vcr recording paths and strings for custom_patches args
Ian Moody <moz-ian@perix.co.uk>
parents:
41902
diff
changeset
|
152 cassette = pycompat.fsdecode(kwargs.pop(r'test_vcr', None)) |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
153 if cassette: |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
154 import hgdemandimport |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
155 with hgdemandimport.deactivated(): |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
156 import vcr as vcrmod |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
157 import vcr.stubs as stubs |
40378
b015f30a91fb
phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com>
parents:
40151
diff
changeset
|
158 vcr = vcrmod.VCR( |
b015f30a91fb
phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com>
parents:
40151
diff
changeset
|
159 serializer=r'json', |
42459
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
160 before_record_request=sanitiserequest, |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42451
diff
changeset
|
161 before_record_response=sanitiseresponse, |
40378
b015f30a91fb
phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com>
parents:
40151
diff
changeset
|
162 custom_patches=[ |
41903
2bad8f92cebf
py3: use fsencode for vcr recording paths and strings for custom_patches args
Ian Moody <moz-ian@perix.co.uk>
parents:
41902
diff
changeset
|
163 (urlmod, r'httpconnection', |
2bad8f92cebf
py3: use fsencode for vcr recording paths and strings for custom_patches args
Ian Moody <moz-ian@perix.co.uk>
parents:
41902
diff
changeset
|
164 stubs.VCRHTTPConnection), |
2bad8f92cebf
py3: use fsencode for vcr recording paths and strings for custom_patches args
Ian Moody <moz-ian@perix.co.uk>
parents:
41902
diff
changeset
|
165 (urlmod, r'httpsconnection', |
40378
b015f30a91fb
phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com>
parents:
40151
diff
changeset
|
166 stubs.VCRHTTPSConnection), |
b015f30a91fb
phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com>
parents:
40151
diff
changeset
|
167 ]) |
42295
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
168 vcr.register_matcher(r'hgmatcher', hgmatcher) |
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42286
diff
changeset
|
169 with vcr.use_cassette(cassette, match_on=[r'hgmatcher']): |
40378
b015f30a91fb
phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com>
parents:
40151
diff
changeset
|
170 return fn(*args, **kwargs) |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
171 return fn(*args, **kwargs) |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
172 inner.__name__ = fn.__name__ |
40435
7e2c58b08e74
phabricator: ensure the command summaries are available in extension help
Matt Harbison <matt_harbison@yahoo.com>
parents:
40378
diff
changeset
|
173 inner.__doc__ = fn.__doc__ |
42451
16312ea45a8b
phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42450
diff
changeset
|
174 return command(name, fullflags, spec, helpcategory=helpcategory, |
16312ea45a8b
phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42450
diff
changeset
|
175 optionalrepo=optionalrepo)(inner) |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
176 return decorate |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
177 |
33200 | 178 def urlencodenested(params): |
179 """like urlencode, but works with nested parameters. | |
180 | |
181 For example, if params is {'a': ['b', 'c'], 'd': {'e': 'f'}}, it will be | |
182 flattened to {'a[0]': 'b', 'a[1]': 'c', 'd[e]': 'f'} and then passed to | |
183 urlencode. Note: the encoding is consistent with PHP's http_build_query. | |
184 """ | |
185 flatparams = util.sortdict() | |
186 def process(prefix, obj): | |
40473
d7d3164e6a31
phabricator: properly encode boolean types in the request body
Matt Harbison <matt_harbison@yahoo.com>
parents:
40435
diff
changeset
|
187 if isinstance(obj, bool): |
d7d3164e6a31
phabricator: properly encode boolean types in the request body
Matt Harbison <matt_harbison@yahoo.com>
parents:
40435
diff
changeset
|
188 obj = {True: b'true', False: b'false'}[obj] # Python -> PHP form |
41905
47125193bad0
py3: convert indexes into bytes when enumerating lists in urlencodenested
Ian Moody <moz-ian@perix.co.uk>
parents:
41904
diff
changeset
|
189 lister = lambda l: [(b'%d' % k, v) for k, v in enumerate(l)] |
47125193bad0
py3: convert indexes into bytes when enumerating lists in urlencodenested
Ian Moody <moz-ian@perix.co.uk>
parents:
41904
diff
changeset
|
190 items = {list: lister, dict: lambda x: x.items()}.get(type(obj)) |
33200 | 191 if items is None: |
192 flatparams[prefix] = obj | |
193 else: | |
194 for k, v in items(obj): | |
195 if prefix: | |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
196 process(b'%s[%s]' % (prefix, k), v) |
33200 | 197 else: |
198 process(k, v) | |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
199 process(b'', params) |
33200 | 200 return util.urlreq.urlencode(flatparams) |
201 | |
42449
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42447
diff
changeset
|
202 def readurltoken(ui): |
38039
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
203 """return conduit url, token and make sure they exist |
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
204 |
38040
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
205 Currently read from [auth] config section. In the future, it might |
38039
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
206 make sense to read from .arcconfig and .arcrc as well. |
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
207 """ |
42449
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42447
diff
changeset
|
208 url = ui.config(b'phabricator', b'url') |
38039
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
209 if not url: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
210 raise error.Abort(_(b'config %s.%s is required') |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
211 % (b'phabricator', b'url')) |
38039
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
212 |
42449
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42447
diff
changeset
|
213 res = httpconnectionmod.readauthforuri(ui, url, util.url(url).user) |
38040
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
214 token = None |
38039
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
215 |
38040
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
216 if res: |
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
217 group, auth = res |
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
218 |
42449
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42447
diff
changeset
|
219 ui.debug(b"using auth.%s.* for authentication\n" % group) |
38040
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
38039
diff
changeset
|
220 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
221 token = auth.get(b'phabtoken') |
38039
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
38020
diff
changeset
|
222 |
36795
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36543
diff
changeset
|
223 if not token: |
40151
38ac525b44c9
phabricator: drop support for the legacy phabricator.auth.token config (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents:
39751
diff
changeset
|
224 raise error.Abort(_(b'Can\'t find conduit token associated to %s') |
38ac525b44c9
phabricator: drop support for the legacy phabricator.auth.token config (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents:
39751
diff
changeset
|
225 % (url,)) |
36795
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36543
diff
changeset
|
226 |
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36543
diff
changeset
|
227 return url, token |
33200 | 228 |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
229 def callconduit(ui, name, params): |
33200 | 230 """call Conduit API, params is a dict. return json.loads result, or None""" |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
231 host, token = readurltoken(ui) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
232 url, authinfo = util.url(b'/'.join([host, b'api', name])).authinfo() |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
233 ui.debug(b'Conduit Call: %s %s\n' % (url, pycompat.byterepr(params))) |
33200 | 234 params = params.copy() |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
235 params[b'api.token'] = token |
34081
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
236 data = urlencodenested(params) |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
237 curlcmd = ui.config(b'phabricator', b'curlcmd') |
34081
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
238 if curlcmd: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
239 sin, sout = procutil.popen2(b'%s -d @- %s' |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36826
diff
changeset
|
240 % (curlcmd, procutil.shellquote(url))) |
34081
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
241 sin.write(data) |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
242 sin.close() |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
243 body = sout.read() |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34080
diff
changeset
|
244 else: |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
245 urlopener = urlmod.opener(ui, authinfo) |
41906
a98dabdb5a7b
py3: convert URL to str before passing it to request
Ian Moody <moz-ian@perix.co.uk>
parents:
41905
diff
changeset
|
246 request = util.urlreq.request(pycompat.strurl(url), data=data) |
41083
9d35ae3d9999
phabricator: ensure that the return of urlopener.open() is closed
Matt Harbison <matt_harbison@yahoo.com>
parents:
41081
diff
changeset
|
247 with contextlib.closing(urlopener.open(request)) as rsp: |
9d35ae3d9999
phabricator: ensure that the return of urlopener.open() is closed
Matt Harbison <matt_harbison@yahoo.com>
parents:
41081
diff
changeset
|
248 body = rsp.read() |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
249 ui.debug(b'Conduit Response: %s\n' % body) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
250 parsed = pycompat.rapply( |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
251 lambda x: encoding.unitolocal(x) if isinstance(x, pycompat.unicode) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
252 else x, |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
253 json.loads(body) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
254 ) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
255 if parsed.get(b'error_code'): |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
256 msg = (_(b'Conduit Error (%s): %s') |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
257 % (parsed[b'error_code'], parsed[b'error_info'])) |
33200 | 258 raise error.Abort(msg) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
259 return parsed[b'result'] |
33200 | 260 |
42451
16312ea45a8b
phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42450
diff
changeset
|
261 @vcrcommand(b'debugcallconduit', [], _(b'METHOD'), optionalrepo=True) |
33200 | 262 def debugcallconduit(ui, repo, name): |
263 """call Conduit API | |
264 | |
265 Call parameters are read from stdin as a JSON blob. Result will be written | |
266 to stdout as a JSON blob. | |
267 """ | |
41976
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
268 # json.loads only accepts bytes from 3.6+ |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
269 rawparams = encoding.unifromlocal(ui.fin.read()) |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
270 # json.loads only returns unicode strings |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
271 params = pycompat.rapply(lambda x: |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
272 encoding.unitolocal(x) if isinstance(x, pycompat.unicode) else x, |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
273 json.loads(rawparams) |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
274 ) |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
275 # json.dumps only accepts unicode strings |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
276 result = pycompat.rapply(lambda x: |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
277 encoding.unifromlocal(x) if isinstance(x, bytes) else x, |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
278 callconduit(ui, name, params) |
41976
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
279 ) |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
280 s = json.dumps(result, sort_keys=True, indent=2, separators=(u',', u': ')) |
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41975
diff
changeset
|
281 ui.write(b'%s\n' % encoding.unitolocal(s)) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
282 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
283 def getrepophid(repo): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
284 """given callsign, return repository PHID or None""" |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
285 # developer config: phabricator.repophid |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
286 repophid = repo.ui.config(b'phabricator', b'repophid') |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
287 if repophid: |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
288 return repophid |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
289 callsign = repo.ui.config(b'phabricator', b'callsign') |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
290 if not callsign: |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
291 return None |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
292 query = callconduit(repo.ui, b'diffusion.repository.search', |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
293 {b'constraints': {b'callsigns': [callsign]}}) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
294 if len(query[b'data']) == 0: |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
295 return None |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
296 repophid = query[b'data'][0][b'phid'] |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
297 repo.ui.setconfig(b'phabricator', b'repophid', repophid) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
298 return repophid |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
299 |
41546
bd3f03d8cc9f
global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41387
diff
changeset
|
300 _differentialrevisiontagre = re.compile(br'\AD([1-9][0-9]*)\Z') |
33263
ed61189763ef
phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents:
33202
diff
changeset
|
301 _differentialrevisiondescre = re.compile( |
41546
bd3f03d8cc9f
global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41387
diff
changeset
|
302 br'^Differential Revision:\s*(?P<url>(?:.*)D(?P<id>[1-9][0-9]*))$', re.M) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
303 |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
304 def getoldnodedrevmap(repo, nodelist): |
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
305 """find previous nodes that has been sent to Phabricator |
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
306 |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
307 return {node: (oldnode, Differential diff, Differential Revision ID)} |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
308 for node in nodelist with known previous sent versions, or associated |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
309 Differential Revision IDs. ``oldnode`` and ``Differential diff`` could |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
310 be ``None``. |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
311 |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
312 Examines commit messages like "Differential Revision:" to get the |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
313 association information. |
33263
ed61189763ef
phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents:
33202
diff
changeset
|
314 |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
315 If such commit message line is not found, examines all precursors and their |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
316 tags. Tags with format like "D1234" are considered a match and the node |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
317 with that tag, and the number after "D" (ex. 1234) will be returned. |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
318 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
319 The ``old node``, if not None, is guaranteed to be the last diff of |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
320 corresponding Differential Revision, and exist in the repo. |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
321 """ |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
322 unfi = repo.unfiltered() |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
323 nodemap = unfi.changelog.nodemap |
33263
ed61189763ef
phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents:
33202
diff
changeset
|
324 |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
325 result = {} # {node: (oldnode?, lastdiff?, drev)} |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
326 toconfirm = {} # {node: (force, {precnode}, drev)} |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
327 for node in nodelist: |
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
328 ctx = unfi[node] |
33443
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
329 # For tags like "D123", put them into "toconfirm" to verify later |
33761
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33718
diff
changeset
|
330 precnodes = list(obsutil.allpredecessors(unfi.obsstore, [node])) |
33443
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
331 for n in precnodes: |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
332 if n in nodemap: |
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
333 for tag in unfi.nodetags(n): |
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
334 m = _differentialrevisiontagre.match(tag) |
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
335 if m: |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
336 toconfirm[node] = (0, set(precnodes), int(m.group(1))) |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
337 continue |
33263
ed61189763ef
phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents:
33202
diff
changeset
|
338 |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
339 # Check commit message |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
340 m = _differentialrevisiondescre.search(ctx.description()) |
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
341 if m: |
41910
16d050678047
py3: use r'' for group name arguments to MatchObjects in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41909
diff
changeset
|
342 toconfirm[node] = (1, set(precnodes), int(m.group(r'id'))) |
33263
ed61189763ef
phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents:
33202
diff
changeset
|
343 |
33443
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
344 # Double check if tags are genuine by collecting all old nodes from |
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
345 # Phabricator, and expect precursors overlap with it. |
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
346 if toconfirm: |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
347 drevs = [drev for force, precs, drev in toconfirm.values()] |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
348 alldiffs = callconduit(unfi.ui, b'differential.querydiffs', |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
349 {b'revisionIDs': drevs}) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
350 getnode = lambda d: bin( |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
351 getdiffmeta(d).get(b'node', b'')) or None |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
352 for newnode, (force, precset, drev) in toconfirm.items(): |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
353 diffs = [d for d in alldiffs.values() |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
354 if int(d[b'revisionID']) == drev] |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
355 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
356 # "precursors" as known by Phabricator |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
357 phprecset = set(getnode(d) for d in diffs) |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
358 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
359 # Ignore if precursors (Phabricator and local repo) do not overlap, |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
360 # and force is not set (when commit message says nothing) |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
361 if not force and not bool(phprecset & precset): |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
362 tagname = b'D%d' % drev |
33443
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
363 tags.tag(repo, tagname, nullid, message=None, user=None, |
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
364 date=None, local=True) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
365 unfi.ui.warn(_(b'D%s: local tag removed - does not match ' |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
366 b'Differential history\n') % drev) |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
367 continue |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
368 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
369 # Find the last node using Phabricator metadata, and make sure it |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
370 # exists in the repo |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
371 oldnode = lastdiff = None |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
372 if diffs: |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
373 lastdiff = max(diffs, key=lambda d: int(d[b'id'])) |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
374 oldnode = getnode(lastdiff) |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
375 if oldnode and oldnode not in nodemap: |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
376 oldnode = None |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
377 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
378 result[newnode] = (oldnode, lastdiff, drev) |
33443
e48082e0a8d5
phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents:
33442
diff
changeset
|
379 |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
380 return result |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
381 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
382 def getdiff(ctx, diffopts): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
383 """plain-text diff without header (user, commit message, etc)""" |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
384 output = util.stringio() |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
385 for chunk, _label in patch.diffui(ctx.repo(), ctx.p1().node(), ctx.node(), |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
386 None, opts=diffopts): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
387 output.write(chunk) |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
388 return output.getvalue() |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
389 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
390 def creatediff(ctx): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
391 """create a Differential Diff""" |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
392 repo = ctx.repo() |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
393 repophid = getrepophid(repo) |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
394 # Create a "Differential Diff" via "differential.createrawdiff" API |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
395 params = {b'diff': getdiff(ctx, mdiff.diffopts(git=True, context=32767))} |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
396 if repophid: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
397 params[b'repositoryPHID'] = repophid |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
398 diff = callconduit(repo.ui, b'differential.createrawdiff', params) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
399 if not diff: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
400 raise error.Abort(_(b'cannot create diff for %s') % ctx) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
401 return diff |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
402 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
403 def writediffproperties(ctx, diff): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
404 """write metadata to diff so patches could be applied losslessly""" |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
405 params = { |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
406 b'diff_id': diff[b'id'], |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
407 b'name': b'hg:meta', |
42226
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
408 b'data': templatefilters.json({ |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
409 b'user': ctx.user(), |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
410 b'date': b'%d %d' % ctx.date(), |
42233
d49ab47be8a6
phabricator: include branch in the diffproperty metadata
Ian Moody <moz-ian@perix.co.uk>
parents:
42227
diff
changeset
|
411 b'branch': ctx.branch(), |
42226
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
412 b'node': ctx.hex(), |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
413 b'parent': ctx.p1().hex(), |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
414 }), |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
415 } |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
416 callconduit(ctx.repo().ui, b'differential.setdiffproperty', params) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
417 |
37800
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37123
diff
changeset
|
418 params = { |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
419 b'diff_id': diff[b'id'], |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
420 b'name': b'local:commits', |
42226
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
421 b'data': templatefilters.json({ |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
422 ctx.hex(): { |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
423 b'author': stringutil.person(ctx.user()), |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41976
diff
changeset
|
424 b'authorEmail': stringutil.email(ctx.user()), |
42227
c0e30c9ee5ba
phabricator: set local:commits time metadata as an int, not a string
Ian Moody <moz-ian@perix.co.uk>
parents:
42226
diff
changeset
|
425 b'time': int(ctx.date()[0]), |
42284
9421d7e12888
phabricator: include commit (node) and parent in the local:commits metadata
Ian Moody <moz-ian@perix.co.uk>
parents:
42235
diff
changeset
|
426 b'commit': ctx.hex(), |
9421d7e12888
phabricator: include commit (node) and parent in the local:commits metadata
Ian Moody <moz-ian@perix.co.uk>
parents:
42235
diff
changeset
|
427 b'parents': [ctx.p1().hex()], |
42233
d49ab47be8a6
phabricator: include branch in the diffproperty metadata
Ian Moody <moz-ian@perix.co.uk>
parents:
42227
diff
changeset
|
428 b'branch': ctx.branch(), |
37800
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37123
diff
changeset
|
429 }, |
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37123
diff
changeset
|
430 }), |
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37123
diff
changeset
|
431 } |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
432 callconduit(ctx.repo().ui, b'differential.setdiffproperty', params) |
37800
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37123
diff
changeset
|
433 |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
434 def createdifferentialrevision(ctx, revid=None, parentrevphid=None, |
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
435 oldnode=None, olddiff=None, actions=None, |
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
436 comment=None): |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
437 """create or update a Differential Revision |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
438 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
439 If revid is None, create a new Differential Revision, otherwise update |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
440 revid. If parentrevphid is not None, set it as a dependency. |
33265
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
441 |
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
442 If oldnode is not None, check if the patch content (without commit message |
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
443 and metadata) has changed before creating another diff. |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
444 |
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
445 If actions is not None, they will be appended to the transaction. |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
446 """ |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
447 repo = ctx.repo() |
33265
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
448 if oldnode: |
33994
27ff2a87d8c0
phabsend: detect patch change with larger context
Jun Wu <quark@fb.com>
parents:
33993
diff
changeset
|
449 diffopts = mdiff.diffopts(git=True, context=32767) |
33265
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
450 oldctx = repo.unfiltered()[oldnode] |
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
451 neednewdiff = (getdiff(ctx, diffopts) != getdiff(oldctx, diffopts)) |
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
452 else: |
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
453 neednewdiff = True |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
454 |
33265
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
455 transactions = [] |
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
456 if neednewdiff: |
95f658b558a3
phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents:
33264
diff
changeset
|
457 diff = creatediff(ctx) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
458 transactions.append({b'type': b'update', b'value': diff[b'phid']}) |
42447
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42295
diff
changeset
|
459 if comment: |
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42295
diff
changeset
|
460 transactions.append({b'type': b'comment', b'value': comment}) |
33718
f100354cce52
phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents:
33717
diff
changeset
|
461 else: |
f100354cce52
phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents:
33717
diff
changeset
|
462 # Even if we don't need to upload a new diff because the patch content |
f100354cce52
phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents:
33717
diff
changeset
|
463 # does not change. We might still need to update its metadata so |
f100354cce52
phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents:
33717
diff
changeset
|
464 # pushers could know the correct node metadata. |
f100354cce52
phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents:
33717
diff
changeset
|
465 assert olddiff |
f100354cce52
phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents:
33717
diff
changeset
|
466 diff = olddiff |
f100354cce52
phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents:
33717
diff
changeset
|
467 writediffproperties(ctx, diff) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
468 |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
469 # Set the parent Revision every time, so commit re-ordering is picked-up |
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
470 if parentrevphid: |
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
471 transactions.append({b'type': b'parents.set', |
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
472 b'value': [parentrevphid]}) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
473 |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
474 if actions: |
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
475 transactions += actions |
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
476 |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
477 # Parse commit message and update related fields. |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
478 desc = ctx.description() |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
479 info = callconduit(repo.ui, b'differential.parsecommitmessage', |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
480 {b'corpus': desc}) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
481 for k, v in info[b'fields'].items(): |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
482 if k in [b'title', b'summary', b'testPlan']: |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
483 transactions.append({b'type': k, b'value': v}) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
484 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
485 params = {b'transactions': transactions} |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
486 if revid is not None: |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
487 # Update an existing Differential Revision |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
488 params[b'objectIdentifier'] = revid |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
489 |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
490 revision = callconduit(repo.ui, b'differential.revision.edit', params) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
491 if not revision: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
492 raise error.Abort(_(b'cannot create revision for %s') % ctx) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
493 |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
494 return revision, diff |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
495 |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
496 def userphids(repo, names): |
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
497 """convert user names to PHIDs""" |
41716
570e62f1dcf2
phabricator: make user searches case-insensitive
Julien Cristau <jcristau@mozilla.com>
parents:
41546
diff
changeset
|
498 names = [name.lower() for name in names] |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
499 query = {b'constraints': {b'usernames': names}} |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
500 result = callconduit(repo.ui, b'user.search', query) |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
501 # username not found is not an error of the API. So check if we have missed |
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
502 # some names here. |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
503 data = result[b'data'] |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
504 resolved = set(entry[b'fields'][b'username'].lower() for entry in data) |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
505 unresolved = set(names) - resolved |
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
506 if unresolved: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
507 raise error.Abort(_(b'unknown username: %s') |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
508 % b' '.join(sorted(unresolved))) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
509 return [entry[b'phid'] for entry in data] |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
510 |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
511 @vcrcommand(b'phabsend', |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
512 [(b'r', b'rev', [], _(b'revisions to send'), _(b'REV')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
513 (b'', b'amend', True, _(b'update commit messages')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
514 (b'', b'reviewer', [], _(b'specify reviewers')), |
42460
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
515 (b'', b'blocker', [], _(b'specify blocking reviewers')), |
42447
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42295
diff
changeset
|
516 (b'm', b'comment', b'', |
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42295
diff
changeset
|
517 _(b'add a comment to Revisions with new/updated Diffs')), |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
518 (b'', b'confirm', None, _(b'ask for confirmation before sending'))], |
41076
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40435
diff
changeset
|
519 _(b'REV [OPTIONS]'), |
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40435
diff
changeset
|
520 helpcategory=command.CATEGORY_IMPORT_EXPORT) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
521 def phabsend(ui, repo, *revs, **opts): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
522 """upload changesets to Phabricator |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
523 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
524 If there are multiple revisions specified, they will be send as a stack |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
525 with a linear dependencies relationship using the order specified by the |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
526 revset. |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
527 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
528 For the first time uploading changesets, local tags will be created to |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
529 maintain the association. After the first time, phabsend will check |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
530 obsstore and tags information so it can figure out whether to update an |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
531 existing Differential Revision, or create a new one. |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
532 |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
533 If --amend is set, update commit messages so they have the |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
534 ``Differential Revision`` URL, remove related tags. This is similar to what |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
535 arcanist will do, and is more desired in author-push workflows. Otherwise, |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
536 use local tags to record the ``Differential Revision`` association. |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
537 |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
538 The --confirm option lets you confirm changesets before sending them. You |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
539 can also add following to your configuration file to make it default |
33992
45a8cd74de4e
phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents:
33855
diff
changeset
|
540 behaviour:: |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
541 |
33992
45a8cd74de4e
phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents:
33855
diff
changeset
|
542 [phabsend] |
45a8cd74de4e
phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents:
33855
diff
changeset
|
543 confirm = true |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
544 |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
545 phabsend will check obsstore and the above association to decide whether to |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
546 update an existing Differential Revision, or create a new one. |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
547 """ |
41975
51ba9fbcca52
py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41955
diff
changeset
|
548 opts = pycompat.byteskwargs(opts) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
549 revs = list(revs) + opts.get(b'rev', []) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
550 revs = scmutil.revrange(repo, revs) |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
551 |
33266
5b2391b46906
phabricator: abort if phabsend gets empty revs
Jun Wu <quark@fb.com>
parents:
33265
diff
changeset
|
552 if not revs: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
553 raise error.Abort(_(b'phabsend requires at least one changeset')) |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
554 if opts.get(b'amend'): |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
555 cmdutil.checkunfinished(repo) |
33266
5b2391b46906
phabricator: abort if phabsend gets empty revs
Jun Wu <quark@fb.com>
parents:
33265
diff
changeset
|
556 |
33996
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
557 # {newnode: (oldnode, olddiff, olddrev} |
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
558 oldmap = getoldnodedrevmap(repo, [repo[r].node() for r in revs]) |
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
559 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
560 confirm = ui.configbool(b'phabsend', b'confirm') |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
561 confirm |= bool(opts.get(b'confirm')) |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
562 if confirm: |
33996
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
563 confirmed = _confirmbeforesend(repo, revs, oldmap) |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
564 if not confirmed: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
565 raise error.Abort(_(b'phabsend cancelled')) |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
566 |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
567 actions = [] |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
568 reviewers = opts.get(b'reviewer', []) |
42460
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
569 blockers = opts.get(b'blocker', []) |
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
570 phids = [] |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
571 if reviewers: |
42460
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
572 phids.extend(userphids(repo, reviewers)) |
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
573 if blockers: |
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
574 phids.extend(map( |
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
575 lambda phid: b'blocking(%s)' % phid, userphids(repo, blockers) |
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
576 )) |
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42459
diff
changeset
|
577 if phids: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
578 actions.append({b'type': b'reviewers.add', b'value': phids}) |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
579 |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
580 drevids = [] # [int] |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
581 diffmap = {} # {newnode: diff} |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
582 |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
583 # Send patches one by one so we know their Differential Revision PHIDs and |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
584 # can provide dependency relationship |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
585 lastrevphid = None |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
586 for rev in revs: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
587 ui.debug(b'sending rev %d\n' % rev) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
588 ctx = repo[rev] |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
589 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
590 # Get Differential Revision ID |
33717
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33716
diff
changeset
|
591 oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None)) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
592 if oldnode != ctx.node() or opts.get(b'amend'): |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
593 # Create or update Differential Revision |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
594 revision, diff = createdifferentialrevision( |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
595 ctx, revid, lastrevphid, oldnode, olddiff, actions, |
42447
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42295
diff
changeset
|
596 opts.get(b'comment')) |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
597 diffmap[ctx.node()] = diff |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
598 newrevid = int(revision[b'object'][b'id']) |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
599 newrevphid = revision[b'object'][b'phid'] |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
600 if revid: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
601 action = b'updated' |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
602 else: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
603 action = b'created' |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
604 |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
605 # Create a local tag to note the association, if commit message |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
606 # does not have it already |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
607 m = _differentialrevisiondescre.search(ctx.description()) |
41910
16d050678047
py3: use r'' for group name arguments to MatchObjects in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41909
diff
changeset
|
608 if not m or int(m.group(r'id')) != newrevid: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
609 tagname = b'D%d' % newrevid |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
610 tags.tag(repo, tagname, ctx.node(), message=None, user=None, |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
611 date=None, local=True) |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
612 else: |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
613 # Nothing changed. But still set "newrevphid" so the next revision |
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
614 # could depend on this one and "newrevid" for the summary line. |
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
615 newrevphid = querydrev(repo, str(revid))[0][b'phid'] |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
616 newrevid = revid |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
617 action = b'skipped' |
33201
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
618 |
34080 | 619 actiondesc = ui.label( |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
620 {b'created': _(b'created'), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
621 b'skipped': _(b'skipped'), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
622 b'updated': _(b'updated')}[action], |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
623 b'phabricator.action.%s' % action) |
41909
634b56b54e7c
py3: use %d instead of %s when formatting an int into a byte string
Ian Moody <moz-ian@perix.co.uk>
parents:
41908
diff
changeset
|
624 drevdesc = ui.label(b'D%d' % newrevid, b'phabricator.drev') |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
625 nodedesc = ui.label(bytes(ctx), b'phabricator.node') |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
626 desc = ui.label(ctx.description().split(b'\n')[0], b'phabricator.desc') |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
627 ui.write(_(b'%s - %s - %s: %s\n') % (drevdesc, actiondesc, nodedesc, |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
628 desc)) |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
629 drevids.append(newrevid) |
42465
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42460
diff
changeset
|
630 lastrevphid = newrevphid |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
631 |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
632 # Update commit messages and remove tags |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
633 if opts.get(b'amend'): |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
634 unfi = repo.unfiltered() |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
635 drevs = callconduit(ui, b'differential.query', {b'ids': drevids}) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
636 with repo.wlock(), repo.lock(), repo.transaction(b'phabsend'): |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
637 wnode = unfi[b'.'].node() |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
638 mapping = {} # {oldnode: [newnode]} |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
639 for i, rev in enumerate(revs): |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
640 old = unfi[rev] |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
641 drevid = drevids[i] |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
642 drev = [d for d in drevs if int(d[b'id']) == drevid][0] |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
643 newdesc = getdescfromdrev(drev) |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
644 # Make sure commit message contain "Differential Revision" |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
645 if old.description() != newdesc: |
41163
0101a35deae2
phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents:
41083
diff
changeset
|
646 if old.phase() == phases.public: |
0101a35deae2
phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents:
41083
diff
changeset
|
647 ui.warn(_("warning: not updating public commit %s\n") |
0101a35deae2
phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents:
41083
diff
changeset
|
648 % scmutil.formatchangeid(old)) |
0101a35deae2
phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents:
41083
diff
changeset
|
649 continue |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
650 parents = [ |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
651 mapping.get(old.p1().node(), (old.p1(),))[0], |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
652 mapping.get(old.p2().node(), (old.p2(),))[0], |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
653 ] |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
654 new = context.metadataonlyctx( |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
655 repo, old, parents=parents, text=newdesc, |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
656 user=old.user(), date=old.date(), extra=old.extra()) |
38342
bb7e3c6ef592
phabricator: preserve the phase when amending in the Differential fields
Matt Harbison <matt_harbison@yahoo.com>
parents:
38075
diff
changeset
|
657 |
38429
32fba6fe893d
scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38398
diff
changeset
|
658 newnode = new.commit() |
38342
bb7e3c6ef592
phabricator: preserve the phase when amending in the Differential fields
Matt Harbison <matt_harbison@yahoo.com>
parents:
38075
diff
changeset
|
659 |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
660 mapping[old.node()] = [newnode] |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
661 # Update diff property |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
662 writediffproperties(unfi[newnode], diffmap[old.node()]) |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
663 # Remove local tags since it's no longer necessary |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
664 tagname = b'D%d' % drevid |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
665 if tagname in repo.tags(): |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
666 tags.tag(repo, tagname, nullid, message=None, user=None, |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
667 date=None, local=True) |
38429
32fba6fe893d
scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38398
diff
changeset
|
668 scmutil.cleanupnodes(repo, mapping, b'phabsend', fixphase=True) |
33808
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
669 if wnode in mapping: |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
670 unfi.setparents(mapping[wnode][0]) |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33806
diff
changeset
|
671 |
33264
266321579c68
phabricator: add node and p1 to hg:meta property
Jun Wu <quark@fb.com>
parents:
33263
diff
changeset
|
672 # Map from "hg:meta" keys to header understood by "hg import". The order is |
266321579c68
phabricator: add node and p1 to hg:meta property
Jun Wu <quark@fb.com>
parents:
33263
diff
changeset
|
673 # consistent with "hg export" output. |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
674 _metanamemap = util.sortdict([(b'user', b'User'), (b'date', b'Date'), |
42286
231334c1ee96
phabricator: include branch in the phabread output
Ian Moody <moz-ian@perix.co.uk>
parents:
42285
diff
changeset
|
675 (b'branch', b'Branch'), (b'node', b'Node ID'), |
231334c1ee96
phabricator: include branch in the phabread output
Ian Moody <moz-ian@perix.co.uk>
parents:
42285
diff
changeset
|
676 (b'parent', b'Parent ')]) |
33264
266321579c68
phabricator: add node and p1 to hg:meta property
Jun Wu <quark@fb.com>
parents:
33263
diff
changeset
|
677 |
33996
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
678 def _confirmbeforesend(repo, revs, oldmap): |
42449
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42447
diff
changeset
|
679 url, token = readurltoken(repo.ui) |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
680 ui = repo.ui |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
681 for rev in revs: |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
682 ctx = repo[rev] |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
683 desc = ctx.description().splitlines()[0] |
33996
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
684 oldnode, olddiff, drevid = oldmap.get(ctx.node(), (None, None, None)) |
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
685 if drevid: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
686 drevdesc = ui.label(b'D%s' % drevid, b'phabricator.drev') |
33996
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
687 else: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
688 drevdesc = ui.label(_(b'NEW'), b'phabricator.drev') |
33996
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33995
diff
changeset
|
689 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
690 ui.write(_(b'%s - %s: %s\n') |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
691 % (drevdesc, |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
692 ui.label(bytes(ctx), b'phabricator.node'), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
693 ui.label(desc, b'phabricator.desc'))) |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
694 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
695 if ui.promptchoice(_(b'Send the above changes to %s (yn)?' |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
696 b'$$ &Yes $$ &No') % url): |
33716
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
697 return False |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
698 |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
699 return True |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
700 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
701 _knownstatusnames = {b'accepted', b'needsreview', b'needsrevision', b'closed', |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
702 b'abandoned'} |
33854
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
703 |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
704 def _getstatusname(drev): |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
705 """get normalized status name from a Differential Revision""" |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
706 return drev[b'statusName'].replace(b' ', b'').lower() |
33854
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
707 |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
708 # Small language to specify differential revisions. Support symbols: (), :X, |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
709 # +, and -. |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
710 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
711 _elements = { |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
712 # token-type: binding-strength, primary, prefix, infix, suffix |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
713 b'(': (12, None, (b'group', 1, b')'), None, None), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
714 b':': (8, None, (b'ancestors', 8), None, None), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
715 b'&': (5, None, None, (b'and_', 5), None), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
716 b'+': (4, None, None, (b'add', 4), None), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
717 b'-': (4, None, None, (b'sub', 4), None), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
718 b')': (0, None, None, None, None), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
719 b'symbol': (0, b'symbol', None, None, None), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
720 b'end': (0, None, None, None, None), |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
721 } |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
722 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
723 def _tokenize(text): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
724 view = memoryview(text) # zero-copy slice |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
725 special = b'():+-& ' |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
726 pos = 0 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
727 length = len(text) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
728 while pos < length: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
729 symbol = b''.join(itertools.takewhile(lambda ch: ch not in special, |
41955
e7b84ffb06d9
py3: use pycompat.iterbytestr to convert memoryview slice to bytestring
Ian Moody <moz-ian@perix.co.uk>
parents:
41911
diff
changeset
|
730 pycompat.iterbytestr(view[pos:]))) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
731 if symbol: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
732 yield (b'symbol', symbol, pos) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
733 pos += len(symbol) |
33854
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
734 else: # special char, ignore space |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
735 if text[pos] != b' ': |
33854
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
736 yield (text[pos], None, pos) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
737 pos += 1 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
738 yield (b'end', None, pos) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
739 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
740 def _parse(text): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
741 tree, pos = parser.parser(_elements).parse(_tokenize(text)) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
742 if pos != len(text): |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
743 raise error.ParseError(b'invalid token', pos) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
744 return tree |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
745 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
746 def _parsedrev(symbol): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
747 """str -> int or None, ex. 'D45' -> 45; '12' -> 12; 'x' -> None""" |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
748 if symbol.startswith(b'D') and symbol[1:].isdigit(): |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
749 return int(symbol[1:]) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
750 if symbol.isdigit(): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
751 return int(symbol) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
752 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
753 def _prefetchdrevs(tree): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
754 """return ({single-drev-id}, {ancestor-drev-id}) to prefetch""" |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
755 drevs = set() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
756 ancestordrevs = set() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
757 op = tree[0] |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
758 if op == b'symbol': |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
759 r = _parsedrev(tree[1]) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
760 if r: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
761 drevs.add(r) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
762 elif op == b'ancestors': |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
763 r, a = _prefetchdrevs(tree[1]) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
764 drevs.update(r) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
765 ancestordrevs.update(r) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
766 ancestordrevs.update(a) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
767 else: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
768 for t in tree[1:]: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
769 r, a = _prefetchdrevs(t) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
770 drevs.update(r) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
771 ancestordrevs.update(a) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
772 return drevs, ancestordrevs |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
773 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
774 def querydrev(repo, spec): |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
775 """return a list of "Differential Revision" dicts |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
776 |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
777 spec is a string using a simple query language, see docstring in phabread |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
778 for details. |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
779 |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
780 A "Differential Revision dict" looks like: |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
781 |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
782 { |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
783 "id": "2", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
784 "phid": "PHID-DREV-672qvysjcczopag46qty", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
785 "title": "example", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
786 "uri": "https://phab.example.com/D2", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
787 "dateCreated": "1499181406", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
788 "dateModified": "1499182103", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
789 "authorPHID": "PHID-USER-tv3ohwc4v4jeu34otlye", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
790 "status": "0", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
791 "statusName": "Needs Review", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
792 "properties": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
793 "branch": null, |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
794 "summary": "", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
795 "testPlan": "", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
796 "lineCount": "2", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
797 "activeDiffPHID": "PHID-DIFF-xoqnjkobbm6k4dk6hi72", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
798 "diffs": [ |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
799 "3", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
800 "4", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
801 ], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
802 "commits": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
803 "reviewers": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
804 "ccs": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
805 "hashes": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
806 "auxiliary": { |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
807 "phabricator:projects": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
808 "phabricator:depends-on": [ |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
809 "PHID-DREV-gbapp366kutjebt7agcd" |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
810 ] |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
811 }, |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
812 "repositoryPHID": "PHID-REPO-hub2hx62ieuqeheznasv", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
813 "sourcePath": null |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
814 } |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
815 """ |
33269
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
816 def fetch(params): |
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
817 """params -> single drev or None""" |
41907
59bae59b7498
py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41906
diff
changeset
|
818 key = (params.get(b'ids') or params.get(b'phids') or [None])[0] |
33269
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
819 if key in prefetched: |
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
820 return prefetched[key] |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
821 drevs = callconduit(repo.ui, b'differential.query', params) |
33269
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
822 # Fill prefetched with the result |
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
823 for drev in drevs: |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
824 prefetched[drev[b'phid']] = drev |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
825 prefetched[int(drev[b'id'])] = drev |
33269
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
826 if key not in prefetched: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
827 raise error.Abort(_(b'cannot get Differential Revision %r') |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
828 % params) |
33269
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
829 return prefetched[key] |
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
830 |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
831 def getstack(topdrevids): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
832 """given a top, get a stack from the bottom, [id] -> [id]""" |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
833 visited = set() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
834 result = [] |
41907
59bae59b7498
py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41906
diff
changeset
|
835 queue = [{b'ids': [i]} for i in topdrevids] |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
836 while queue: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
837 params = queue.pop() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
838 drev = fetch(params) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
839 if drev[b'id'] in visited: |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
840 continue |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
841 visited.add(drev[b'id']) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
842 result.append(int(drev[b'id'])) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
843 auxiliary = drev.get(b'auxiliary', {}) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
844 depends = auxiliary.get(b'phabricator:depends-on', []) |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
845 for phid in depends: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
846 queue.append({b'phids': [phid]}) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
847 result.reverse() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
848 return smartset.baseset(result) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
849 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
850 # Initialize prefetch cache |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
851 prefetched = {} # {id or phid: drev} |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
852 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
853 tree = _parse(spec) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
854 drevs, ancestordrevs = _prefetchdrevs(tree) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
855 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
856 # developer config: phabricator.batchsize |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
857 batchsize = repo.ui.configint(b'phabricator', b'batchsize') |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
858 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
859 # Prefetch Differential Revisions in batch |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
860 tofetch = set(drevs) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
861 for r in ancestordrevs: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
862 tofetch.update(range(max(1, r - batchsize), r + 1)) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
863 if drevs: |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
864 fetch({b'ids': list(tofetch)}) |
33854
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
865 validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs)) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
866 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
867 # Walk through the tree, return smartsets |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
868 def walk(tree): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
869 op = tree[0] |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
870 if op == b'symbol': |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
871 drev = _parsedrev(tree[1]) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
872 if drev: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
873 return smartset.baseset([drev]) |
33854
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
874 elif tree[1] in _knownstatusnames: |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
875 drevs = [r for r in validids |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
876 if _getstatusname(prefetched[r]) == tree[1]] |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
877 return smartset.baseset(drevs) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
878 else: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
879 raise error.Abort(_(b'unknown symbol: %s') % tree[1]) |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
880 elif op in {b'and_', b'add', b'sub'}: |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
881 assert len(tree) == 3 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
882 return getattr(operator, op)(walk(tree[1]), walk(tree[2])) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
883 elif op == b'group': |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
884 return walk(tree[1]) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
885 elif op == b'ancestors': |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
886 return getstack(walk(tree[1])) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
887 else: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
888 raise error.ProgrammingError(b'illegal tree: %r' % tree) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
889 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
890 return [prefetched[r] for r in walk(tree)] |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
891 |
33268
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
892 def getdescfromdrev(drev): |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
893 """get description (commit message) from "Differential Revision" |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
894 |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
895 This is similar to differential.getcommitmessage API. But we only care |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
896 about limited fields: title, summary, test plan, and URL. |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
897 """ |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
898 title = drev[b'title'] |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
899 summary = drev[b'summary'].rstrip() |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
900 testplan = drev[b'testPlan'].rstrip() |
33268
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
901 if testplan: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
902 testplan = b'Test Plan:\n%s' % testplan |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
903 uri = b'Differential Revision: %s' % drev[b'uri'] |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
904 return b'\n\n'.join(filter(None, [title, summary, testplan, uri])) |
33268
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
905 |
33441
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
906 def getdiffmeta(diff): |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
907 """get commit metadata (date, node, user, p1) from a diff object |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
908 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
909 The metadata could be "hg:meta", sent by phabsend, like: |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
910 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
911 "properties": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
912 "hg:meta": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
913 "date": "1499571514 25200", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
914 "node": "98c08acae292b2faf60a279b4189beb6cff1414d", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
915 "user": "Foo Bar <foo@example.com>", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
916 "parent": "6d0abad76b30e4724a37ab8721d630394070fe16" |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
917 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
918 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
919 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
920 Or converted from "local:commits", sent by "arc", like: |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
921 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
922 "properties": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
923 "local:commits": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
924 "98c08acae292b2faf60a279b4189beb6cff1414d": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
925 "author": "Foo Bar", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
926 "time": 1499546314, |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
927 "branch": "default", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
928 "tag": "", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
929 "commit": "98c08acae292b2faf60a279b4189beb6cff1414d", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
930 "rev": "98c08acae292b2faf60a279b4189beb6cff1414d", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
931 "local": "1000", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
932 "parents": ["6d0abad76b30e4724a37ab8721d630394070fe16"], |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
933 "summary": "...", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
934 "message": "...", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
935 "authorEmail": "foo@example.com" |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
936 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
937 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
938 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
939 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
940 Note: metadata extracted from "local:commits" will lose time zone |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
941 information. |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
942 """ |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
943 props = diff.get(b'properties') or {} |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
944 meta = props.get(b'hg:meta') |
42285
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
945 if not meta: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
946 if props.get(b'local:commits'): |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
947 commit = sorted(props[b'local:commits'].values())[0] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
948 meta = {} |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
949 if b'author' in commit and b'authorEmail' in commit: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
950 meta[b'user'] = b'%s <%s>' % (commit[b'author'], |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
951 commit[b'authorEmail']) |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
952 if b'time' in commit: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
953 meta[b'date'] = b'%d 0' % commit[b'time'] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
954 if b'branch' in commit: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
955 meta[b'branch'] = commit[b'branch'] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
956 node = commit.get(b'commit', commit.get(b'rev')) |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
957 if node: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
958 meta[b'node'] = node |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
959 if len(commit.get(b'parents', ())) >= 1: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
960 meta[b'parent'] = commit[b'parents'][0] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
961 else: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
962 meta = {} |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
963 if b'date' not in meta and b'dateCreated' in diff: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
964 meta[b'date'] = b'%s 0' % diff[b'dateCreated'] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
965 if b'branch' not in meta and diff.get(b'branch'): |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
966 meta[b'branch'] = diff[b'branch'] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
967 if b'parent' not in meta and diff.get(b'sourceControlBaseRevision'): |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
968 meta[b'parent'] = diff[b'sourceControlBaseRevision'] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42284
diff
changeset
|
969 return meta |
33441
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
970 |
33852
75fdaf851e83
phabricator: change "readpatch" to be more flexible
Jun Wu <quark@fb.com>
parents:
33808
diff
changeset
|
971 def readpatch(repo, drevs, write): |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
972 """generate plain-text patch readable by 'hg import' |
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
973 |
33852
75fdaf851e83
phabricator: change "readpatch" to be more flexible
Jun Wu <quark@fb.com>
parents:
33808
diff
changeset
|
974 write is usually ui.write. drevs is what "querydrev" returns, results of |
75fdaf851e83
phabricator: change "readpatch" to be more flexible
Jun Wu <quark@fb.com>
parents:
33808
diff
changeset
|
975 "differential.query". |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
976 """ |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
977 # Prefetch hg:meta property for all diffs |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
978 diffids = sorted(set(max(int(v) for v in drev[b'diffs']) for drev in drevs)) |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
979 diffs = callconduit(repo.ui, b'differential.querydiffs', {b'ids': diffids}) |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
980 |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
981 # Generate patch for each drev |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
982 for drev in drevs: |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
983 repo.ui.note(_(b'reading D%s\n') % drev[b'id']) |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
984 |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
985 diffid = max(int(v) for v in drev[b'diffs']) |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
986 body = callconduit(repo.ui, b'differential.getrawdiff', |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
987 {b'diffID': diffid}) |
33268
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
988 desc = getdescfromdrev(drev) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
989 header = b'# HG changeset patch\n' |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
990 |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
991 # Try to preserve metadata from hg:meta property. Write hg patch |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
992 # headers that can be read by the "import" command. See patchheadermap |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
993 # and extract in mercurial/patch.py for supported headers. |
41907
59bae59b7498
py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41906
diff
changeset
|
994 meta = getdiffmeta(diffs[b'%d' % diffid]) |
33441
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
995 for k in _metanamemap.keys(): |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
996 if k in meta: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
997 header += b'# %s %s\n' % (_metanamemap[k], meta[k]) |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
998 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
999 content = b'%s%s\n%s' % (header, desc, body) |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
1000 write(content) |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
1001 |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
1002 @vcrcommand(b'phabread', |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1003 [(b'', b'stack', False, _(b'read dependencies'))], |
41076
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40435
diff
changeset
|
1004 _(b'DREVSPEC [OPTIONS]'), |
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40435
diff
changeset
|
1005 helpcategory=command.CATEGORY_IMPORT_EXPORT) |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1006 def phabread(ui, repo, spec, **opts): |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
1007 """print patches from Phabricator suitable for importing |
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
1008 |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1009 DREVSPEC could be a Differential Revision identity, like ``D123``, or just |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1010 the number ``123``. It could also have common operators like ``+``, ``-``, |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1011 ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1012 select a stack. |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1013 |
33854
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
1014 ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision`` |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
1015 could be used to filter patches by status. For performance reason, they |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
1016 only represent a subset of non-status selections and cannot be used alone. |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
1017 |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1018 For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude |
33854
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
1019 D2 and D4. ``:D9 & needsreview`` selects "Needs Review" revisions in a |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33853
diff
changeset
|
1020 stack up to D9. |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
1021 |
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
1022 If --stack is given, follow dependencies information and read all patches. |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1023 It is equivalent to the ``:`` operator. |
33202
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33201
diff
changeset
|
1024 """ |
41975
51ba9fbcca52
py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41955
diff
changeset
|
1025 opts = pycompat.byteskwargs(opts) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1026 if opts.get(b'stack'): |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1027 spec = b':(%s)' % spec |
33853
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33852
diff
changeset
|
1028 drevs = querydrev(repo, spec) |
33852
75fdaf851e83
phabricator: change "readpatch" to be more flexible
Jun Wu <quark@fb.com>
parents:
33808
diff
changeset
|
1029 readpatch(repo, drevs, ui.write) |
33855
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1030 |
39666
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38983
diff
changeset
|
1031 @vcrcommand(b'phabupdate', |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1032 [(b'', b'accept', False, _(b'accept revisions')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1033 (b'', b'reject', False, _(b'reject revisions')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1034 (b'', b'abandon', False, _(b'abandon revisions')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1035 (b'', b'reclaim', False, _(b'reclaim revisions')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1036 (b'm', b'comment', b'', _(b'comment on the last revision')), |
41076
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40435
diff
changeset
|
1037 ], _(b'DREVSPEC [OPTIONS]'), |
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40435
diff
changeset
|
1038 helpcategory=command.CATEGORY_IMPORT_EXPORT) |
33855
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1039 def phabupdate(ui, repo, spec, **opts): |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1040 """update Differential Revision in batch |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1041 |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1042 DREVSPEC selects revisions. See :hg:`help phabread` for its usage. |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1043 """ |
41975
51ba9fbcca52
py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41955
diff
changeset
|
1044 opts = pycompat.byteskwargs(opts) |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1045 flags = [n for n in b'accept reject abandon reclaim'.split() if opts.get(n)] |
33855
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1046 if len(flags) > 1: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1047 raise error.Abort(_(b'%s cannot be used together') % b', '.join(flags)) |
33855
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1048 |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1049 actions = [] |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1050 for f in flags: |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1051 actions.append({b'type': f, b'value': b'true'}) |
33855
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1052 |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1053 drevs = querydrev(repo, spec) |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1054 for i, drev in enumerate(drevs): |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1055 if i + 1 == len(drevs) and opts.get(b'comment'): |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1056 actions.append({b'type': b'comment', b'value': opts[b'comment']}) |
33855
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33854
diff
changeset
|
1057 if actions: |
41902
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41716
diff
changeset
|
1058 params = {b'objectIdentifier': drev[b'phid'], |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1059 b'transactions': actions} |
42450
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42449
diff
changeset
|
1060 callconduit(ui, b'differential.revision.edit', params) |
35722
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1061 |
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1062 templatekeyword = registrar.templatekeyword() |
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1063 |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1064 @templatekeyword(b'phabreview', requires={b'ctx'}) |
36543
7b74afec6772
templatekw: switch non-showlist template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents:
35722
diff
changeset
|
1065 def template_review(context, mapping): |
35722
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1066 """:phabreview: Object describing the review for this changeset. |
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1067 Has attributes `url` and `id`. |
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1068 """ |
38398
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38342
diff
changeset
|
1069 ctx = context.resource(mapping, b'ctx') |
35722
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1070 m = _differentialrevisiondescre.search(ctx.description()) |
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1071 if m: |
39670
4057e38bba76
phabricator: fix templating bug by using hybriddict
Augie Fackler <raf@durin42.com>
parents:
39668
diff
changeset
|
1072 return templateutil.hybriddict({ |
41910
16d050678047
py3: use r'' for group name arguments to MatchObjects in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41909
diff
changeset
|
1073 b'url': m.group(r'url'), |
41911
2b21c7fbb3a1
py3: use % instead of .format() on a bytestring
Ian Moody <moz-ian@perix.co.uk>
parents:
41910
diff
changeset
|
1074 b'id': b"D%s" % m.group(r'id'), |
39670
4057e38bba76
phabricator: fix templating bug by using hybriddict
Augie Fackler <raf@durin42.com>
parents:
39668
diff
changeset
|
1075 }) |
41164
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1076 else: |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1077 tags = ctx.repo().nodetags(ctx.node()) |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1078 for t in tags: |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1079 if _differentialrevisiontagre.match(t): |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1080 url = ctx.repo().ui.config(b'phabricator', b'url') |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1081 if not url.endswith(b'/'): |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1082 url += b'/' |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1083 url += t |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1084 |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1085 return templateutil.hybriddict({ |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1086 b'url': url, |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1087 b'id': t, |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1088 }) |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1089 return None |