Mercurial > hg
annotate hgext/phabricator.py @ 42917:e26c2440a030 stable
phabricator: don't abort if property writing fails during amending
Currently if one of the writediffproperty calls fails due to network issues
during the amending of commit messages to include the Diff. Rev. line, the
transaction is aborted and rolled back. This means that the associations
between the commits and the DREVs are lost for any already amended commits
because the removal of the local tags isn't covered by the rollback.
Differential Revision: https://phab.mercurial-scm.org/D6835
author | Ian Moody <moz-ian@perix.co.uk> |
---|---|
date | Sat, 07 Sep 2019 14:35:21 +0100 |
parents | c17e6a3e7356 |
children | 6fb281f39c25 |
rev | line source |
---|---|
33198 | 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. | |
39655
87539f615b87
phabricator: mark extension as experimental for now
Augie Fackler <raf@durin42.com>
parents:
39654
diff
changeset
|
7 """simple Phabricator integration (EXPERIMENTAL) |
33198 | 8 |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
9 This extension provides a ``phabsend`` command which sends a stack of |
33975 | 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. | |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
13 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
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:
33198
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:
33198
diff
changeset
|
17 |
33198 | 18 Config:: |
19 | |
20 [phabricator] | |
21 # Phabricator URL | |
22 url = https://phab.example.com/ | |
23 | |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
diff
changeset
|
25 # callsign is "FOO". |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
26 callsign = FOO |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
27 |
34064
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34063
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:
34063
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:
34063
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:
34063
diff
changeset
|
31 # the internal library. |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34063
diff
changeset
|
32 curlcmd = curl --connect-timeout 2 --retry 3 --silent |
36787
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36514
diff
changeset
|
33 |
37996
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
37976
diff
changeset
|
34 [auth] |
37997
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
37996
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:
37996
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:
37996
diff
changeset
|
37 |
36787
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36514
diff
changeset
|
38 # API token. Get it from https://$HOST/conduit/login/ |
37996
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
37976
diff
changeset
|
39 example.phabtoken = cli-xxxxxxxxxxxxxxxxxxxxxxxxxxxx |
33198 | 40 """ |
41 | |
42 from __future__ import absolute_import | |
43 | |
41080
9d35ae3d9999
phabricator: ensure that the return of urlopener.open() is closed
Matt Harbison <matt_harbison@yahoo.com>
parents:
41078
diff
changeset
|
44 import contextlib |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
45 import itertools |
33198 | 46 import json |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
47 import operator |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
48 import re |
33198 | 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 |
33198 | 51 from mercurial.i18n import _ |
52 from mercurial import ( | |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
53 cmdutil, |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
54 context, |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
55 encoding, |
33198 | 56 error, |
37997
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
37996
diff
changeset
|
57 httpconnection as httpconnectionmod, |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
58 mdiff, |
33735
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33692
diff
changeset
|
59 obsutil, |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
60 parser, |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
61 patch, |
41163
0101a35deae2
phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents:
41080
diff
changeset
|
62 phases, |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
63 pycompat, |
33198 | 64 registrar, |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
65 scmutil, |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
66 smartset, |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
67 tags, |
42188
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
68 templatefilters, |
39654
4057e38bba76
phabricator: fix templating bug by using hybriddict
Augie Fackler <raf@durin42.com>
parents:
39652
diff
changeset
|
69 templateutil, |
33198 | 70 url as urlmod, |
71 util, | |
72 ) | |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36818
diff
changeset
|
73 from mercurial.utils import ( |
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36818
diff
changeset
|
74 procutil, |
37800
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37120
diff
changeset
|
75 stringutil, |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36818
diff
changeset
|
76 ) |
33198 | 77 |
39735
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39655
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:
39655
diff
changeset
|
79 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39655
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:
39655
diff
changeset
|
81 # leave the attribute unspecified. |
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39655
diff
changeset
|
82 testedwith = 'ships-with-hg-core' |
c0c703861b60
phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents:
39655
diff
changeset
|
83 |
33198 | 84 cmdtable = {} |
85 command = registrar.command(cmdtable) | |
86 | |
38042
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
87 configtable = {} |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
88 configitem = registrar.configitem(configtable) |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
89 |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
90 # developer config: phabricator.batchsize |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
91 configitem(b'phabricator', b'batchsize', |
38042
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
92 default=12, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
93 ) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
94 configitem(b'phabricator', b'callsign', |
38042
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
95 default=None, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
96 ) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
97 configitem(b'phabricator', b'curlcmd', |
38042
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
98 default=None, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
99 ) |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
100 # developer config: phabricator.repophid |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
101 configitem(b'phabricator', b'repophid', |
38042
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
102 default=None, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
103 ) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
104 configitem(b'phabricator', b'url', |
38042
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
105 default=None, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
106 ) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
107 configitem(b'phabsend', b'confirm', |
38042
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
108 default=False, |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
109 ) |
5a7cf42ba6ef
phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents:
37997
diff
changeset
|
110 |
34063 | 111 colortable = { |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
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:
38336
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:
38336
diff
changeset
|
115 b'phabricator.desc': b'', |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
117 b'phabricator.node': b'', |
34063 | 118 } |
119 | |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
120 _VCR_FLAGS = [ |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
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:
38945
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:
38945
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:
38945
diff
changeset
|
124 b' (ADVANCED)' |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
125 )), |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
126 ] |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
127 |
42435
16312ea45a8b
phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42434
diff
changeset
|
128 def vcrcommand(name, flags, spec, helpcategory=None, optionalrepo=False): |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
129 fullflags = flags + _VCR_FLAGS |
42268
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42258
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:
42258
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:
42258
diff
changeset
|
132 return False |
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42258
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:
42258
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:
42258
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:
42258
diff
changeset
|
136 |
42443
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42435
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:
42435
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:
42435
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:
42435
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:
42435
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:
42435
diff
changeset
|
142 ) |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42435
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:
42435
diff
changeset
|
144 |
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42435
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:
42435
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:
42435
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:
42435
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:
42435
diff
changeset
|
149 |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
150 def decorate(fn): |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
151 def inner(*args, **kwargs): |
41898
2bad8f92cebf
py3: use fsencode for vcr recording paths and strings for custom_patches args
Ian Moody <moz-ian@perix.co.uk>
parents:
41897
diff
changeset
|
152 cassette = pycompat.fsdecode(kwargs.pop(r'test_vcr', None)) |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
153 if cassette: |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
154 import hgdemandimport |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
155 with hgdemandimport.deactivated(): |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
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:
38945
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', |
42443
d3c81439e2ee
phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents:
42435
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:
42435
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=[ |
41898
2bad8f92cebf
py3: use fsencode for vcr recording paths and strings for custom_patches args
Ian Moody <moz-ian@perix.co.uk>
parents:
41897
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:
41897
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:
41897
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 ]) |
42268
af13e2088f77
phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents:
42258
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:
42258
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) |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
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:
38945
diff
changeset
|
172 inner.__name__ = fn.__name__ |
40546
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__ |
42435
16312ea45a8b
phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42434
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:
42434
diff
changeset
|
175 optionalrepo=optionalrepo)(inner) |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
176 return decorate |
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
177 |
33198 | 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): | |
41017
d7d3164e6a31
phabricator: properly encode boolean types in the request body
Matt Harbison <matt_harbison@yahoo.com>
parents:
40546
diff
changeset
|
187 if isinstance(obj, bool): |
d7d3164e6a31
phabricator: properly encode boolean types in the request body
Matt Harbison <matt_harbison@yahoo.com>
parents:
40546
diff
changeset
|
188 obj = {True: b'true', False: b'false'}[obj] # Python -> PHP form |
41900
47125193bad0
py3: convert indexes into bytes when enumerating lists in urlencodenested
Ian Moody <moz-ian@perix.co.uk>
parents:
41899
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:
41899
diff
changeset
|
190 items = {list: lister, dict: lambda x: x.items()}.get(type(obj)) |
33198 | 191 if items is None: |
192 flatparams[prefix] = obj | |
193 else: | |
194 for k, v in items(obj): | |
195 if prefix: | |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
196 process(b'%s[%s]' % (prefix, k), v) |
33198 | 197 else: |
198 process(k, v) | |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
199 process(b'', params) |
33198 | 200 return util.urlreq.urlencode(flatparams) |
201 | |
42433
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42431
diff
changeset
|
202 def readurltoken(ui): |
37996
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
37976
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:
37976
diff
changeset
|
204 |
37997
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
37996
diff
changeset
|
205 Currently read from [auth] config section. In the future, it might |
37996
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
37976
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:
37976
diff
changeset
|
207 """ |
42433
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42431
diff
changeset
|
208 url = ui.config(b'phabricator', b'url') |
37996
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
37976
diff
changeset
|
209 if not url: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
211 % (b'phabricator', b'url')) |
37996
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
37976
diff
changeset
|
212 |
42433
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42431
diff
changeset
|
213 res = httpconnectionmod.readauthforuri(ui, url, util.url(url).user) |
37997
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
37996
diff
changeset
|
214 token = None |
37996
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
37976
diff
changeset
|
215 |
37997
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
37996
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:
37996
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:
37996
diff
changeset
|
218 |
42433
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42431
diff
changeset
|
219 ui.debug(b"using auth.%s.* for authentication\n" % group) |
37997
71cf20d47f25
phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents:
37996
diff
changeset
|
220 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
221 token = auth.get(b'phabtoken') |
37996
0fa050bc68cb
phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents:
37976
diff
changeset
|
222 |
36787
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36514
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:
39735
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:
39735
diff
changeset
|
225 % (url,)) |
36787
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36514
diff
changeset
|
226 |
4397909f82d3
phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents:
36514
diff
changeset
|
227 return url, token |
33198 | 228 |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
229 def callconduit(ui, name, params): |
33198 | 230 """call Conduit API, params is a dict. return json.loads result, or None""" |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
231 host, token = readurltoken(ui) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
232 url, authinfo = util.url(b'/'.join([host, b'api', name])).authinfo() |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
233 ui.debug(b'Conduit Call: %s %s\n' % (url, pycompat.byterepr(params))) |
33198 | 234 params = params.copy() |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
235 params[b'api.token'] = token |
34064
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34063
diff
changeset
|
236 data = urlencodenested(params) |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
237 curlcmd = ui.config(b'phabricator', b'curlcmd') |
34064
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34063
diff
changeset
|
238 if curlcmd: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
239 sin, sout = procutil.popen2(b'%s -d @- %s' |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36818
diff
changeset
|
240 % (curlcmd, procutil.shellquote(url))) |
34064
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34063
diff
changeset
|
241 sin.write(data) |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34063
diff
changeset
|
242 sin.close() |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34063
diff
changeset
|
243 body = sout.read() |
8b659b7388c0
phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents:
34063
diff
changeset
|
244 else: |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
245 urlopener = urlmod.opener(ui, authinfo) |
41901
a98dabdb5a7b
py3: convert URL to str before passing it to request
Ian Moody <moz-ian@perix.co.uk>
parents:
41900
diff
changeset
|
246 request = util.urlreq.request(pycompat.strurl(url), data=data) |
41080
9d35ae3d9999
phabricator: ensure that the return of urlopener.open() is closed
Matt Harbison <matt_harbison@yahoo.com>
parents:
41078
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:
41078
diff
changeset
|
248 body = rsp.read() |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
249 ui.debug(b'Conduit Response: %s\n' % body) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
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:
41705
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:
41705
diff
changeset
|
252 else x, |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
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:
41705
diff
changeset
|
254 ) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
255 if parsed.get(b'error_code'): |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
256 msg = (_(b'Conduit Error (%s): %s') |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
257 % (parsed[b'error_code'], parsed[b'error_info'])) |
33198 | 258 raise error.Abort(msg) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
259 return parsed[b'result'] |
33198 | 260 |
42435
16312ea45a8b
phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42434
diff
changeset
|
261 @vcrcommand(b'debugcallconduit', [], _(b'METHOD'), optionalrepo=True) |
33198 | 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 """ | |
41971
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41970
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:
41970
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:
41970
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:
41970
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:
41970
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:
41970
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:
41970
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:
41970
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:
41970
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:
41970
diff
changeset
|
277 encoding.unifromlocal(x) if isinstance(x, bytes) else x, |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
278 callconduit(ui, name, params) |
41971
99e00e5c4746
py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41970
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:
41970
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:
41970
diff
changeset
|
281 ui.write(b'%s\n' % encoding.unitolocal(s)) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
282 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
283 def getrepophid(repo): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
diff
changeset
|
285 # developer config: phabricator.repophid |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
286 repophid = repo.ui.config(b'phabricator', b'repophid') |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
287 if repophid: |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
288 return repophid |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
289 callsign = repo.ui.config(b'phabricator', b'callsign') |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
290 if not callsign: |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
291 return None |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
292 query = callconduit(repo.ui, b'diffusion.repository.search', |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
293 {b'constraints': {b'callsigns': [callsign]}}) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
294 if len(query[b'data']) == 0: |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
295 return None |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
296 repophid = query[b'data'][0][b'phid'] |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
297 repo.ui.setconfig(b'phabricator', b'repophid', repophid) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
298 return repophid |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
299 |
41532
bd3f03d8cc9f
global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
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:
33200
diff
changeset
|
301 _differentialrevisiondescre = re.compile( |
41532
bd3f03d8cc9f
global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
302 br'^Differential Revision:\s*(?P<url>(?:.*)D(?P<id>[1-9][0-9]*))$', re.M) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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 |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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 |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33690
diff
changeset
|
310 be ``None``. |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
311 |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33690
diff
changeset
|
313 association information. |
33263
ed61189763ef
phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
314 |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33690
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:
33690
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:
33690
diff
changeset
|
318 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33690
diff
changeset
|
320 corresponding Differential Revision, and exist in the repo. |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
321 """ |
33442
3ab0d5767b54
phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents:
33441
diff
changeset
|
322 unfi = repo.unfiltered() |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
323 nodemap = unfi.changelog.nodemap |
33263
ed61189763ef
phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents:
33200
diff
changeset
|
324 |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
325 result = {} # {node: (oldnode?, lastdiff?, drev)} |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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 |
33735
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33692
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: |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33200
diff
changeset
|
338 |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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: |
41905
16d050678047
py3: use r'' for group name arguments to MatchObjects in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41904
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:
33200
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: |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
347 drevs = [drev for force, precs, drev in toconfirm.values()] |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
348 alldiffs = callconduit(unfi.ui, b'differential.querydiffs', |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
349 {b'revisionIDs': drevs}) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
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:
41705
diff
changeset
|
351 getdiffmeta(d).get(b'node', b'')) or None |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33690
diff
changeset
|
353 diffs = [d for d in alldiffs.values() |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
354 if int(d[b'revisionID']) == drev] |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
355 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
356 # "precursors" as known by Phabricator |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33690
diff
changeset
|
358 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33690
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:
33690
diff
changeset
|
361 if not force and not bool(phprecset & precset): |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
366 b'Differential history\n') % drev) |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
367 continue |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
368 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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:
33690
diff
changeset
|
370 # exists in the repo |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
371 oldnode = lastdiff = None |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
372 if diffs: |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
373 lastdiff = max(diffs, key=lambda d: int(d[b'id'])) |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
374 oldnode = getnode(lastdiff) |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
375 if oldnode and oldnode not in nodemap: |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
376 oldnode = None |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
377 |
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
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 |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
381 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
382 def getdiff(ctx, diffopts): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
diff
changeset
|
384 output = util.stringio() |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
diff
changeset
|
386 None, opts=diffopts): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
387 output.write(chunk) |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
388 return output.getvalue() |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
389 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
390 def creatediff(ctx): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
391 """create a Differential Diff""" |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
392 repo = ctx.repo() |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
393 repophid = getrepophid(repo) |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
394 # Create a "Differential Diff" via "differential.createrawdiff" API |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
395 params = {b'diff': getdiff(ctx, mdiff.diffopts(git=True, context=32767))} |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
396 if repophid: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
397 params[b'repositoryPHID'] = repophid |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
398 diff = callconduit(repo.ui, b'differential.createrawdiff', params) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
399 if not diff: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
400 raise error.Abort(_(b'cannot create diff for %s') % ctx) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
401 return diff |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
402 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
403 def writediffproperties(ctx, diff): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
diff
changeset
|
405 params = { |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
406 b'diff_id': diff[b'id'], |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
407 b'name': b'hg:meta', |
42188
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
408 b'data': templatefilters.json({ |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
409 b'user': ctx.user(), |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
410 b'date': b'%d %d' % ctx.date(), |
42198
d49ab47be8a6
phabricator: include branch in the diffproperty metadata
Ian Moody <moz-ian@perix.co.uk>
parents:
42189
diff
changeset
|
411 b'branch': ctx.branch(), |
42188
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
412 b'node': ctx.hex(), |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
413 b'parent': ctx.p1().hex(), |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
414 }), |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
415 } |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
416 callconduit(ctx.repo().ui, b'differential.setdiffproperty', params) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
417 |
37800
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37120
diff
changeset
|
418 params = { |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
419 b'diff_id': diff[b'id'], |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
420 b'name': b'local:commits', |
42188
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
421 b'data': templatefilters.json({ |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
422 ctx.hex(): { |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
423 b'author': stringutil.person(ctx.user()), |
289d82a070e9
phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents:
41971
diff
changeset
|
424 b'authorEmail': stringutil.email(ctx.user()), |
42189
c0e30c9ee5ba
phabricator: set local:commits time metadata as an int, not a string
Ian Moody <moz-ian@perix.co.uk>
parents:
42188
diff
changeset
|
425 b'time': int(ctx.date()[0]), |
42256
9421d7e12888
phabricator: include commit (node) and parent in the local:commits metadata
Ian Moody <moz-ian@perix.co.uk>
parents:
42200
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:
42200
diff
changeset
|
427 b'parents': [ctx.p1().hex()], |
42198
d49ab47be8a6
phabricator: include branch in the diffproperty metadata
Ian Moody <moz-ian@perix.co.uk>
parents:
42189
diff
changeset
|
428 b'branch': ctx.branch(), |
37800
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37120
diff
changeset
|
429 }, |
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37120
diff
changeset
|
430 }), |
6cf5f5b4eb57
phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents:
37120
diff
changeset
|
431 } |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
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:
37120
diff
changeset
|
433 |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
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:
42444
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:
42444
diff
changeset
|
436 comment=None): |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
437 """create or update a Differential Revision |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
438 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
439 If revid is None, create a new Differential Revision, otherwise update |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
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. |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
446 """ |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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: |
33976
27ff2a87d8c0
phabsend: detect patch change with larger context
Jun Wu <quark@fb.com>
parents:
33975
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 |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
458 transactions.append({b'type': b'update', b'value': diff[b'phid']}) |
42431
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42268
diff
changeset
|
459 if comment: |
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42268
diff
changeset
|
460 transactions.append({b'type': b'comment', b'value': comment}) |
33692
f100354cce52
phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents:
33691
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:
33691
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:
33691
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:
33691
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:
33691
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:
33691
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:
33691
diff
changeset
|
467 writediffproperties(ctx, diff) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
468 |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
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:
42444
diff
changeset
|
470 if parentrevphid: |
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
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:
42444
diff
changeset
|
472 b'value': [parentrevphid]}) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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 |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
diff
changeset
|
478 desc = ctx.description() |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
479 info = callconduit(repo.ui, b'differential.parsecommitmessage', |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
480 {b'corpus': desc}) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
481 for k, v in info[b'fields'].items(): |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
483 transactions.append({b'type': k, b'value': v}) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
484 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
485 params = {b'transactions': transactions} |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
486 if revid is not None: |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
487 # Update an existing Differential Revision |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
488 params[b'objectIdentifier'] = revid |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
489 |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
490 revision = callconduit(repo.ui, b'differential.revision.edit', params) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
491 if not revision: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
492 raise error.Abort(_(b'cannot create revision for %s') % ctx) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
493 |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
494 return revision, diff |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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""" |
41705
570e62f1dcf2
phabricator: make user searches case-insensitive
Julien Cristau <jcristau@mozilla.com>
parents:
41532
diff
changeset
|
498 names = [name.lower() for name in names] |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
499 query = {b'constraints': {b'usernames': names}} |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
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. |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
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:
41705
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: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
508 % b' '.join(sorted(unresolved))) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
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 |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
511 @vcrcommand(b'phabsend', |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
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:
38336
diff
changeset
|
514 (b'', b'reviewer', [], _(b'specify reviewers')), |
42444
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42443
diff
changeset
|
515 (b'', b'blocker', [], _(b'specify blocking reviewers')), |
42431
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42268
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:
42268
diff
changeset
|
517 _(b'add a comment to Revisions with new/updated Diffs')), |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
518 (b'', b'confirm', None, _(b'ask for confirmation before sending'))], |
41073
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40546
diff
changeset
|
519 _(b'REV [OPTIONS]'), |
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40546
diff
changeset
|
520 helpcategory=command.CATEGORY_IMPORT_EXPORT) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
521 def phabsend(ui, repo, *revs, **opts): |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
522 """upload changesets to Phabricator |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
523 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
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:
33198
diff
changeset
|
526 revset. |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
527 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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:
33198
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:
33198
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:
33198
diff
changeset
|
531 existing Differential Revision, or create a new one. |
33690
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
532 |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
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:
33785
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:
33785
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:
33785
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:
33785
diff
changeset
|
537 |
33690
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 |
33974
45a8cd74de4e
phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents:
33834
diff
changeset
|
540 behaviour:: |
33690
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
541 |
33974
45a8cd74de4e
phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents:
33834
diff
changeset
|
542 [phabsend] |
45a8cd74de4e
phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents:
33834
diff
changeset
|
543 confirm = true |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
544 |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
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:
33785
diff
changeset
|
546 update an existing Differential Revision, or create a new one. |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
547 """ |
41970
51ba9fbcca52
py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41950
diff
changeset
|
548 opts = pycompat.byteskwargs(opts) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
549 revs = list(revs) + opts.get(b'rev', []) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
550 revs = scmutil.revrange(repo, revs) |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
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: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
554 if opts.get(b'amend'): |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
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 |
33978
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33977
diff
changeset
|
557 # {newnode: (oldnode, olddiff, olddrev} |
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33977
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:
33977
diff
changeset
|
559 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
561 confirm |= bool(opts.get(b'confirm')) |
33690
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
562 if confirm: |
33978
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33977
diff
changeset
|
563 confirmed = _confirmbeforesend(repo, revs, oldmap) |
33690
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
564 if not confirmed: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
565 raise error.Abort(_(b'phabsend cancelled')) |
33690
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 = [] |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
568 reviewers = opts.get(b'reviewer', []) |
42444
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42443
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:
42443
diff
changeset
|
570 phids = [] |
33498
b7a75b9a3386
phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents:
33443
diff
changeset
|
571 if reviewers: |
42444
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42443
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:
42443
diff
changeset
|
573 if blockers: |
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42443
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:
42443
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:
42443
diff
changeset
|
576 )) |
f33d3ee110da
phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents:
42443
diff
changeset
|
577 if phids: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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 |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
580 drevids = [] # [int] |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
581 diffmap = {} # {newnode: diff} |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
582 |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
diff
changeset
|
583 # Send patches one by one so we know their Differential Revision PHIDs and |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
584 # can provide dependency relationship |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
diff
changeset
|
585 lastrevphid = None |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
586 for rev in revs: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
587 ui.debug(b'sending rev %d\n' % rev) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
588 ctx = repo[rev] |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
589 |
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
590 # Get Differential Revision ID |
33691
1664406a44d9
phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents:
33690
diff
changeset
|
591 oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None)) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
592 if oldnode != ctx.node() or opts.get(b'amend'): |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
593 # Create or update Differential Revision |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
594 revision, diff = createdifferentialrevision( |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
diff
changeset
|
595 ctx, revid, lastrevphid, oldnode, olddiff, actions, |
42431
29528c4235a1
phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents:
42268
diff
changeset
|
596 opts.get(b'comment')) |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
597 diffmap[ctx.node()] = diff |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
598 newrevid = int(revision[b'object'][b'id']) |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
diff
changeset
|
599 newrevphid = revision[b'object'][b'phid'] |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
600 if revid: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
601 action = b'updated' |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
602 else: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
603 action = b'created' |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
604 |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
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:
33785
diff
changeset
|
606 # does not have it already |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
607 m = _differentialrevisiondescre.search(ctx.description()) |
41905
16d050678047
py3: use r'' for group name arguments to MatchObjects in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41904
diff
changeset
|
608 if not m or int(m.group(r'id')) != newrevid: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
609 tagname = b'D%d' % newrevid |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
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:
33785
diff
changeset
|
611 date=None, local=True) |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
612 else: |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
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:
42444
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:
42444
diff
changeset
|
615 newrevphid = querydrev(repo, str(revid))[0][b'phid'] |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
616 newrevid = revid |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
617 action = b'skipped' |
33199
228ad1e58a85
phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents:
33198
diff
changeset
|
618 |
34063 | 619 actiondesc = ui.label( |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
620 {b'created': _(b'created'), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
621 b'skipped': _(b'skipped'), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
623 b'phabricator.action.%s' % action) |
41904
634b56b54e7c
py3: use %d instead of %s when formatting an int into a byte string
Ian Moody <moz-ian@perix.co.uk>
parents:
41903
diff
changeset
|
624 drevdesc = ui.label(b'D%d' % newrevid, b'phabricator.drev') |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
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:
38336
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:
38336
diff
changeset
|
628 desc)) |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
629 drevids.append(newrevid) |
42449
c19d259fd6ad
phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents:
42444
diff
changeset
|
630 lastrevphid = newrevphid |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
631 |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
632 # Update commit messages and remove tags |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
633 if opts.get(b'amend'): |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
634 unfi = repo.unfiltered() |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
635 drevs = callconduit(ui, b'differential.query', {b'ids': drevids}) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
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:
38336
diff
changeset
|
637 wnode = unfi[b'.'].node() |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
638 mapping = {} # {oldnode: [newnode]} |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
639 for i, rev in enumerate(revs): |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
640 old = unfi[rev] |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
641 drevid = drevids[i] |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
642 drev = [d for d in drevs if int(d[b'id']) == drevid][0] |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
643 newdesc = getdescfromdrev(drev) |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
644 # Make sure commit message contain "Differential Revision" |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
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:
41080
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:
41080
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:
41080
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:
41080
diff
changeset
|
649 continue |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
650 parents = [ |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
651 mapping.get(old.p1().node(), (old.p1(),))[0], |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
652 mapping.get(old.p2().node(), (old.p2(),))[0], |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
653 ] |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
654 new = context.metadataonlyctx( |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
655 repo, old, parents=parents, text=newdesc, |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
656 user=old.user(), date=old.date(), extra=old.extra()) |
38336
bb7e3c6ef592
phabricator: preserve the phase when amending in the Differential fields
Matt Harbison <matt_harbison@yahoo.com>
parents:
38042
diff
changeset
|
657 |
38423
32fba6fe893d
scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38392
diff
changeset
|
658 newnode = new.commit() |
38336
bb7e3c6ef592
phabricator: preserve the phase when amending in the Differential fields
Matt Harbison <matt_harbison@yahoo.com>
parents:
38042
diff
changeset
|
659 |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
660 mapping[old.node()] = [newnode] |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
661 # Update diff property |
42917
e26c2440a030
phabricator: don't abort if property writing fails during amending
Ian Moody <moz-ian@perix.co.uk>
parents:
42618
diff
changeset
|
662 # If it fails just warn and keep going, otherwise the DREV |
e26c2440a030
phabricator: don't abort if property writing fails during amending
Ian Moody <moz-ian@perix.co.uk>
parents:
42618
diff
changeset
|
663 # associations will be lost |
e26c2440a030
phabricator: don't abort if property writing fails during amending
Ian Moody <moz-ian@perix.co.uk>
parents:
42618
diff
changeset
|
664 try: |
e26c2440a030
phabricator: don't abort if property writing fails during amending
Ian Moody <moz-ian@perix.co.uk>
parents:
42618
diff
changeset
|
665 writediffproperties(unfi[newnode], diffmap[old.node()]) |
e26c2440a030
phabricator: don't abort if property writing fails during amending
Ian Moody <moz-ian@perix.co.uk>
parents:
42618
diff
changeset
|
666 except util.urlerr.urlerror: |
e26c2440a030
phabricator: don't abort if property writing fails during amending
Ian Moody <moz-ian@perix.co.uk>
parents:
42618
diff
changeset
|
667 ui.warn(b'Failed to update metadata for D%s\n' % drevid) |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
668 # Remove local tags since it's no longer necessary |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
669 tagname = b'D%d' % drevid |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
670 if tagname in repo.tags(): |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
671 tags.tag(repo, tagname, nullid, message=None, user=None, |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
672 date=None, local=True) |
38423
32fba6fe893d
scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents:
38392
diff
changeset
|
673 scmutil.cleanupnodes(repo, mapping, b'phabsend', fixphase=True) |
33787
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
674 if wnode in mapping: |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
675 unfi.setparents(mapping[wnode][0]) |
fa3aa6c98bb7
phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents:
33785
diff
changeset
|
676 |
33264
266321579c68
phabricator: add node and p1 to hg:meta property
Jun Wu <quark@fb.com>
parents:
33263
diff
changeset
|
677 # 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
|
678 # consistent with "hg export" output. |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
679 _metanamemap = util.sortdict([(b'user', b'User'), (b'date', b'Date'), |
42258
231334c1ee96
phabricator: include branch in the phabread output
Ian Moody <moz-ian@perix.co.uk>
parents:
42257
diff
changeset
|
680 (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:
42257
diff
changeset
|
681 (b'parent', b'Parent ')]) |
33264
266321579c68
phabricator: add node and p1 to hg:meta property
Jun Wu <quark@fb.com>
parents:
33263
diff
changeset
|
682 |
33978
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33977
diff
changeset
|
683 def _confirmbeforesend(repo, revs, oldmap): |
42433
500b64c5d991
phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42431
diff
changeset
|
684 url, token = readurltoken(repo.ui) |
33690
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
685 ui = repo.ui |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
686 for rev in revs: |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
687 ctx = repo[rev] |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
688 desc = ctx.description().splitlines()[0] |
33978
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33977
diff
changeset
|
689 oldnode, olddiff, drevid = oldmap.get(ctx.node(), (None, None, None)) |
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33977
diff
changeset
|
690 if drevid: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
691 drevdesc = ui.label(b'D%s' % drevid, b'phabricator.drev') |
33978
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33977
diff
changeset
|
692 else: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
693 drevdesc = ui.label(_(b'NEW'), b'phabricator.drev') |
33978
088598153aa2
phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents:
33977
diff
changeset
|
694 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
695 ui.write(_(b'%s - %s: %s\n') |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
696 % (drevdesc, |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
697 ui.label(bytes(ctx), b'phabricator.node'), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
698 ui.label(desc, b'phabricator.desc'))) |
33690
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
699 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
700 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:
38336
diff
changeset
|
701 b'$$ &Yes $$ &No') % url): |
33690
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
702 return False |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
703 |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
704 return True |
40cfe3197bc1
phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents:
33601
diff
changeset
|
705 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
706 _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:
38336
diff
changeset
|
707 b'abandoned'} |
33833
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
708 |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
709 def _getstatusname(drev): |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
710 """get normalized status name from a Differential Revision""" |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
711 return drev[b'statusName'].replace(b' ', b'').lower() |
33833
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
712 |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
713 # 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:
33831
diff
changeset
|
714 # +, and -. |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
715 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
716 _elements = { |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
717 # token-type: binding-strength, primary, prefix, infix, suffix |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
718 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:
38336
diff
changeset
|
719 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:
38336
diff
changeset
|
720 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:
38336
diff
changeset
|
721 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:
38336
diff
changeset
|
722 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:
38336
diff
changeset
|
723 b')': (0, None, None, None, None), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
724 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:
38336
diff
changeset
|
725 b'end': (0, None, None, None, None), |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
726 } |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
727 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
728 def _tokenize(text): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
729 view = memoryview(text) # zero-copy slice |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
730 special = b'():+-& ' |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
731 pos = 0 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
732 length = len(text) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
733 while pos < length: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
734 symbol = b''.join(itertools.takewhile(lambda ch: ch not in special, |
41950
e7b84ffb06d9
py3: use pycompat.iterbytestr to convert memoryview slice to bytestring
Ian Moody <moz-ian@perix.co.uk>
parents:
41906
diff
changeset
|
735 pycompat.iterbytestr(view[pos:]))) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
736 if symbol: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
737 yield (b'symbol', symbol, pos) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
738 pos += len(symbol) |
33833
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
739 else: # special char, ignore space |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
740 if text[pos] != b' ': |
33833
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
741 yield (text[pos], None, pos) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
742 pos += 1 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
743 yield (b'end', None, pos) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
744 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
745 def _parse(text): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
746 tree, pos = parser.parser(_elements).parse(_tokenize(text)) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
747 if pos != len(text): |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
748 raise error.ParseError(b'invalid token', pos) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
749 return tree |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
750 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
751 def _parsedrev(symbol): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
752 """str -> int or None, ex. 'D45' -> 45; '12' -> 12; 'x' -> None""" |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
753 if symbol.startswith(b'D') and symbol[1:].isdigit(): |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
754 return int(symbol[1:]) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
755 if symbol.isdigit(): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
756 return int(symbol) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
757 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
758 def _prefetchdrevs(tree): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
759 """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:
33831
diff
changeset
|
760 drevs = set() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
761 ancestordrevs = set() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
762 op = tree[0] |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
763 if op == b'symbol': |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
764 r = _parsedrev(tree[1]) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
765 if r: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
766 drevs.add(r) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
767 elif op == b'ancestors': |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
768 r, a = _prefetchdrevs(tree[1]) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
769 drevs.update(r) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
770 ancestordrevs.update(r) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
771 ancestordrevs.update(a) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
772 else: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
773 for t in tree[1:]: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
774 r, a = _prefetchdrevs(t) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
775 drevs.update(r) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
776 ancestordrevs.update(a) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
777 return drevs, ancestordrevs |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
778 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
779 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
|
780 """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
|
781 |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
782 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:
33831
diff
changeset
|
783 for details. |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
784 |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
785 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
|
786 |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
787 { |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
788 "id": "2", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
789 "phid": "PHID-DREV-672qvysjcczopag46qty", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
790 "title": "example", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
791 "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
|
792 "dateCreated": "1499181406", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
793 "dateModified": "1499182103", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
794 "authorPHID": "PHID-USER-tv3ohwc4v4jeu34otlye", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
795 "status": "0", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
796 "statusName": "Needs Review", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
797 "properties": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
798 "branch": null, |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
799 "summary": "", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
800 "testPlan": "", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
801 "lineCount": "2", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
802 "activeDiffPHID": "PHID-DIFF-xoqnjkobbm6k4dk6hi72", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
803 "diffs": [ |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
804 "3", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
805 "4", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
806 ], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
807 "commits": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
808 "reviewers": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
809 "ccs": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
810 "hashes": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
811 "auxiliary": { |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
812 "phabricator:projects": [], |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
813 "phabricator:depends-on": [ |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
814 "PHID-DREV-gbapp366kutjebt7agcd" |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
815 ] |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
816 }, |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
817 "repositoryPHID": "PHID-REPO-hub2hx62ieuqeheznasv", |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
818 "sourcePath": null |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
819 } |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
820 """ |
33269
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
821 def fetch(params): |
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
822 """params -> single drev or None""" |
41902
59bae59b7498
py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41901
diff
changeset
|
823 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
|
824 if key in prefetched: |
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
825 return prefetched[key] |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
826 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
|
827 # Fill prefetched with the result |
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
828 for drev in drevs: |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
829 prefetched[drev[b'phid']] = drev |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
830 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
|
831 if key not in prefetched: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
832 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:
38336
diff
changeset
|
833 % params) |
33269
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
834 return prefetched[key] |
ead6749354e1
phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents:
33268
diff
changeset
|
835 |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
836 def getstack(topdrevids): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
837 """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:
33831
diff
changeset
|
838 visited = set() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
839 result = [] |
41902
59bae59b7498
py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41901
diff
changeset
|
840 queue = [{b'ids': [i]} for i in topdrevids] |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
841 while queue: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
842 params = queue.pop() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
843 drev = fetch(params) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
844 if drev[b'id'] in visited: |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
845 continue |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
846 visited.add(drev[b'id']) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
847 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:
41705
diff
changeset
|
848 auxiliary = drev.get(b'auxiliary', {}) |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
849 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
|
850 for phid in depends: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
851 queue.append({b'phids': [phid]}) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
852 result.reverse() |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
853 return smartset.baseset(result) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
854 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
855 # Initialize prefetch cache |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
856 prefetched = {} # {id or phid: drev} |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
857 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
858 tree = _parse(spec) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
859 drevs, ancestordrevs = _prefetchdrevs(tree) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
860 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
861 # developer config: phabricator.batchsize |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
862 batchsize = repo.ui.configint(b'phabricator', b'batchsize') |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
863 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
864 # Prefetch Differential Revisions in batch |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
865 tofetch = set(drevs) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
866 for r in ancestordrevs: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
867 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:
33831
diff
changeset
|
868 if drevs: |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
869 fetch({b'ids': list(tofetch)}) |
33833
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
870 validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs)) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
871 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
872 # Walk through the tree, return smartsets |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
873 def walk(tree): |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
874 op = tree[0] |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
875 if op == b'symbol': |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
876 drev = _parsedrev(tree[1]) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
877 if drev: |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
878 return smartset.baseset([drev]) |
33833
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
879 elif tree[1] in _knownstatusnames: |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
880 drevs = [r for r in validids |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
881 if _getstatusname(prefetched[r]) == tree[1]] |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
882 return smartset.baseset(drevs) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
883 else: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
884 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:
38336
diff
changeset
|
885 elif op in {b'and_', b'add', b'sub'}: |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
886 assert len(tree) == 3 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
887 return getattr(operator, op)(walk(tree[1]), walk(tree[2])) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
888 elif op == b'group': |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
889 return walk(tree[1]) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
890 elif op == b'ancestors': |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
891 return getstack(walk(tree[1])) |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
892 else: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
893 raise error.ProgrammingError(b'illegal tree: %r' % tree) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
894 |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
895 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
|
896 |
33268
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
897 def getdescfromdrev(drev): |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
898 """get description (commit message) from "Differential Revision" |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
899 |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
900 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
|
901 about limited fields: title, summary, test plan, and URL. |
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
902 """ |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
903 title = drev[b'title'] |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
904 summary = drev[b'summary'].rstrip() |
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
905 testplan = drev[b'testPlan'].rstrip() |
33268
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
906 if testplan: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
907 testplan = b'Test Plan:\n%s' % testplan |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
908 uri = b'Differential Revision: %s' % drev[b'uri'] |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
909 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
|
910 |
33441
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
911 def getdiffmeta(diff): |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
912 """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
|
913 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
914 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
|
915 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
916 "properties": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
917 "hg:meta": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
918 "date": "1499571514 25200", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
919 "node": "98c08acae292b2faf60a279b4189beb6cff1414d", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
920 "user": "Foo Bar <foo@example.com>", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
921 "parent": "6d0abad76b30e4724a37ab8721d630394070fe16" |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
922 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
923 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
924 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
925 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
|
926 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
927 "properties": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
928 "local:commits": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
929 "98c08acae292b2faf60a279b4189beb6cff1414d": { |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
930 "author": "Foo Bar", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
931 "time": 1499546314, |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
932 "branch": "default", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
933 "tag": "", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
934 "commit": "98c08acae292b2faf60a279b4189beb6cff1414d", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
935 "rev": "98c08acae292b2faf60a279b4189beb6cff1414d", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
936 "local": "1000", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
937 "parents": ["6d0abad76b30e4724a37ab8721d630394070fe16"], |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
938 "summary": "...", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
939 "message": "...", |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
940 "authorEmail": "foo@example.com" |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
941 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
942 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
943 } |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
944 |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
945 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
|
946 information. |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
947 """ |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
948 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:
41705
diff
changeset
|
949 meta = props.get(b'hg:meta') |
42257
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
950 if not meta: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
951 if props.get(b'local:commits'): |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
952 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:
42256
diff
changeset
|
953 meta = {} |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
954 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:
42256
diff
changeset
|
955 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:
42256
diff
changeset
|
956 commit[b'authorEmail']) |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
957 if b'time' in commit: |
42618
c17e6a3e7356
phabricator: handle local:commits time being string or int
Ian Moody <moz-ian@perix.co.uk>
parents:
42449
diff
changeset
|
958 meta[b'date'] = b'%d 0' % int(commit[b'time']) |
42257
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
959 if b'branch' in commit: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
960 meta[b'branch'] = commit[b'branch'] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
961 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:
42256
diff
changeset
|
962 if node: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
963 meta[b'node'] = node |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
964 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:
42256
diff
changeset
|
965 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:
42256
diff
changeset
|
966 else: |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
967 meta = {} |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
968 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:
42256
diff
changeset
|
969 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:
42256
diff
changeset
|
970 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:
42256
diff
changeset
|
971 meta[b'branch'] = diff[b'branch'] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
972 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:
42256
diff
changeset
|
973 meta[b'parent'] = diff[b'sourceControlBaseRevision'] |
a4f7dceb07bf
phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents:
42256
diff
changeset
|
974 return meta |
33441
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
975 |
33831
75fdaf851e83
phabricator: change "readpatch" to be more flexible
Jun Wu <quark@fb.com>
parents:
33787
diff
changeset
|
976 def readpatch(repo, drevs, write): |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
977 """generate plain-text patch readable by 'hg import' |
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
978 |
33831
75fdaf851e83
phabricator: change "readpatch" to be more flexible
Jun Wu <quark@fb.com>
parents:
33787
diff
changeset
|
979 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:
33787
diff
changeset
|
980 "differential.query". |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
981 """ |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
982 # Prefetch hg:meta property for all diffs |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
983 diffids = sorted(set(max(int(v) for v in drev[b'diffs']) for drev in drevs)) |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
984 diffs = callconduit(repo.ui, b'differential.querydiffs', {b'ids': diffids}) |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
985 |
33267
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
986 # 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
|
987 for drev in drevs: |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
988 repo.ui.note(_(b'reading D%s\n') % drev[b'id']) |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
989 |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
990 diffid = max(int(v) for v in drev[b'diffs']) |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
991 body = callconduit(repo.ui, b'differential.getrawdiff', |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
992 {b'diffID': diffid}) |
33268
85391b95961d
phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents:
33267
diff
changeset
|
993 desc = getdescfromdrev(drev) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
994 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
|
995 |
dba9f88659a3
phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents:
33266
diff
changeset
|
996 # 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
|
997 # 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
|
998 # and extract in mercurial/patch.py for supported headers. |
41902
59bae59b7498
py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41901
diff
changeset
|
999 meta = getdiffmeta(diffs[b'%d' % diffid]) |
33441
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
1000 for k in _metanamemap.keys(): |
de7c6ec27d99
phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents:
33271
diff
changeset
|
1001 if k in meta: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1002 header += b'# %s %s\n' % (_metanamemap[k], meta[k]) |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
1003 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1004 content = b'%s%s\n%s' % (header, desc, body) |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
1005 write(content) |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
1006 |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
1007 @vcrcommand(b'phabread', |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1008 [(b'', b'stack', False, _(b'read dependencies'))], |
41073
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40546
diff
changeset
|
1009 _(b'DREVSPEC [OPTIONS]'), |
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40546
diff
changeset
|
1010 helpcategory=command.CATEGORY_IMPORT_EXPORT) |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
1011 def phabread(ui, repo, spec, **opts): |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
1012 """print patches from Phabricator suitable for importing |
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
1013 |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
1014 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:
33831
diff
changeset
|
1015 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:
33831
diff
changeset
|
1016 ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
1017 select a stack. |
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
1018 |
33833
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
1019 ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision`` |
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
1020 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:
33832
diff
changeset
|
1021 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:
33832
diff
changeset
|
1022 |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
1023 For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude |
33833
fb59192b4981
phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents:
33832
diff
changeset
|
1024 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:
33832
diff
changeset
|
1025 stack up to D9. |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
1026 |
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
1027 If --stack is given, follow dependencies information and read all patches. |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
1028 It is equivalent to the ``:`` operator. |
33200
04cf9927f350
phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents:
33199
diff
changeset
|
1029 """ |
41970
51ba9fbcca52
py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41950
diff
changeset
|
1030 opts = pycompat.byteskwargs(opts) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1031 if opts.get(b'stack'): |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1032 spec = b':(%s)' % spec |
33832
539541779010
phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents:
33831
diff
changeset
|
1033 drevs = querydrev(repo, spec) |
33831
75fdaf851e83
phabricator: change "readpatch" to be more flexible
Jun Wu <quark@fb.com>
parents:
33787
diff
changeset
|
1034 readpatch(repo, drevs, ui.write) |
33834
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1035 |
39650
d8f07b16abfc
phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents:
38945
diff
changeset
|
1036 @vcrcommand(b'phabupdate', |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1037 [(b'', b'accept', False, _(b'accept revisions')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1038 (b'', b'reject', False, _(b'reject revisions')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1039 (b'', b'abandon', False, _(b'abandon revisions')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1040 (b'', b'reclaim', False, _(b'reclaim revisions')), |
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1041 (b'm', b'comment', b'', _(b'comment on the last revision')), |
41073
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40546
diff
changeset
|
1042 ], _(b'DREVSPEC [OPTIONS]'), |
536beb130f3c
phabricator: assign commands to help categories
Matt Harbison <matt_harbison@yahoo.com>
parents:
40546
diff
changeset
|
1043 helpcategory=command.CATEGORY_IMPORT_EXPORT) |
33834
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1044 def phabupdate(ui, repo, spec, **opts): |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1045 """update Differential Revision in batch |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1046 |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1047 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:
33833
diff
changeset
|
1048 """ |
41970
51ba9fbcca52
py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41950
diff
changeset
|
1049 opts = pycompat.byteskwargs(opts) |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1050 flags = [n for n in b'accept reject abandon reclaim'.split() if opts.get(n)] |
33834
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1051 if len(flags) > 1: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1052 raise error.Abort(_(b'%s cannot be used together') % b', '.join(flags)) |
33834
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1053 |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1054 actions = [] |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1055 for f in flags: |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1056 actions.append({b'type': f, b'value': b'true'}) |
33834
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1057 |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1058 drevs = querydrev(repo, spec) |
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1059 for i, drev in enumerate(drevs): |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1060 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:
38336
diff
changeset
|
1061 actions.append({b'type': b'comment', b'value': opts[b'comment']}) |
33834
6e666cd59879
phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents:
33833
diff
changeset
|
1062 if actions: |
41897
c340a8ac7ef3
phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents:
41705
diff
changeset
|
1063 params = {b'objectIdentifier': drev[b'phid'], |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1064 b'transactions': actions} |
42434
f163e2b2594c
phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42433
diff
changeset
|
1065 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
|
1066 |
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1067 templatekeyword = registrar.templatekeyword() |
f18ba40d792f
phabricator: add a template item for linking to a differential review
Tom Prince <mozilla@hocat.ca>
parents:
35626
diff
changeset
|
1068 |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1069 @templatekeyword(b'phabreview', requires={b'ctx'}) |
36514
7b74afec6772
templatekw: switch non-showlist template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents:
35722
diff
changeset
|
1070 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
|
1071 """: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
|
1072 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
|
1073 """ |
38392
81a4be7099fa
py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents:
38336
diff
changeset
|
1074 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
|
1075 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
|
1076 if m: |
39654
4057e38bba76
phabricator: fix templating bug by using hybriddict
Augie Fackler <raf@durin42.com>
parents:
39652
diff
changeset
|
1077 return templateutil.hybriddict({ |
41905
16d050678047
py3: use r'' for group name arguments to MatchObjects in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents:
41904
diff
changeset
|
1078 b'url': m.group(r'url'), |
41906
2b21c7fbb3a1
py3: use % instead of .format() on a bytestring
Ian Moody <moz-ian@perix.co.uk>
parents:
41905
diff
changeset
|
1079 b'id': b"D%s" % m.group(r'id'), |
39654
4057e38bba76
phabricator: fix templating bug by using hybriddict
Augie Fackler <raf@durin42.com>
parents:
39652
diff
changeset
|
1080 }) |
41164
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1081 else: |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1082 tags = ctx.repo().nodetags(ctx.node()) |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1083 for t in tags: |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1084 if _differentialrevisiontagre.match(t): |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1085 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
|
1086 if not url.endswith(b'/'): |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1087 url += b'/' |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1088 url += t |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1089 |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1090 return templateutil.hybriddict({ |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1091 b'url': url, |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1092 b'id': t, |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1093 }) |
43fd1947301d
phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents:
41163
diff
changeset
|
1094 return None |