hgext/phabricator.py
author Raphaël Gomès <rgomes@octobus.net>
Mon, 14 Nov 2022 15:29:58 +0100
changeset 49750 29cf3167e459
parent 49037 642e31cb55f0
child 49931 de9ffb82ef4d
permissions -rw-r--r--
hg-core: remove unneeded trait now that we support Rust 1.52+
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
     1
# phabricator.py - simple Phabricator integration
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
     2
#
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
     3
# Copyright 2017 Facebook, Inc.
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
     4
#
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
39671
87539f615b87 phabricator: mark extension as experimental for now
Augie Fackler <raf@durin42.com>
parents: 39670
diff changeset
     7
"""simple Phabricator integration (EXPERIMENTAL)
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
     8
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
     9
This extension provides a ``phabsend`` command which sends a stack of
33993
07ffff841863 phabsend: make --amend the default
Jun Wu <quark@fb.com>
parents: 33992
diff changeset
    10
changesets to Phabricator, and a ``phabread`` command which prints a stack of
07ffff841863 phabsend: make --amend the default
Jun Wu <quark@fb.com>
parents: 33992
diff changeset
    11
revisions in a format suitable for :hg:`import`, and a ``phabupdate`` command
07ffff841863 phabsend: make --amend the default
Jun Wu <quark@fb.com>
parents: 33992
diff changeset
    12
to update statuses in batch.
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    13
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
    14
A "phabstatus" view for :hg:`show` is also provided; it displays status
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
    15
information of Phabricator differentials associated with unfinished
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
    16
changesets.
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
    17
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    18
By default, Phabricator requires ``Test Plan`` which might prevent some
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    19
changeset from being sent. The requirement could be disabled by changing
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    20
``differential.require-test-plan-field`` config server side.
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    21
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    22
Config::
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    23
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    24
    [phabricator]
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    25
    # Phabricator URL
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    26
    url = https://phab.example.com/
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    27
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    28
    # Repo callsign. If a repo has a URL https://$HOST/diffusion/FOO, then its
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    29
    # callsign is "FOO".
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    30
    callsign = FOO
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
    31
34081
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
    32
    # curl command to use. If not set (default), use builtin HTTP library to
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
    33
    # communicate. If set, use the specified curl command. This could be useful
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
    34
    # if you need to specify advanced options that is not easily supported by
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
    35
    # the internal library.
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
    36
    curlcmd = curl --connect-timeout 2 --retry 3 --silent
36795
4397909f82d3 phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents: 36543
diff changeset
    37
45984
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    38
    # retry failed command N time (default 0). Useful when using the extension
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    39
    # over flakly connection.
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    40
    #
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    41
    # We wait `retry.interval` between each retry, in seconds.
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    42
    # (default 1 second).
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    43
    retry = 3
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    44
    retry.interval = 10
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    45
45985
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
    46
    # the retry option can combine well with the http.timeout one.
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
    47
    #
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
    48
    # For example to give up on http request after 20 seconds:
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
    49
    [http]
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
    50
    timeout=20
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
    51
38039
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
    52
    [auth]
38040
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
    53
    example.schemes = https
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
    54
    example.prefix = phab.example.com
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
    55
36795
4397909f82d3 phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents: 36543
diff changeset
    56
    # API token. Get it from https://$HOST/conduit/login/
38039
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
    57
    example.phabtoken = cli-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    58
"""
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    59
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    60
43187
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
    61
import base64
41083
9d35ae3d9999 phabricator: ensure that the return of urlopener.open() is closed
Matt Harbison <matt_harbison@yahoo.com>
parents: 41081
diff changeset
    62
import contextlib
43188
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
    63
import hashlib
48964
5aafc3c5bdec py3: use io.BytesIO directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48128
diff changeset
    64
import io
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
    65
import itertools
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    66
import json
43189
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
    67
import mimetypes
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
    68
import operator
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    69
import re
45984
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
    70
import time
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    71
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
    72
from mercurial.node import bin, short
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    73
from mercurial.i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43080
diff changeset
    74
from mercurial.pycompat import getattr
43183
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
    75
from mercurial.thirdparty import attr
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    76
from mercurial import (
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
    77
    cmdutil,
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
    78
    context,
44615
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
    79
    copies,
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    80
    encoding,
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
    81
    error,
42975
24bf7a3d3c30 phabricator: use exthelper to register commands, config, and templates
Matt Harbison <matt_harbison@yahoo.com>
parents: 42955
diff changeset
    82
    exthelper,
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
    83
    graphmod,
38040
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
    84
    httpconnection as httpconnectionmod,
44127
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
    85
    localrepo,
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
    86
    logcmdutil,
43186
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
    87
    match,
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    88
    mdiff,
33761
e6d8ee3c9ec3 obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33718
diff changeset
    89
    obsutil,
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
    90
    parser,
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    91
    patch,
41163
0101a35deae2 phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents: 41083
diff changeset
    92
    phases,
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
    93
    pycompat,
45437
1a5d3e555c70 phabricator: update the hashes in commit messages as they get submitted
Matt Harbison <matt_harbison@yahoo.com>
parents: 45272
diff changeset
    94
    rewriteutil,
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    95
    scmutil,
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
    96
    smartset,
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
    97
    tags,
42226
289d82a070e9 phabricator: use templatefilters.json in writediffproperties
Ian Moody <moz-ian@perix.co.uk>
parents: 41976
diff changeset
    98
    templatefilters,
39670
4057e38bba76 phabricator: fix templating bug by using hybriddict
Augie Fackler <raf@durin42.com>
parents: 39668
diff changeset
    99
    templateutil,
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   100
    url as urlmod,
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   101
    util,
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   102
)
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36826
diff changeset
   103
from mercurial.utils import (
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36826
diff changeset
   104
    procutil,
37800
6cf5f5b4eb57 phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents: 37123
diff changeset
   105
    stringutil,
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46041
diff changeset
   106
    urlutil,
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36826
diff changeset
   107
)
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   108
from . import show
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   109
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   110
39751
c0c703861b60 phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents: 39671
diff changeset
   111
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
c0c703861b60 phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents: 39671
diff changeset
   112
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
c0c703861b60 phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents: 39671
diff changeset
   113
# be specifying the version(s) of Mercurial they are tested with, or
c0c703861b60 phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents: 39671
diff changeset
   114
# leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   115
testedwith = b'ships-with-hg-core'
39751
c0c703861b60 phabricator: add testedwith boilerplate
Yuya Nishihara <yuya@tcha.org>
parents: 39671
diff changeset
   116
42975
24bf7a3d3c30 phabricator: use exthelper to register commands, config, and templates
Matt Harbison <matt_harbison@yahoo.com>
parents: 42955
diff changeset
   117
eh = exthelper.exthelper()
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   118
42975
24bf7a3d3c30 phabricator: use exthelper to register commands, config, and templates
Matt Harbison <matt_harbison@yahoo.com>
parents: 42955
diff changeset
   119
cmdtable = eh.cmdtable
24bf7a3d3c30 phabricator: use exthelper to register commands, config, and templates
Matt Harbison <matt_harbison@yahoo.com>
parents: 42955
diff changeset
   120
command = eh.command
24bf7a3d3c30 phabricator: use exthelper to register commands, config, and templates
Matt Harbison <matt_harbison@yahoo.com>
parents: 42955
diff changeset
   121
configtable = eh.configtable
24bf7a3d3c30 phabricator: use exthelper to register commands, config, and templates
Matt Harbison <matt_harbison@yahoo.com>
parents: 42955
diff changeset
   122
templatekeyword = eh.templatekeyword
44127
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   123
uisetup = eh.finaluisetup
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   124
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   125
# developer config: phabricator.batchsize
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   126
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   127
    b'phabricator',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   128
    b'batchsize',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   129
    default=12,
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   130
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   131
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   132
    b'phabricator',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   133
    b'callsign',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   134
    default=None,
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   135
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   136
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   137
    b'phabricator',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   138
    b'curlcmd',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   139
    default=None,
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   140
)
44715
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   141
# developer config: phabricator.debug
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   142
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   143
    b'phabricator',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   144
    b'debug',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   145
    default=False,
44715
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   146
)
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   147
# developer config: phabricator.repophid
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   148
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   149
    b'phabricator',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   150
    b'repophid',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   151
    default=None,
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   152
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   153
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   154
    b'phabricator',
45984
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   155
    b'retry',
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   156
    default=0,
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   157
)
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   158
eh.configitem(
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   159
    b'phabricator',
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   160
    b'retry.interval',
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   161
    default=1,
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   162
)
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   163
eh.configitem(
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   164
    b'phabricator',
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   165
    b'url',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   166
    default=None,
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   167
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   168
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   169
    b'phabsend',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   170
    b'confirm',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   171
    default=False,
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   172
)
44561
9bae1d1a0f4c phabricator: add a config knob to import in the secret phase
Matt Harbison <matt_harbison@yahoo.com>
parents: 44560
diff changeset
   173
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   174
    b'phabimport',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   175
    b'secret',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   176
    default=False,
44561
9bae1d1a0f4c phabricator: add a config knob to import in the secret phase
Matt Harbison <matt_harbison@yahoo.com>
parents: 44560
diff changeset
   177
)
44562
f10055b099b3 phabricator: add a config knob to create obsolete markers when importing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44561
diff changeset
   178
eh.configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   179
    b'phabimport',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   180
    b'obsolete',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   181
    default=False,
44562
f10055b099b3 phabricator: add a config knob to create obsolete markers when importing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44561
diff changeset
   182
)
38075
5a7cf42ba6ef phabricator: register config settings
Matt Harbison <matt_harbison@yahoo.com>
parents: 38040
diff changeset
   183
34080
941c33cfde81 phabricator: standardize colors
Jun Wu <quark@fb.com>
parents: 33996
diff changeset
   184
colortable = {
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   185
    b'phabricator.action.created': b'green',
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   186
    b'phabricator.action.skipped': b'magenta',
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   187
    b'phabricator.action.updated': b'magenta',
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   188
    b'phabricator.drev': b'bold',
43869
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
   189
    b'phabricator.status.abandoned': b'magenta dim',
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
   190
    b'phabricator.status.accepted': b'green bold',
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
   191
    b'phabricator.status.closed': b'green',
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
   192
    b'phabricator.status.needsreview': b'yellow',
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
   193
    b'phabricator.status.needsrevision': b'red',
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
   194
    b'phabricator.status.changesplanned': b'red',
34080
941c33cfde81 phabricator: standardize colors
Jun Wu <quark@fb.com>
parents: 33996
diff changeset
   195
}
941c33cfde81 phabricator: standardize colors
Jun Wu <quark@fb.com>
parents: 33996
diff changeset
   196
39666
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   197
_VCR_FLAGS = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   198
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   199
        b'',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   200
        b'test-vcr',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   201
        b'',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   202
        _(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   203
            b'Path to a vcr file. If nonexistent, will record a new vcr transcript'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   204
            b', otherwise will mock all http requests using the specified vcr file.'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   205
            b' (ADVANCED)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   206
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   207
    ),
39666
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   208
]
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   209
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   210
44127
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   211
@eh.wrapfunction(localrepo, "loadhgrc")
45513
c7fe0dfb5312 phabricator: fix loadhgrc() override broken by D8656
Martin von Zweigbergk <martinvonz@google.com>
parents: 45496
diff changeset
   212
def _loadhgrc(orig, ui, wdirvfs, hgvfs, requirements, *args, **opts):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   213
    """Load ``.arcconfig`` content into a ui instance on repository open."""
44127
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   214
    result = False
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   215
    arcconfig = {}
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   216
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   217
    try:
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   218
        # json.loads only accepts bytes from 3.6+
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   219
        rawparams = encoding.unifromlocal(wdirvfs.read(b".arcconfig"))
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   220
        # json.loads only returns unicode strings
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   221
        arcconfig = pycompat.rapply(
49025
06de08b36c82 py3: use str instead of pycompat.unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49004
diff changeset
   222
            lambda x: encoding.unitolocal(x) if isinstance(x, str) else x,
44127
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   223
            pycompat.json_loads(rawparams),
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   224
        )
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   225
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   226
        result = True
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   227
    except ValueError:
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   228
        ui.warn(_(b"invalid JSON in %s\n") % wdirvfs.join(b".arcconfig"))
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   229
    except IOError:
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   230
        pass
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   231
44128
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   232
    cfg = util.sortdict()
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   233
44127
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   234
    if b"repository.callsign" in arcconfig:
44128
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   235
        cfg[(b"phabricator", b"callsign")] = arcconfig[b"repository.callsign"]
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   236
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   237
    if b"phabricator.uri" in arcconfig:
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   238
        cfg[(b"phabricator", b"url")] = arcconfig[b"phabricator.uri"]
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   239
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   240
    if cfg:
ff396501e841 phabricator: use .arcconfig for `phabricator.url` if not set locally
Matt Harbison <matt_harbison@yahoo.com>
parents: 44127
diff changeset
   241
        ui.applyconfig(cfg, source=wdirvfs.join(b".arcconfig"))
44127
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   242
45496
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45437
diff changeset
   243
    return (
45513
c7fe0dfb5312 phabricator: fix loadhgrc() override broken by D8656
Martin von Zweigbergk <martinvonz@google.com>
parents: 45496
diff changeset
   244
        orig(ui, wdirvfs, hgvfs, requirements, *args, **opts) or result
45496
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45437
diff changeset
   245
    )  # Load .hg/hgrc
44127
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   246
59b3fe1e2021 phabricator: use .arcconfig for the callsign if not set locally (issue6243)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44076
diff changeset
   247
42451
16312ea45a8b phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42450
diff changeset
   248
def vcrcommand(name, flags, spec, helpcategory=None, optionalrepo=False):
39666
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   249
    fullflags = flags + _VCR_FLAGS
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   250
42295
af13e2088f77 phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents: 42286
diff changeset
   251
    def hgmatcher(r1, r2):
af13e2088f77 phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents: 42286
diff changeset
   252
        if r1.uri != r2.uri or r1.method != r2.method:
af13e2088f77 phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents: 42286
diff changeset
   253
            return False
43264
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   254
        r1params = util.urlreq.parseqs(r1.body)
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   255
        r2params = util.urlreq.parseqs(r2.body)
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   256
        for key in r1params:
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   257
            if key not in r2params:
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   258
                return False
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   259
            value = r1params[key][0]
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   260
            # we want to compare json payloads without worrying about ordering
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   261
            if value.startswith(b'{') and value.endswith(b'}'):
43380
579672b347d2 py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43350
diff changeset
   262
                r1json = pycompat.json_loads(value)
579672b347d2 py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43350
diff changeset
   263
                r2json = pycompat.json_loads(r2params[key][0])
43264
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   264
                if r1json != r2json:
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   265
                    return False
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   266
            elif r2params[key][0] != value:
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   267
                return False
a4da1c3b82ab phabricator: update hgmatcher to cope with the new data format
Ian Moody <moz-ian@perix.co.uk>
parents: 43263
diff changeset
   268
        return True
42295
af13e2088f77 phabricator: add custom vcr matcher to match request bodies
Ian Moody <moz-ian@perix.co.uk>
parents: 42286
diff changeset
   269
42459
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   270
    def sanitiserequest(request):
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   271
        request.body = re.sub(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   272
            br'cli-[a-z0-9]+', br'cli-hahayouwish', request.body
42459
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   273
        )
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   274
        return request
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   275
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   276
    def sanitiseresponse(response):
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43552
diff changeset
   277
        if 'set-cookie' in response['headers']:
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43552
diff changeset
   278
            del response['headers']['set-cookie']
42459
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   279
        return response
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   280
39666
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   281
    def decorate(fn):
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   282
        def inner(*args, **kwargs):
45272
b1f2659c1c34 phabricator: unconditionally pop `test_vcr` to fix debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 45152
diff changeset
   283
            vcr = kwargs.pop('test_vcr')
b1f2659c1c34 phabricator: unconditionally pop `test_vcr` to fix debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 45152
diff changeset
   284
            if vcr:
b1f2659c1c34 phabricator: unconditionally pop `test_vcr` to fix debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 45152
diff changeset
   285
                cassette = pycompat.fsdecode(vcr)
39666
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   286
                import hgdemandimport
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   287
39666
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   288
                with hgdemandimport.deactivated():
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   289
                    import vcr as vcrmod
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   290
                    import vcr.stubs as stubs
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   291
40378
b015f30a91fb phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com>
parents: 40151
diff changeset
   292
                    vcr = vcrmod.VCR(
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43552
diff changeset
   293
                        serializer='json',
42459
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   294
                        before_record_request=sanitiserequest,
d3c81439e2ee phabricator: auto-sanitise API tokens and HTTP cookies from VCR recordings
Ian Moody <moz-ian@perix.co.uk>
parents: 42451
diff changeset
   295
                        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
   296
                        custom_patches=[
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   297
                            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   298
                                urlmod,
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43552
diff changeset
   299
                                'httpconnection',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   300
                                stubs.VCRHTTPConnection,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   301
                            ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   302
                            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   303
                                urlmod,
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43552
diff changeset
   304
                                'httpsconnection',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   305
                                stubs.VCRHTTPSConnection,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   306
                            ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   307
                        ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   308
                    )
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43552
diff changeset
   309
                    vcr.register_matcher('hgmatcher', hgmatcher)
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43552
diff changeset
   310
                    with vcr.use_cassette(cassette, match_on=['hgmatcher']):
40378
b015f30a91fb phabricator: do more of the VCR work in demandimport.deactivated()
Augie Fackler <augie@google.com>
parents: 40151
diff changeset
   311
                        return fn(*args, **kwargs)
39666
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   312
            return fn(*args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   313
44456
09f3e003fc2a phabricator: avoid a stacktrace when command arguments are missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44452
diff changeset
   314
        cmd = util.checksignature(inner, depth=2)
09f3e003fc2a phabricator: avoid a stacktrace when command arguments are missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44452
diff changeset
   315
        cmd.__name__ = fn.__name__
09f3e003fc2a phabricator: avoid a stacktrace when command arguments are missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44452
diff changeset
   316
        cmd.__doc__ = fn.__doc__
09f3e003fc2a phabricator: avoid a stacktrace when command arguments are missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44452
diff changeset
   317
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   318
        return command(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   319
            name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   320
            fullflags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   321
            spec,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   322
            helpcategory=helpcategory,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   323
            optionalrepo=optionalrepo,
44456
09f3e003fc2a phabricator: avoid a stacktrace when command arguments are missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44452
diff changeset
   324
        )(cmd)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   325
39666
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   326
    return decorate
d8f07b16abfc phabricator: add support for using the vcr library to mock interactions
Augie Fackler <raf@durin42.com>
parents: 38983
diff changeset
   327
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   328
44715
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   329
def _debug(ui, *msg, **opts):
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   330
    """write debug output for Phabricator if ``phabricator.debug`` is set
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   331
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   332
    Specifically, this avoids dumping Conduit and HTTP auth chatter that is
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   333
    printed with the --debug argument.
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   334
    """
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   335
    if ui.configbool(b"phabricator", b"debug"):
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   336
        flag = ui.debugflag
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   337
        try:
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   338
            ui.debugflag = True
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   339
            ui.write(*msg, **opts)
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   340
        finally:
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   341
            ui.debugflag = flag
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   342
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   343
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   344
def urlencodenested(params):
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   345
    """like urlencode, but works with nested parameters.
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   346
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   347
    For example, if params is {'a': ['b', 'c'], 'd': {'e': 'f'}}, it will be
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   348
    flattened to {'a[0]': 'b', 'a[1]': 'c', 'd[e]': 'f'} and then passed to
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   349
    urlencode. Note: the encoding is consistent with PHP's http_build_query.
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   350
    """
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   351
    flatparams = util.sortdict()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   352
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   353
    def process(prefix, obj):
40473
d7d3164e6a31 phabricator: properly encode boolean types in the request body
Matt Harbison <matt_harbison@yahoo.com>
parents: 40435
diff changeset
   354
        if isinstance(obj, bool):
d7d3164e6a31 phabricator: properly encode boolean types in the request body
Matt Harbison <matt_harbison@yahoo.com>
parents: 40435
diff changeset
   355
            obj = {True: b'true', False: b'false'}[obj]  # Python -> PHP form
41905
47125193bad0 py3: convert indexes into bytes when enumerating lists in urlencodenested
Ian Moody <moz-ian@perix.co.uk>
parents: 41904
diff changeset
   356
        lister = lambda l: [(b'%d' % k, v) for k, v in enumerate(l)]
47125193bad0 py3: convert indexes into bytes when enumerating lists in urlencodenested
Ian Moody <moz-ian@perix.co.uk>
parents: 41904
diff changeset
   357
        items = {list: lister, dict: lambda x: x.items()}.get(type(obj))
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   358
        if items is None:
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   359
            flatparams[prefix] = obj
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   360
        else:
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   361
            for k, v in items(obj):
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   362
                if prefix:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   363
                    process(b'%s[%s]' % (prefix, k), v)
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   364
                else:
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   365
                    process(k, v)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   366
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   367
    process(b'', params)
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46041
diff changeset
   368
    return urlutil.urlreq.urlencode(flatparams)
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   369
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   370
42449
500b64c5d991 phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42447
diff changeset
   371
def readurltoken(ui):
38039
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
   372
    """return conduit url, token and make sure they exist
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
   373
38040
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
   374
    Currently read from [auth] config section. In the future, it might
38039
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
   375
    make sense to read from .arcconfig and .arcrc as well.
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
   376
    """
42449
500b64c5d991 phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42447
diff changeset
   377
    url = ui.config(b'phabricator', b'url')
38039
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
   378
    if not url:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   379
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   380
            _(b'config %s.%s is required') % (b'phabricator', b'url')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   381
        )
38039
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
   382
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46041
diff changeset
   383
    res = httpconnectionmod.readauthforuri(ui, url, urlutil.url(url).user)
38040
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
   384
    token = None
38039
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
   385
38040
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
   386
    if res:
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
   387
        group, auth = res
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
   388
42449
500b64c5d991 phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42447
diff changeset
   389
        ui.debug(b"using auth.%s.* for authentication\n" % group)
38040
71cf20d47f25 phabricator: split auth.url into the standard auth.schemes and auth.prefix
Matt Harbison <matt_harbison@yahoo.com>
parents: 38039
diff changeset
   390
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   391
        token = auth.get(b'phabtoken')
38039
0fa050bc68cb phabricator: migrate [phabricator.auth] to [auth]
Matt Harbison <matt_harbison@yahoo.com>
parents: 38020
diff changeset
   392
36795
4397909f82d3 phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents: 36543
diff changeset
   393
    if not token:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   394
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   395
            _(b'Can\'t find conduit token associated to %s') % (url,)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   396
        )
36795
4397909f82d3 phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents: 36543
diff changeset
   397
4397909f82d3 phabricator: specify API tokens per host, rather than per repo
Tom Prince <mozilla@hocat.ca>
parents: 36543
diff changeset
   398
    return url, token
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   399
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   400
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
   401
def callconduit(ui, name, params):
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   402
    """call Conduit API, params is a dict. return json.loads result, or None"""
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
   403
    host, token = readurltoken(ui)
47027
067f2c53fb24 phabricator: adapt to the new `urlutil.url()` API
Matt Harbison <matt_harbison@yahoo.com>
parents: 46907
diff changeset
   404
    url, authinfo = urlutil.url(b'/'.join([host, b'api', name])).authinfo()
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
   405
    ui.debug(b'Conduit Call: %s %s\n' % (url, pycompat.byterepr(params)))
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   406
    params = params.copy()
43261
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   407
    params[b'__conduit__'] = {
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   408
        b'token': token,
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   409
    }
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   410
    rawdata = {
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   411
        b'params': templatefilters.json(params),
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   412
        b'output': b'json',
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   413
        b'__conduit__': 1,
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   414
    }
f5aa4a53acd1 phabricator: change conduit data format to match arcanist
Ian Moody <moz-ian@perix.co.uk>
parents: 43259
diff changeset
   415
    data = urlencodenested(rawdata)
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
   416
    curlcmd = ui.config(b'phabricator', b'curlcmd')
34081
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
   417
    if curlcmd:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   418
        sin, sout = procutil.popen2(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   419
            b'%s -d @- %s' % (curlcmd, procutil.shellquote(url))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   420
        )
34081
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
   421
        sin.write(data)
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
   422
        sin.close()
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
   423
        body = sout.read()
8b659b7388c0 phabricator: add a config to use curl for communication
Jun Wu <quark@fb.com>
parents: 34080
diff changeset
   424
    else:
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
   425
        urlopener = urlmod.opener(ui, authinfo)
41906
a98dabdb5a7b py3: convert URL to str before passing it to request
Ian Moody <moz-ian@perix.co.uk>
parents: 41905
diff changeset
   426
        request = util.urlreq.request(pycompat.strurl(url), data=data)
45984
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   427
        max_try = ui.configint(b'phabricator', b'retry') + 1
45985
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
   428
        timeout = ui.configwith(float, b'http', b'timeout')
45984
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   429
        for try_count in range(max_try):
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   430
            try:
45985
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
   431
                with contextlib.closing(
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
   432
                    urlopener.open(request, timeout=timeout)
4d70444c3ea9 phabricator: use the `http.timeout` config for conduit call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45984
diff changeset
   433
                ) as rsp:
45984
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   434
                    body = rsp.read()
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   435
                break
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   436
            except util.urlerr.urlerror as err:
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   437
                if try_count == max_try - 1:
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   438
                    raise
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   439
                ui.debug(
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   440
                    b'Conduit Request failed (try %d/%d): %r\n'
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   441
                    % (try_count + 1, max_try, err)
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   442
                )
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   443
                # failing request might come from overloaded server
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   444
                retry_interval = ui.configint(b'phabricator', b'retry.interval')
57183111a463 phabricator: introduce a `phabricator.retry` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45957
diff changeset
   445
                time.sleep(retry_interval)
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
   446
    ui.debug(b'Conduit Response: %s\n' % body)
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
   447
    parsed = pycompat.rapply(
49025
06de08b36c82 py3: use str instead of pycompat.unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49004
diff changeset
   448
        lambda x: encoding.unitolocal(x) if isinstance(x, str) else x,
43047
0f90c2d2d7e8 py3: fix phabricator's use of json.loads() for py3.5
Ian Moody <moz-ian@perix.co.uk>
parents: 42975
diff changeset
   449
        # json.loads only accepts bytes from py3.6+
43380
579672b347d2 py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43350
diff changeset
   450
        pycompat.json_loads(encoding.unifromlocal(body)),
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
   451
    )
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
   452
    if parsed.get(b'error_code'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   453
        msg = _(b'Conduit Error (%s): %s') % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   454
            parsed[b'error_code'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   455
            parsed[b'error_info'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   456
        )
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   457
        raise error.Abort(msg)
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
   458
    return parsed[b'result']
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   459
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   460
42451
16312ea45a8b phabricator: make `hg debugcallconduit` work outside a hg repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42450
diff changeset
   461
@vcrcommand(b'debugcallconduit', [], _(b'METHOD'), optionalrepo=True)
33200
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   462
def debugcallconduit(ui, repo, name):
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   463
    """call Conduit API
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   464
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   465
    Call parameters are read from stdin as a JSON blob. Result will be written
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   466
    to stdout as a JSON blob.
36b3febd739f phabricator: add a contrib script
Jun Wu <quark@fb.com>
parents:
diff changeset
   467
    """
41976
99e00e5c4746 py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41975
diff changeset
   468
    # json.loads only accepts bytes from 3.6+
99e00e5c4746 py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41975
diff changeset
   469
    rawparams = encoding.unifromlocal(ui.fin.read())
99e00e5c4746 py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41975
diff changeset
   470
    # json.loads only returns unicode strings
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   471
    params = pycompat.rapply(
49025
06de08b36c82 py3: use str instead of pycompat.unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49004
diff changeset
   472
        lambda x: encoding.unitolocal(x) if isinstance(x, str) else x,
43380
579672b347d2 py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43350
diff changeset
   473
        pycompat.json_loads(rawparams),
41976
99e00e5c4746 py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41975
diff changeset
   474
    )
99e00e5c4746 py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41975
diff changeset
   475
    # json.dumps only accepts unicode strings
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   476
    result = pycompat.rapply(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   477
        lambda x: encoding.unifromlocal(x) if isinstance(x, bytes) else x,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   478
        callconduit(ui, name, params),
41976
99e00e5c4746 py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41975
diff changeset
   479
    )
99e00e5c4746 py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41975
diff changeset
   480
    s = json.dumps(result, sort_keys=True, indent=2, separators=(u',', u': '))
99e00e5c4746 py3: convert to/from bytes/unicode for json.(dump|load)s in debugcallconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41975
diff changeset
   481
    ui.write(b'%s\n' % encoding.unitolocal(s))
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   482
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   483
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   484
def getrepophid(repo):
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   485
    """given callsign, return repository PHID or None"""
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   486
    # developer config: phabricator.repophid
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   487
    repophid = repo.ui.config(b'phabricator', b'repophid')
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   488
    if repophid:
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   489
        return repophid
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   490
    callsign = repo.ui.config(b'phabricator', b'callsign')
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   491
    if not callsign:
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   492
        return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   493
    query = callconduit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   494
        repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   495
        b'diffusion.repository.search',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   496
        {b'constraints': {b'callsigns': [callsign]}},
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   497
    )
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
   498
    if len(query[b'data']) == 0:
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   499
        return None
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
   500
    repophid = query[b'data'][0][b'phid']
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   501
    repo.ui.setconfig(b'phabricator', b'repophid', repophid)
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   502
    return repophid
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   503
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   504
41546
bd3f03d8cc9f global: use raw strings for regular expressions with escapes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41387
diff changeset
   505
_differentialrevisiontagre = re.compile(br'\AD([1-9][0-9]*)\Z')
33263
ed61189763ef phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents: 33202
diff changeset
   506
_differentialrevisiondescre = re.compile(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   507
    br'^Differential Revision:\s*(?P<url>(?:.*)D(?P<id>[1-9][0-9]*))$', re.M
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   508
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   509
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   510
33442
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   511
def getoldnodedrevmap(repo, nodelist):
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   512
    """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
   513
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   514
    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
   515
    for node in nodelist with known previous sent versions, or associated
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   516
    Differential Revision IDs. ``oldnode`` and ``Differential diff`` could
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   517
    be ``None``.
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   518
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   519
    Examines commit messages like "Differential Revision:" to get the
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   520
    association information.
33263
ed61189763ef phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents: 33202
diff changeset
   521
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   522
    If such commit message line is not found, examines all precursors and their
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   523
    tags. Tags with format like "D1234" are considered a match and the node
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   524
    with that tag, and the number after "D" (ex. 1234) will be returned.
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   525
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   526
    The ``old node``, if not None, is guaranteed to be the last diff of
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   527
    corresponding Differential Revision, and exist in the repo.
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   528
    """
33442
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   529
    unfi = repo.unfiltered()
43597
4cb3f5bb29ec index: use `index.has_node` in `phabricator.getoldnodedrevmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43554
diff changeset
   530
    has_node = unfi.changelog.index.has_node
33263
ed61189763ef phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents: 33202
diff changeset
   531
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   532
    result = {}  # {node: (oldnode?, lastdiff?, drev)}
44715
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   533
    # ordered for test stability when printing new -> old mapping below
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   534
    toconfirm = util.sortdict()  # {node: (force, {precnode}, drev)}
33442
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   535
    for node in nodelist:
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   536
        ctx = unfi[node]
33443
e48082e0a8d5 phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents: 33442
diff changeset
   537
        # For tags like "D123", put them into "toconfirm" to verify later
33761
e6d8ee3c9ec3 obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33718
diff changeset
   538
        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
   539
        for n in precnodes:
43597
4cb3f5bb29ec index: use `index.has_node` in `phabricator.getoldnodedrevmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43554
diff changeset
   540
            if has_node(n):
33442
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   541
                for tag in unfi.nodetags(n):
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   542
                    m = _differentialrevisiontagre.match(tag)
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   543
                    if m:
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   544
                        toconfirm[node] = (0, set(precnodes), int(m.group(1)))
43847
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   545
                        break
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   546
                else:
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   547
                    continue  # move to next predecessor
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   548
                break  # found a tag, stop
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   549
        else:
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   550
            # Check commit message
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   551
            m = _differentialrevisiondescre.search(ctx.description())
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   552
            if m:
16b607e9f714 phabricator: fix processing of tags/desc in getoldnodedrevmap()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43597
diff changeset
   553
                toconfirm[node] = (1, set(precnodes), int(m.group('id')))
33263
ed61189763ef phabricator: check associated Differential Revision from commit message
Jun Wu <quark@fb.com>
parents: 33202
diff changeset
   554
33443
e48082e0a8d5 phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents: 33442
diff changeset
   555
    # 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
   556
    # Phabricator, and expect precursors overlap with it.
e48082e0a8d5 phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents: 33442
diff changeset
   557
    if toconfirm:
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   558
        drevs = [drev for force, precs, drev in toconfirm.values()]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   559
        alldiffs = callconduit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   560
            unfi.ui, b'differential.querydiffs', {b'revisionIDs': drevs}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   561
        )
44650
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   562
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   563
        def getnodes(d, precset):
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   564
            # Ignore other nodes that were combined into the Differential
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   565
            # that aren't predecessors of the current local node.
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   566
            return [n for n in getlocalcommits(d) if n in precset]
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   567
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   568
        for newnode, (force, precset, drev) in toconfirm.items():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   569
            diffs = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   570
                d for d in alldiffs.values() if int(d[b'revisionID']) == drev
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   571
            ]
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   572
44650
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   573
            # local predecessors known by Phabricator
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   574
            phprecset = {n for d in diffs for n in getnodes(d, precset)}
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   575
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   576
            # Ignore if precursors (Phabricator and local repo) do not overlap,
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   577
            # and force is not set (when commit message says nothing)
44650
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   578
            if not force and not phprecset:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
   579
                tagname = b'D%d' % drev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   580
                tags.tag(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   581
                    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   582
                    tagname,
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
   583
                    repo.nullid,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   584
                    message=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   585
                    user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   586
                    date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   587
                    local=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   588
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   589
                unfi.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   590
                    _(
43399
742065def6ca py3: use %d to format an int
Ian Moody <moz-ian@perix.co.uk>
parents: 43380
diff changeset
   591
                        b'D%d: local tag removed - does not match '
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   592
                        b'Differential history\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   593
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   594
                    % drev
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   595
                )
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   596
                continue
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   597
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   598
            # Find the last node using Phabricator metadata, and make sure it
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   599
            # exists in the repo
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   600
            oldnode = lastdiff = None
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   601
            if diffs:
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
   602
                lastdiff = max(diffs, key=lambda d: int(d[b'id']))
44650
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   603
                oldnodes = getnodes(lastdiff, precset)
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   604
44715
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   605
                _debug(
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   606
                    unfi.ui,
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   607
                    b"%s mapped to old nodes %s\n"
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   608
                    % (
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   609
                        short(newnode),
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   610
                        stringutil.pprint([short(n) for n in sorted(oldnodes)]),
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   611
                    ),
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   612
                )
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
   613
44650
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   614
                # If this commit was the result of `hg fold` after submission,
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   615
                # and now resubmitted with --fold, the easiest thing to do is
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   616
                # to leave the node clear.  This only results in creating a new
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   617
                # diff for the _same_ Differential Revision if this commit is
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
   618
                # the first or last in the selected range.  If we picked a node
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
   619
                # from the list instead, it would have to be the lowest if at
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
   620
                # the beginning of the --fold range, or the highest at the end.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
   621
                # Otherwise, one or more of the nodes wouldn't be considered in
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
   622
                # the diff, and the Differential wouldn't be properly updated.
44650
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   623
                # If this commit is the result of `hg split` in the same
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   624
                # scenario, there is a single oldnode here (and multiple
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   625
                # newnodes mapped to it).  That makes it the same as the normal
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   626
                # case, as the edges of the newnode range cleanly maps to one
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   627
                # oldnode each.
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   628
                if len(oldnodes) == 1:
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
   629
                    oldnode = oldnodes[0]
43597
4cb3f5bb29ec index: use `index.has_node` in `phabricator.getoldnodedrevmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43554
diff changeset
   630
                if oldnode and not has_node(oldnode):
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   631
                    oldnode = None
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   632
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
   633
            result[newnode] = (oldnode, lastdiff, drev)
33443
e48082e0a8d5 phabricator: verify local tags before trusting them
Jun Wu <quark@fb.com>
parents: 33442
diff changeset
   634
33442
3ab0d5767b54 phabricator: finding old nodes in batch
Jun Wu <quark@fb.com>
parents: 33441
diff changeset
   635
    return result
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   636
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   637
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   638
def getdrevmap(repo, revs):
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   639
    """Return a dict mapping each rev in `revs` to their Differential Revision
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   640
    ID or None.
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   641
    """
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   642
    result = {}
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   643
    for rev in revs:
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   644
        result[rev] = None
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   645
        ctx = repo[rev]
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   646
        # Check commit message
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   647
        m = _differentialrevisiondescre.search(ctx.description())
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   648
        if m:
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   649
            result[rev] = int(m.group('id'))
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   650
            continue
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   651
        # Check tags
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   652
        for tag in repo.nodetags(ctx.node()):
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   653
            m = _differentialrevisiontagre.match(tag)
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   654
            if m:
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   655
                result[rev] = int(m.group(1))
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   656
                break
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   657
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   658
    return result
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   659
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
   660
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   661
def getdiff(basectx, ctx, diffopts):
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   662
    """plain-text diff without header (user, commit message, etc)"""
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   663
    output = util.stringio()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   664
    for chunk, _label in patch.diffui(
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   665
        ctx.repo(), basectx.p1().node(), ctx.node(), None, opts=diffopts
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   666
    ):
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   667
        output.write(chunk)
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   668
    return output.getvalue()
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
   669
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
   670
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
   671
class DiffChangeType:
43182
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   672
    ADD = 1
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   673
    CHANGE = 2
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   674
    DELETE = 3
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   675
    MOVE_AWAY = 4
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   676
    COPY_AWAY = 5
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   677
    MOVE_HERE = 6
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   678
    COPY_HERE = 7
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   679
    MULTICOPY = 8
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   680
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   681
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
   682
class DiffFileType:
43182
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   683
    TEXT = 1
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   684
    IMAGE = 2
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   685
    BINARY = 3
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   686
a66e2844b0c6 phabricator: add the DiffChangeType and DiffFileType constants
Ian Moody <moz-ian@perix.co.uk>
parents: 43117
diff changeset
   687
43183
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   688
@attr.s
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   689
class phabhunk(dict):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
   690
    """Represents a Differential hunk, which is owned by a Differential change"""
43183
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   691
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   692
    oldOffset = attr.ib(default=0)  # camelcase-required
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   693
    oldLength = attr.ib(default=0)  # camelcase-required
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   694
    newOffset = attr.ib(default=0)  # camelcase-required
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   695
    newLength = attr.ib(default=0)  # camelcase-required
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   696
    corpus = attr.ib(default='')
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   697
    # These get added to the phabchange's equivalents
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   698
    addLines = attr.ib(default=0)  # camelcase-required
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   699
    delLines = attr.ib(default=0)  # camelcase-required
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   700
73d4bc60e389 phabricator: add the phabhunk data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43182
diff changeset
   701
43184
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   702
@attr.s
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
   703
class phabchange:
43184
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   704
    """Represents a Differential change, owns Differential hunks and owned by a
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   705
    Differential diff.  Each one represents one file in a diff.
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   706
    """
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   707
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   708
    currentPath = attr.ib(default=None)  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   709
    oldPath = attr.ib(default=None)  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   710
    awayPaths = attr.ib(default=attr.Factory(list))  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   711
    metadata = attr.ib(default=attr.Factory(dict))
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   712
    oldProperties = attr.ib(default=attr.Factory(dict))  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   713
    newProperties = attr.ib(default=attr.Factory(dict))  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   714
    type = attr.ib(default=DiffChangeType.CHANGE)
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   715
    fileType = attr.ib(default=DiffFileType.TEXT)  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   716
    commitHash = attr.ib(default=None)  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   717
    addLines = attr.ib(default=0)  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   718
    delLines = attr.ib(default=0)  # camelcase-required
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   719
    hunks = attr.ib(default=attr.Factory(list))
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   720
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   721
    def copynewmetadatatoold(self):
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   722
        for key in list(self.metadata.keys()):
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   723
            newkey = key.replace(b'new:', b'old:')
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   724
            self.metadata[newkey] = self.metadata[key]
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   725
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   726
    def addoldmode(self, value):
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   727
        self.oldProperties[b'unix:filemode'] = value
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   728
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   729
    def addnewmode(self, value):
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   730
        self.newProperties[b'unix:filemode'] = value
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   731
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   732
    def addhunk(self, hunk):
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   733
        if not isinstance(hunk, phabhunk):
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   734
            raise error.Abort(b'phabchange.addhunk only takes phabhunks')
43259
162b81e65e60 phabricator: convert phabhunk and phabchange keys to bytes when finalising
Ian Moody <moz-ian@perix.co.uk>
parents: 43258
diff changeset
   735
        self.hunks.append(pycompat.byteskwargs(attr.asdict(hunk)))
43184
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   736
        # It's useful to include these stats since the Phab web UI shows them,
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   737
        # and uses them to estimate how large a change a Revision is. Also used
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   738
        # in email subjects for the [+++--] bit.
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   739
        self.addLines += hunk.addLines
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   740
        self.delLines += hunk.delLines
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   741
99ee4afd352f phabricator: add the phabchange data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43183
diff changeset
   742
43185
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   743
@attr.s
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
   744
class phabdiff:
43185
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   745
    """Represents a Differential diff, owns Differential changes.  Corresponds
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   746
    to a commit.
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   747
    """
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   748
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   749
    # Doesn't seem to be any reason to send this (output of uname -n)
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   750
    sourceMachine = attr.ib(default=b'')  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   751
    sourcePath = attr.ib(default=b'/')  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   752
    sourceControlBaseRevision = attr.ib(default=b'0' * 40)  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   753
    sourceControlPath = attr.ib(default=b'/')  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   754
    sourceControlSystem = attr.ib(default=b'hg')  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   755
    branch = attr.ib(default=b'default')
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   756
    bookmark = attr.ib(default=None)
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   757
    creationMethod = attr.ib(default=b'phabsend')  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   758
    lintStatus = attr.ib(default=b'none')  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   759
    unitStatus = attr.ib(default=b'none')  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   760
    changes = attr.ib(default=attr.Factory(dict))
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   761
    repositoryPHID = attr.ib(default=None)  # camelcase-required
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   762
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   763
    def addchange(self, change):
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   764
        if not isinstance(change, phabchange):
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   765
            raise error.Abort(b'phabdiff.addchange only takes phabchanges')
43259
162b81e65e60 phabricator: convert phabhunk and phabchange keys to bytes when finalising
Ian Moody <moz-ian@perix.co.uk>
parents: 43258
diff changeset
   766
        self.changes[change.currentPath] = pycompat.byteskwargs(
162b81e65e60 phabricator: convert phabhunk and phabchange keys to bytes when finalising
Ian Moody <moz-ian@perix.co.uk>
parents: 43258
diff changeset
   767
            attr.asdict(change)
162b81e65e60 phabricator: convert phabhunk and phabchange keys to bytes when finalising
Ian Moody <moz-ian@perix.co.uk>
parents: 43258
diff changeset
   768
        )
43185
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   769
75e7628b488f phabricator: add the phabdiff data structure
Ian Moody <moz-ian@perix.co.uk>
parents: 43184
diff changeset
   770
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   771
def maketext(pchange, basectx, ctx, fname):
43186
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   772
    """populate the phabchange for a text file"""
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   773
    repo = ctx.repo()
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   774
    fmatcher = match.exact([fname])
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   775
    diffopts = mdiff.diffopts(git=True, context=32767)
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   776
    _pfctx, _fctx, header, fhunks = next(
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   777
        patch.diffhunks(repo, basectx.p1(), ctx, fmatcher, opts=diffopts)
43186
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   778
    )
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   779
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   780
    for fhunk in fhunks:
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   781
        (oldOffset, oldLength, newOffset, newLength), lines = fhunk
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   782
        corpus = b''.join(lines[1:])
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   783
        shunk = list(header)
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   784
        shunk.extend(lines)
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   785
        _mf, _mt, addLines, delLines, _hb = patch.diffstatsum(
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   786
            patch.diffstatdata(util.iterlines(shunk))
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   787
        )
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   788
        pchange.addhunk(
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   789
            phabhunk(
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   790
                oldOffset,
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   791
                oldLength,
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   792
                newOffset,
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   793
                newLength,
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   794
                corpus,
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   795
                addLines,
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   796
                delLines,
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   797
            )
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   798
        )
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   799
f742fabad507 phabricator: add the maketext function
Ian Moody <moz-ian@perix.co.uk>
parents: 43185
diff changeset
   800
43187
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   801
def uploadchunks(fctx, fphid):
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   802
    """upload large binary files as separate chunks.
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   803
    Phab requests chunking over 8MiB, and splits into 4MiB chunks
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   804
    """
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   805
    ui = fctx.repo().ui
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   806
    chunks = callconduit(ui, b'file.querychunks', {b'filePHID': fphid})
43552
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   807
    with ui.makeprogress(
43187
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   808
        _(b'uploading file chunks'), unit=_(b'chunks'), total=len(chunks)
43552
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   809
    ) as progress:
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   810
        for chunk in chunks:
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   811
            progress.increment()
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   812
            if chunk[b'complete']:
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   813
                continue
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   814
            bstart = int(chunk[b'byteStart'])
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   815
            bend = int(chunk[b'byteEnd'])
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   816
            callconduit(
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   817
                ui,
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   818
                b'file.uploadchunk',
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   819
                {
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   820
                    b'filePHID': fphid,
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   821
                    b'byteStart': bstart,
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   822
                    b'data': base64.b64encode(fctx.data()[bstart:bend]),
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   823
                    b'dataEncoding': b'base64',
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   824
                },
a78a65c33b5a phabricator: use context manager form of progress in uploadchunks
Ian Moody <moz-ian@perix.co.uk>
parents: 43399
diff changeset
   825
            )
43187
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   826
453079605242 phabricator: add the uploadchunks function
Ian Moody <moz-ian@perix.co.uk>
parents: 43186
diff changeset
   827
43188
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   828
def uploadfile(fctx):
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   829
    """upload binary files to Phabricator"""
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   830
    repo = fctx.repo()
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   831
    ui = repo.ui
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   832
    fname = fctx.path()
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   833
    size = fctx.size()
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   834
    fhash = pycompat.bytestr(hashlib.sha256(fctx.data()).hexdigest())
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   835
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   836
    # an allocate call is required first to see if an upload is even required
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   837
    # (Phab might already have it) and to determine if chunking is needed
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   838
    allocateparams = {
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   839
        b'name': fname,
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   840
        b'contentLength': size,
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   841
        b'contentHash': fhash,
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   842
    }
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   843
    filealloc = callconduit(ui, b'file.allocate', allocateparams)
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   844
    fphid = filealloc[b'filePHID']
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   845
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   846
    if filealloc[b'upload']:
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   847
        ui.write(_(b'uploading %s\n') % bytes(fctx))
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   848
        if not fphid:
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   849
            uploadparams = {
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   850
                b'name': fname,
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   851
                b'data_base64': base64.b64encode(fctx.data()),
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   852
            }
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   853
            fphid = callconduit(ui, b'file.upload', uploadparams)
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   854
        else:
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   855
            uploadchunks(fctx, fphid)
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   856
    else:
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   857
        ui.debug(b'server already has %s\n' % bytes(fctx))
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   858
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   859
    if not fphid:
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   860
        raise error.Abort(b'Upload of %s failed.' % bytes(fctx))
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   861
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   862
    return fphid
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   863
24e8aac7c630 phabricator: add the uploadfile function
Ian Moody <moz-ian@perix.co.uk>
parents: 43187
diff changeset
   864
44449
98f7b9cf7bfc phabricator: pass old `fctx` to `addoldbinary()` instead of inferring it
Matt Harbison <matt_harbison@yahoo.com>
parents: 44448
diff changeset
   865
def addoldbinary(pchange, oldfctx, fctx):
43189
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   866
    """add the metadata for the previous version of a binary file to the
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   867
    phabchange for the new version
44449
98f7b9cf7bfc phabricator: pass old `fctx` to `addoldbinary()` instead of inferring it
Matt Harbison <matt_harbison@yahoo.com>
parents: 44448
diff changeset
   868
98f7b9cf7bfc phabricator: pass old `fctx` to `addoldbinary()` instead of inferring it
Matt Harbison <matt_harbison@yahoo.com>
parents: 44448
diff changeset
   869
    ``oldfctx`` is the previous version of the file; ``fctx`` is the new
98f7b9cf7bfc phabricator: pass old `fctx` to `addoldbinary()` instead of inferring it
Matt Harbison <matt_harbison@yahoo.com>
parents: 44448
diff changeset
   870
    version of the file, or None if the file is being removed.
43189
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   871
    """
44449
98f7b9cf7bfc phabricator: pass old `fctx` to `addoldbinary()` instead of inferring it
Matt Harbison <matt_harbison@yahoo.com>
parents: 44448
diff changeset
   872
    if not fctx or fctx.cmp(oldfctx):
43189
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   873
        # Files differ, add the old one
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   874
        pchange.metadata[b'old:file:size'] = oldfctx.size()
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   875
        mimeguess, _enc = mimetypes.guess_type(
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   876
            encoding.unifromlocal(oldfctx.path())
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   877
        )
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   878
        if mimeguess:
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   879
            pchange.metadata[b'old:file:mime-type'] = pycompat.bytestr(
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   880
                mimeguess
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   881
            )
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   882
        fphid = uploadfile(oldfctx)
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   883
        pchange.metadata[b'old:binary-phid'] = fphid
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   884
    else:
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   885
        # If it's left as IMAGE/BINARY web UI might try to display it
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   886
        pchange.fileType = DiffFileType.TEXT
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   887
        pchange.copynewmetadatatoold()
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   888
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   889
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   890
def makebinary(pchange, fctx):
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   891
    """populate the phabchange for a binary file"""
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   892
    pchange.fileType = DiffFileType.BINARY
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   893
    fphid = uploadfile(fctx)
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   894
    pchange.metadata[b'new:binary-phid'] = fphid
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   895
    pchange.metadata[b'new:file:size'] = fctx.size()
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   896
    mimeguess, _enc = mimetypes.guess_type(encoding.unifromlocal(fctx.path()))
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   897
    if mimeguess:
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   898
        mimeguess = pycompat.bytestr(mimeguess)
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   899
        pchange.metadata[b'new:file:mime-type'] = mimeguess
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   900
        if mimeguess.startswith(b'image/'):
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   901
            pchange.fileType = DiffFileType.IMAGE
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   902
9f802243a42e phabricator: add makebinary and addoldbinary functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43188
diff changeset
   903
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   904
# Copied from mercurial/patch.py
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   905
gitmode = {b'l': b'120000', b'x': b'100755', b'': b'100644'}
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   906
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   907
43263
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   908
def notutf8(fctx):
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   909
    """detect non-UTF-8 text files since Phabricator requires them to be marked
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   910
    as binary
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   911
    """
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   912
    try:
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   913
        fctx.data().decode('utf-8')
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   914
        return False
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   915
    except UnicodeDecodeError:
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   916
        fctx.repo().ui.write(
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   917
            _(b'file %s detected as non-UTF-8, marked as binary\n')
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   918
            % fctx.path()
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   919
        )
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   920
        return True
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   921
06a33a501aa2 phabricator: treat non-utf-8 text files as binary as phabricator requires
Ian Moody <moz-ian@perix.co.uk>
parents: 43262
diff changeset
   922
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   923
def addremoved(pdiff, basectx, ctx, removed):
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   924
    """add removed files to the phabdiff. Shouldn't include moves"""
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   925
    for fname in removed:
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   926
        pchange = phabchange(
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   927
            currentPath=fname, oldPath=fname, type=DiffChangeType.DELETE
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   928
        )
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   929
        oldfctx = basectx.p1()[fname]
44613
7b9aaec17126 phabricator: eliminate a couple of duplicate filectx lookups
Matt Harbison <matt_harbison@yahoo.com>
parents: 44593
diff changeset
   930
        pchange.addoldmode(gitmode[oldfctx.flags()])
44450
aa9979bb6853 phabricator: rename a variable to clarify that it is the parent filecontext
Matt Harbison <matt_harbison@yahoo.com>
parents: 44449
diff changeset
   931
        if not (oldfctx.isbinary() or notutf8(oldfctx)):
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   932
            maketext(pchange, basectx, ctx, fname)
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   933
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   934
        pdiff.addchange(pchange)
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   935
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   936
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   937
def addmodified(pdiff, basectx, ctx, modified):
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   938
    """add modified files to the phabdiff"""
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   939
    for fname in modified:
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   940
        fctx = ctx[fname]
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   941
        oldfctx = basectx.p1()[fname]
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   942
        pchange = phabchange(currentPath=fname, oldPath=fname)
44613
7b9aaec17126 phabricator: eliminate a couple of duplicate filectx lookups
Matt Harbison <matt_harbison@yahoo.com>
parents: 44593
diff changeset
   943
        filemode = gitmode[fctx.flags()]
7b9aaec17126 phabricator: eliminate a couple of duplicate filectx lookups
Matt Harbison <matt_harbison@yahoo.com>
parents: 44593
diff changeset
   944
        originalmode = gitmode[oldfctx.flags()]
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   945
        if filemode != originalmode:
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   946
            pchange.addoldmode(originalmode)
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   947
            pchange.addnewmode(filemode)
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   948
44452
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
   949
        if (
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
   950
            fctx.isbinary()
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
   951
            or notutf8(fctx)
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
   952
            or oldfctx.isbinary()
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
   953
            or notutf8(oldfctx)
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
   954
        ):
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   955
            makebinary(pchange, fctx)
44613
7b9aaec17126 phabricator: eliminate a couple of duplicate filectx lookups
Matt Harbison <matt_harbison@yahoo.com>
parents: 44593
diff changeset
   956
            addoldbinary(pchange, oldfctx, fctx)
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   957
        else:
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   958
            maketext(pchange, basectx, ctx, fname)
43190
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   959
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   960
        pdiff.addchange(pchange)
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   961
c19b327017b9 phabricator: add addremoved and addmodified functions
Ian Moody <moz-ian@perix.co.uk>
parents: 43189
diff changeset
   962
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   963
def addadded(pdiff, basectx, ctx, added, removed):
43258
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   964
    """add file adds to the phabdiff, both new files and copies/moves"""
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   965
    # Keep track of files that've been recorded as moved/copied, so if there are
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   966
    # additional copies we can mark them (moves get removed from removed)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   967
    copiedchanges = {}
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   968
    movedchanges = {}
44615
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   969
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   970
    copy = {}
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   971
    if basectx != ctx:
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   972
        copy = copies.pathcopies(basectx.p1(), ctx)
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   973
43258
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   974
    for fname in added:
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   975
        fctx = ctx[fname]
44451
66a05dbb8b4c phabricator: don't infer the old `fctx` in `notutf8()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44450
diff changeset
   976
        oldfctx = None
43258
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   977
        pchange = phabchange(currentPath=fname)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   978
44613
7b9aaec17126 phabricator: eliminate a couple of duplicate filectx lookups
Matt Harbison <matt_harbison@yahoo.com>
parents: 44593
diff changeset
   979
        filemode = gitmode[fctx.flags()]
44615
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   980
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   981
        if copy:
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   982
            originalfname = copy.get(fname, fname)
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   983
        else:
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   984
            originalfname = fname
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   985
            if fctx.renamed():
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   986
                originalfname = fctx.renamed()[0]
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   987
022bf71515c9 phabricator: account for `basectx != ctx` when calculating renames
Matt Harbison <matt_harbison@yahoo.com>
parents: 44614
diff changeset
   988
        renamed = fname != originalfname
43258
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   989
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   990
        if renamed:
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
   991
            oldfctx = basectx.p1()[originalfname]
44451
66a05dbb8b4c phabricator: don't infer the old `fctx` in `notutf8()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44450
diff changeset
   992
            originalmode = gitmode[oldfctx.flags()]
43258
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   993
            pchange.oldPath = originalfname
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   994
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   995
            if originalfname in removed:
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   996
                origpchange = phabchange(
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   997
                    currentPath=originalfname,
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   998
                    oldPath=originalfname,
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
   999
                    type=DiffChangeType.MOVE_AWAY,
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1000
                    awayPaths=[fname],
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1001
                )
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1002
                movedchanges[originalfname] = origpchange
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1003
                removed.remove(originalfname)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1004
                pchange.type = DiffChangeType.MOVE_HERE
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1005
            elif originalfname in movedchanges:
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1006
                movedchanges[originalfname].type = DiffChangeType.MULTICOPY
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1007
                movedchanges[originalfname].awayPaths.append(fname)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1008
                pchange.type = DiffChangeType.COPY_HERE
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1009
            else:  # pure copy
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1010
                if originalfname not in copiedchanges:
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1011
                    origpchange = phabchange(
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1012
                        currentPath=originalfname, type=DiffChangeType.COPY_AWAY
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1013
                    )
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1014
                    copiedchanges[originalfname] = origpchange
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1015
                else:
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1016
                    origpchange = copiedchanges[originalfname]
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1017
                origpchange.awayPaths.append(fname)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1018
                pchange.type = DiffChangeType.COPY_HERE
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1019
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1020
            if filemode != originalmode:
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1021
                pchange.addoldmode(originalmode)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1022
                pchange.addnewmode(filemode)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1023
        else:  # Brand-new file
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1024
            pchange.addnewmode(gitmode[fctx.flags()])
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1025
            pchange.type = DiffChangeType.ADD
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1026
44452
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
  1027
        if (
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
  1028
            fctx.isbinary()
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
  1029
            or notutf8(fctx)
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
  1030
            or (oldfctx and (oldfctx.isbinary() or notutf8(oldfctx)))
4ce2330f2d0b phabricator: also check parent fctx for binary where it is checked for UTF-8
Matt Harbison <matt_harbison@yahoo.com>
parents: 44451
diff changeset
  1031
        ):
43258
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1032
            makebinary(pchange, fctx)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1033
            if renamed:
44451
66a05dbb8b4c phabricator: don't infer the old `fctx` in `notutf8()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44450
diff changeset
  1034
                addoldbinary(pchange, oldfctx, fctx)
43258
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1035
        else:
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1036
            maketext(pchange, basectx, ctx, fname)
43258
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1037
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1038
        pdiff.addchange(pchange)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1039
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1040
    for _path, copiedchange in copiedchanges.items():
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1041
        pdiff.addchange(copiedchange)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1042
    for _path, movedchange in movedchanges.items():
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1043
        pdiff.addchange(movedchange)
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1044
d5d1edf66091 phabricator: add addadded function
Ian Moody <moz-ian@perix.co.uk>
parents: 43190
diff changeset
  1045
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1046
def creatediff(basectx, ctx):
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1047
    """create a Differential Diff"""
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1048
    repo = ctx.repo()
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1049
    repophid = getrepophid(repo)
43262
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1050
    # Create a "Differential Diff" via "differential.creatediff" API
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1051
    pdiff = phabdiff(
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1052
        sourceControlBaseRevision=b'%s' % basectx.p1().hex(),
43262
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1053
        branch=b'%s' % ctx.branch(),
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1054
    )
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1055
    modified, added, removed, _d, _u, _i, _c = basectx.p1().status(ctx)
43262
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1056
    # addadded will remove moved files from removed, so addremoved won't get
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1057
    # them
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1058
    addadded(pdiff, basectx, ctx, added, removed)
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1059
    addmodified(pdiff, basectx, ctx, modified)
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1060
    addremoved(pdiff, basectx, ctx, removed)
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1061
    if repophid:
43262
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1062
        pdiff.repositoryPHID = repophid
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1063
    diff = callconduit(
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1064
        repo.ui,
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1065
        b'differential.creatediff',
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1066
        pycompat.byteskwargs(attr.asdict(pdiff)),
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1067
    )
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1068
    if not diff:
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1069
        if basectx != ctx:
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1070
            msg = _(b'cannot create diff for %s::%s') % (basectx, ctx)
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1071
        else:
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1072
            msg = _(b'cannot create diff for %s') % ctx
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1073
        raise error.Abort(msg)
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1074
    return diff
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1075
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1076
44647
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1077
def writediffproperties(ctxs, diff):
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1078
    """write metadata to diff so patches could be applied losslessly
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1079
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1080
    ``ctxs`` is the list of commits that created the diff, in ascending order.
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1081
    The list is generally a single commit, but may be several when using
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1082
    ``phabsend --fold``.
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1083
    """
43262
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1084
    # creatediff returns with a diffid but query returns with an id
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1085
    diffid = diff.get(b'diffid', diff.get(b'id'))
44647
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1086
    basectx = ctxs[0]
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1087
    tipctx = ctxs[-1]
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1088
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1089
    params = {
43262
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1090
        b'diff_id': diffid,
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1091
        b'name': b'hg:meta',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1092
        b'data': templatefilters.json(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1093
            {
44647
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1094
                b'user': tipctx.user(),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1095
                b'date': b'%d %d' % tipctx.date(),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1096
                b'branch': tipctx.branch(),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1097
                b'node': tipctx.hex(),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1098
                b'parent': basectx.p1().hex(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1099
            }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1100
        ),
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1101
    }
44647
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1102
    callconduit(basectx.repo().ui, b'differential.setdiffproperty', params)
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1103
44647
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1104
    commits = {}
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1105
    for ctx in ctxs:
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1106
        commits[ctx.hex()] = {
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1107
            b'author': stringutil.person(ctx.user()),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1108
            b'authorEmail': stringutil.email(ctx.user()),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1109
            b'time': int(ctx.date()[0]),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1110
            b'commit': ctx.hex(),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1111
            b'parents': [ctx.p1().hex()],
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1112
            b'branch': ctx.branch(),
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1113
        }
37800
6cf5f5b4eb57 phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents: 37123
diff changeset
  1114
    params = {
43262
af067d29b19e phabricator: switch to the creatediff endpoint
Ian Moody <moz-ian@perix.co.uk>
parents: 43261
diff changeset
  1115
        b'diff_id': diffid,
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1116
        b'name': b'local:commits',
44647
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1117
        b'data': templatefilters.json(commits),
37800
6cf5f5b4eb57 phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents: 37123
diff changeset
  1118
    }
44647
0437959de6f5 phabricator: record all local commits used to create a Differential revision
Matt Harbison <matt_harbison@yahoo.com>
parents: 44615
diff changeset
  1119
    callconduit(basectx.repo().ui, b'differential.setdiffproperty', params)
37800
6cf5f5b4eb57 phabricator: specify some metadata compatibly with arc
Tom Prince <mozilla@hocat.ca>
parents: 37123
diff changeset
  1120
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1121
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1122
def createdifferentialrevision(
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1123
    ctxs,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1124
    revid=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1125
    parentrevphid=None,
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1126
    oldbasenode=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1127
    oldnode=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1128
    olddiff=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1129
    actions=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1130
    comment=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1131
):
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1132
    """create or update a Differential Revision
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1133
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1134
    If revid is None, create a new Differential Revision, otherwise update
42465
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1135
    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
  1136
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1137
    If there is a single commit for the new Differential Revision, ``ctxs`` will
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1138
    be a list of that single context.  Otherwise, it is a list that covers the
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1139
    range of changes for the differential, where ``ctxs[0]`` is the first change
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1140
    to include and ``ctxs[-1]`` is the last.
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1141
33265
95f658b558a3 phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents: 33264
diff changeset
  1142
    If oldnode is not None, check if the patch content (without commit message
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1143
    and metadata) has changed before creating another diff.  For a Revision with
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1144
    a single commit, ``oldbasenode`` and ``oldnode`` have the same value.  For a
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1145
    Revision covering multiple commits, ``oldbasenode`` corresponds to
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1146
    ``ctxs[0]`` the previous time this Revision was posted, and ``oldnode``
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1147
    corresponds to ``ctxs[-1]``.
33498
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1148
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1149
    If actions is not None, they will be appended to the transaction.
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1150
    """
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1151
    ctx = ctxs[-1]
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1152
    basectx = ctxs[0]
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1153
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1154
    repo = ctx.repo()
33265
95f658b558a3 phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents: 33264
diff changeset
  1155
    if oldnode:
33994
27ff2a87d8c0 phabsend: detect patch change with larger context
Jun Wu <quark@fb.com>
parents: 33993
diff changeset
  1156
        diffopts = mdiff.diffopts(git=True, context=32767)
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1157
        unfi = repo.unfiltered()
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1158
        oldctx = unfi[oldnode]
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1159
        oldbasectx = unfi[oldbasenode]
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1160
        neednewdiff = getdiff(basectx, ctx, diffopts) != getdiff(
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1161
            oldbasectx, oldctx, diffopts
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1162
        )
33265
95f658b558a3 phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents: 33264
diff changeset
  1163
    else:
95f658b558a3 phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents: 33264
diff changeset
  1164
        neednewdiff = True
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1165
33265
95f658b558a3 phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents: 33264
diff changeset
  1166
    transactions = []
95f658b558a3 phabricator: do not upload new diff if nothing changes
Jun Wu <quark@fb.com>
parents: 33264
diff changeset
  1167
    if neednewdiff:
44614
53d75fdeaaaa phabricator: add basectx arguments to file related `phabsend` utilities
Matt Harbison <matt_harbison@yahoo.com>
parents: 44613
diff changeset
  1168
        diff = creatediff(basectx, ctx)
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1169
        transactions.append({b'type': b'update', b'value': diff[b'phid']})
42447
29528c4235a1 phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents: 42295
diff changeset
  1170
        if comment:
29528c4235a1 phabricator: add commenting to phabsend for new/updated Diffs
Ian Moody <moz-ian@perix.co.uk>
parents: 42295
diff changeset
  1171
            transactions.append({b'type': b'comment', b'value': comment})
33718
f100354cce52 phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents: 33717
diff changeset
  1172
    else:
f100354cce52 phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents: 33717
diff changeset
  1173
        # Even if we don't need to upload a new diff because the patch content
f100354cce52 phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents: 33717
diff changeset
  1174
        # does not change. We might still need to update its metadata so
f100354cce52 phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents: 33717
diff changeset
  1175
        # pushers could know the correct node metadata.
f100354cce52 phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents: 33717
diff changeset
  1176
        assert olddiff
f100354cce52 phabricator: update diff property even if we choose not to create a new diff
Jun Wu <quark@fb.com>
parents: 33717
diff changeset
  1177
        diff = olddiff
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1178
    writediffproperties(ctxs, diff)
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1179
42465
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1180
    # Set the parent Revision every time, so commit re-ordering is picked-up
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1181
    if parentrevphid:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1182
        transactions.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1183
            {b'type': b'parents.set', b'value': [parentrevphid]}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1184
        )
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1185
33498
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1186
    if actions:
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1187
        transactions += actions
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1188
44648
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1189
    # When folding multiple local commits into a single review, arcanist will
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1190
    # take the summary line of the first commit as the title, and then
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1191
    # concatenate the rest of the remaining messages (including each of their
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1192
    # first lines) to the rest of the first commit message (each separated by
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1193
    # an empty line), and use that as the summary field.  Do the same here.
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1194
    # For commits with only a one line message, there is no summary field, as
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1195
    # this gets assigned to the title.
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1196
    fields = util.sortdict()  # sorted for stable wire protocol in tests
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1197
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1198
    for i, _ctx in enumerate(ctxs):
44648
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1199
        # Parse commit message and update related fields.
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1200
        desc = _ctx.description()
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1201
        info = callconduit(
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1202
            repo.ui, b'differential.parsecommitmessage', {b'corpus': desc}
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1203
        )
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1204
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1205
        for k in [b'title', b'summary', b'testPlan']:
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1206
            v = info[b'fields'].get(k)
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1207
            if not v:
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1208
                continue
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1209
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1210
            if i == 0:
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1211
                # Title, summary and test plan (if present) are taken verbatim
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1212
                # for the first commit.
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1213
                fields[k] = v.rstrip()
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1214
                continue
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1215
            elif k == b'title':
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1216
                # Add subsequent titles (i.e. the first line of the commit
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1217
                # message) back to the summary.
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1218
                k = b'summary'
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1219
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1220
            # Append any current field to the existing composite field
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1221
            fields[k] = b'\n\n'.join(filter(None, [fields.get(k), v.rstrip()]))
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1222
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1223
    for k, v in fields.items():
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1224
        transactions.append({b'type': k, b'value': v})
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1225
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1226
    params = {b'transactions': transactions}
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1227
    if revid is not None:
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1228
        # Update an existing Differential Revision
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1229
        params[b'objectIdentifier'] = revid
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1230
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
  1231
    revision = callconduit(repo.ui, b'differential.revision.edit', params)
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1232
    if not revision:
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1233
        if len(ctxs) == 1:
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1234
            msg = _(b'cannot create revision for %s') % ctx
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1235
        else:
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1236
            msg = _(b'cannot create revision for %s::%s') % (basectx, ctx)
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1237
        raise error.Abort(msg)
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1238
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1239
    return revision, diff
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1240
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1241
44445
ddcb51390891 phabricator: pass ui instead of repo to `userphids()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44444
diff changeset
  1242
def userphids(ui, names):
33498
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1243
    """convert user names to PHIDs"""
41716
570e62f1dcf2 phabricator: make user searches case-insensitive
Julien Cristau <jcristau@mozilla.com>
parents: 41546
diff changeset
  1244
    names = [name.lower() for name in names]
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1245
    query = {b'constraints': {b'usernames': names}}
44445
ddcb51390891 phabricator: pass ui instead of repo to `userphids()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44444
diff changeset
  1246
    result = callconduit(ui, b'user.search', query)
33498
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1247
    # 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
  1248
    # some names here.
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1249
    data = result[b'data']
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44456
diff changeset
  1250
    resolved = {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
  1251
    unresolved = set(names) - resolved
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1252
    if unresolved:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1253
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1254
            _(b'unknown username: %s') % b' '.join(sorted(unresolved))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1255
        )
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1256
    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
  1257
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1258
44652
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1259
def _print_phabsend_action(ui, ctx, newrevid, action):
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1260
    """print the ``action`` that occurred when posting ``ctx`` for review
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1261
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1262
    This is a utility function for the sending phase of ``phabsend``, which
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1263
    makes it easier to show a status for all local commits with `--fold``.
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1264
    """
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1265
    actiondesc = ui.label(
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1266
        {
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1267
            b'created': _(b'created'),
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1268
            b'skipped': _(b'skipped'),
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1269
            b'updated': _(b'updated'),
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1270
        }[action],
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1271
        b'phabricator.action.%s' % action,
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1272
    )
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1273
    drevdesc = ui.label(b'D%d' % newrevid, b'phabricator.drev')
45795
294aab57a5f3 phabsend: use default one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45513
diff changeset
  1274
    summary = cmdutil.format_changeset_summary(ui, ctx, b'phabsend')
294aab57a5f3 phabsend: use default one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45513
diff changeset
  1275
    ui.write(_(b'%s - %s - %s\n') % (drevdesc, actiondesc, summary))
44652
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1276
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1277
44651
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1278
def _amend_diff_properties(unfi, drevid, newnodes, diff):
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1279
    """update the local commit list for the ``diff`` associated with ``drevid``
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1280
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1281
    This is a utility function for the amend phase of ``phabsend``, which
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1282
    converts failures to warning messages.
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1283
    """
44715
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
  1284
    _debug(
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
  1285
        unfi.ui,
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
  1286
        b"new commits: %s\n" % stringutil.pprint([short(n) for n in newnodes]),
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
  1287
    )
38f7b2f02f6d phabricator: add debug logging to show previous node values in `phabsend`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44652
diff changeset
  1288
44651
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1289
    try:
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1290
        writediffproperties([unfi[newnode] for newnode in newnodes], diff)
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1291
    except util.urlerr.urlerror:
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1292
        # If it fails just warn and keep going, otherwise the DREV
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1293
        # associations will be lost
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1294
        unfi.ui.warnnoi18n(b'Failed to update metadata for D%d\n' % drevid)
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1295
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1296
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1297
@vcrcommand(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1298
    b'phabsend',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1299
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1300
        (b'r', b'rev', [], _(b'revisions to send'), _(b'REV')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1301
        (b'', b'amend', True, _(b'update commit messages')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1302
        (b'', b'reviewer', [], _(b'specify reviewers')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1303
        (b'', b'blocker', [], _(b'specify blocking reviewers')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1304
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1305
            b'm',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1306
            b'comment',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1307
            b'',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1308
            _(b'add a comment to Revisions with new/updated Diffs'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1309
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1310
        (b'', b'confirm', None, _(b'ask for confirmation before sending')),
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1311
        (b'', b'fold', False, _(b'combine the revisions into one review')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1312
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1313
    _(b'REV [OPTIONS]'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1314
    helpcategory=command.CATEGORY_IMPORT_EXPORT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1315
)
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1316
def phabsend(ui, repo, *revs, **opts):
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1317
    """upload changesets to Phabricator
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1318
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1319
    If there are multiple revisions specified, they will be send as a stack
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1320
    with a linear dependencies relationship using the order specified by the
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1321
    revset.
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1322
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1323
    For the first time uploading changesets, local tags will be created to
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1324
    maintain the association. After the first time, phabsend will check
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1325
    obsstore and tags information so it can figure out whether to update an
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1326
    existing Differential Revision, or create a new one.
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1327
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1328
    If --amend is set, update commit messages so they have the
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1329
    ``Differential Revision`` URL, remove related tags. This is similar to what
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1330
    arcanist will do, and is more desired in author-push workflows. Otherwise,
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1331
    use local tags to record the ``Differential Revision`` association.
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1332
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1333
    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
  1334
    can also add following to your configuration file to make it default
33992
45a8cd74de4e phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents: 33855
diff changeset
  1335
    behaviour::
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1336
33992
45a8cd74de4e phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents: 33855
diff changeset
  1337
        [phabsend]
45a8cd74de4e phabsend: polish the docstring a bit
Jun Wu <quark@fb.com>
parents: 33855
diff changeset
  1338
        confirm = true
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1339
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1340
    By default, a separate review will be created for each commit that is
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1341
    selected, and will have the same parent/child relationship in Phabricator.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1342
    If ``--fold`` is set, multiple commits are rolled up into a single review
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1343
    as if diffed from the parent of the first revision to the last.  The commit
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1344
    messages are concatenated in the summary field on Phabricator.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1345
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1346
    phabsend will check obsstore and the above association to decide whether to
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1347
    update an existing Differential Revision, or create a new one.
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1348
    """
41975
51ba9fbcca52 py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents: 41955
diff changeset
  1349
    opts = pycompat.byteskwargs(opts)
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1350
    revs = list(revs) + opts.get(b'rev', [])
48128
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 47084
diff changeset
  1351
    revs = logcmdutil.revrange(repo, revs)
44076
a7c4bcf7018a phabricator: post revisions in ascending topological order (issue6241)
Matt Harbison <matt_harbison@yahoo.com>
parents: 43869
diff changeset
  1352
    revs.sort()  # ascending order to preserve topological parent/child in phab
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1353
33266
5b2391b46906 phabricator: abort if phabsend gets empty revs
Jun Wu <quark@fb.com>
parents: 33265
diff changeset
  1354
    if not revs:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1355
        raise error.Abort(_(b'phabsend requires at least one changeset'))
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1356
    if opts.get(b'amend'):
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1357
        cmdutil.checkunfinished(repo)
33266
5b2391b46906 phabricator: abort if phabsend gets empty revs
Jun Wu <quark@fb.com>
parents: 33265
diff changeset
  1358
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1359
    ctxs = [repo[rev] for rev in revs]
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1360
44719
c482e2fe444c phabricator: prevent posting obsolete commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44718
diff changeset
  1361
    if any(c for c in ctxs if c.obsolete()):
c482e2fe444c phabricator: prevent posting obsolete commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44718
diff changeset
  1362
        raise error.Abort(_(b"obsolete commits cannot be posted for review"))
c482e2fe444c phabricator: prevent posting obsolete commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44718
diff changeset
  1363
44758
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1364
    # Ensure the local commits are an unbroken range.  The semantics of the
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1365
    # --fold option implies this, and the auto restacking of orphans requires
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1366
    # it.  Otherwise A+C in A->B->C will cause B to be orphaned, and C' to
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1367
    # get A' as a parent.
45152
b3b0cd8b9366 phabricator: clarify the multiple heads/roots error message for phabsend
Matt Harbison <matt_harbison@yahoo.com>
parents: 45140
diff changeset
  1368
    def _fail_nonlinear_revs(revs, revtype):
b3b0cd8b9366 phabricator: clarify the multiple heads/roots error message for phabsend
Matt Harbison <matt_harbison@yahoo.com>
parents: 45140
diff changeset
  1369
        badnodes = [repo[r].node() for r in revs]
44758
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1370
        raise error.Abort(
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1371
            _(b"cannot phabsend multiple %s revisions: %s")
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1372
            % (revtype, scmutil.nodesummaries(repo, badnodes)),
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1373
            hint=_(b"the revisions must form a linear chain"),
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1374
        )
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1375
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1376
    heads = repo.revs(b'heads(%ld)', revs)
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1377
    if len(heads) > 1:
45152
b3b0cd8b9366 phabricator: clarify the multiple heads/roots error message for phabsend
Matt Harbison <matt_harbison@yahoo.com>
parents: 45140
diff changeset
  1378
        _fail_nonlinear_revs(heads, b"head")
44758
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1379
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1380
    roots = repo.revs(b'roots(%ld)', revs)
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1381
    if len(roots) > 1:
45152
b3b0cd8b9366 phabricator: clarify the multiple heads/roots error message for phabsend
Matt Harbison <matt_harbison@yahoo.com>
parents: 45140
diff changeset
  1382
        _fail_nonlinear_revs(roots, b"root")
44758
c1c922391314 phabricator: ensure that `phabsend` is given a contiguous, linear commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44720
diff changeset
  1383
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1384
    fold = opts.get(b'fold')
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1385
    if fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1386
        if len(revs) == 1:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1387
            # TODO: just switch to --no-fold instead?
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1388
            raise error.Abort(_(b"cannot fold a single revision"))
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1389
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1390
        # There's no clear way to manage multiple commits with a Dxxx tag, so
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1391
        # require the amend option.  (We could append "_nnn", but then it
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1392
        # becomes jumbled if earlier commits are added to an update.)  It should
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1393
        # lock the repo and ensure that the range is editable, but that would
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1394
        # make the code pretty convoluted.  The default behavior of `arc` is to
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1395
        # create a new review anyway.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1396
        if not opts.get(b"amend"):
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1397
            raise error.Abort(_(b"cannot fold with --no-amend"))
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1398
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1399
        # It might be possible to bucketize the revisions by the DREV value, and
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1400
        # iterate over those groups when posting, and then again when amending.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1401
        # But for simplicity, require all selected revisions to be for the same
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1402
        # DREV (if present).  Adding local revisions to an existing DREV is
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1403
        # acceptable.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1404
        drevmatchers = [
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1405
            _differentialrevisiondescre.search(ctx.description())
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1406
            for ctx in ctxs
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1407
        ]
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1408
        if len({m.group('url') for m in drevmatchers if m}) > 1:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1409
            raise error.Abort(
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1410
                _(b"cannot fold revisions with different DREV values")
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1411
            )
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1412
33996
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1413
    # {newnode: (oldnode, olddiff, olddrev}
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1414
    oldmap = getoldnodedrevmap(repo, [repo[r].node() for r in revs])
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1415
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1416
    confirm = ui.configbool(b'phabsend', b'confirm')
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1417
    confirm |= bool(opts.get(b'confirm'))
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1418
    if confirm:
33996
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1419
        confirmed = _confirmbeforesend(repo, revs, oldmap)
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1420
        if not confirmed:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1421
            raise error.Abort(_(b'phabsend cancelled'))
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1422
33498
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1423
    actions = []
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1424
    reviewers = opts.get(b'reviewer', [])
42460
f33d3ee110da phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents: 42459
diff changeset
  1425
    blockers = opts.get(b'blocker', [])
f33d3ee110da phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents: 42459
diff changeset
  1426
    phids = []
33498
b7a75b9a3386 phabricator: allow specifying reviewers on phabsend
Jun Wu <quark@fb.com>
parents: 33443
diff changeset
  1427
    if reviewers:
44445
ddcb51390891 phabricator: pass ui instead of repo to `userphids()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44444
diff changeset
  1428
        phids.extend(userphids(repo.ui, reviewers))
42460
f33d3ee110da phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents: 42459
diff changeset
  1429
    if blockers:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1430
        phids.extend(
44445
ddcb51390891 phabricator: pass ui instead of repo to `userphids()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44444
diff changeset
  1431
            map(
ddcb51390891 phabricator: pass ui instead of repo to `userphids()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44444
diff changeset
  1432
                lambda phid: b'blocking(%s)' % phid,
ddcb51390891 phabricator: pass ui instead of repo to `userphids()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44444
diff changeset
  1433
                userphids(repo.ui, blockers),
ddcb51390891 phabricator: pass ui instead of repo to `userphids()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44444
diff changeset
  1434
            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1435
        )
42460
f33d3ee110da phabricator: add --blocker argument to phabsend to specify blocking reviewers
Ian Moody <moz-ian@perix.co.uk>
parents: 42459
diff changeset
  1436
    if phids:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1437
        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
  1438
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1439
    drevids = []  # [int]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1440
    diffmap = {}  # {newnode: diff}
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1441
42465
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1442
    # Send patches one by one so we know their Differential Revision PHIDs and
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1443
    # can provide dependency relationship
42465
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1444
    lastrevphid = None
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1445
    for ctx in ctxs:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1446
        if fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1447
            ui.debug(b'sending rev %d::%d\n' % (ctx.rev(), ctxs[-1].rev()))
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1448
        else:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1449
            ui.debug(b'sending rev %d\n' % ctx.rev())
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1450
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1451
        # Get Differential Revision ID
33717
1664406a44d9 phabricator: use Phabricator's last node information
Jun Wu <quark@fb.com>
parents: 33716
diff changeset
  1452
        oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None))
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1453
        oldbasenode, oldbasediff, oldbaserevid = oldnode, olddiff, revid
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1454
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1455
        if fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1456
            oldbasenode, oldbasediff, oldbaserevid = oldmap.get(
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1457
                ctxs[-1].node(), (None, None, None)
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1458
            )
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1459
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1460
        if oldnode != ctx.node() or opts.get(b'amend'):
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1461
            # Create or update Differential Revision
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1462
            revision, diff = createdifferentialrevision(
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1463
                ctxs if fold else [ctx],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1464
                revid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1465
                lastrevphid,
44649
419fec8237b7 phabricator: teach createdifferentialrevision() to allow a folded commit range
Matt Harbison <matt_harbison@yahoo.com>
parents: 44648
diff changeset
  1466
                oldbasenode,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1467
                oldnode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1468
                olddiff,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1469
                actions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1470
                opts.get(b'comment'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1471
            )
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1472
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1473
            if fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1474
                for ctx in ctxs:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1475
                    diffmap[ctx.node()] = diff
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1476
            else:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1477
                diffmap[ctx.node()] = diff
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1478
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1479
            newrevid = int(revision[b'object'][b'id'])
42465
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1480
            newrevphid = revision[b'object'][b'phid']
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1481
            if revid:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1482
                action = b'updated'
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1483
            else:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1484
                action = b'created'
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1485
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1486
            # Create a local tag to note the association, if commit message
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1487
            # does not have it already
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1488
            if not fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1489
                m = _differentialrevisiondescre.search(ctx.description())
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1490
                if not m or int(m.group('id')) != newrevid:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1491
                    tagname = b'D%d' % newrevid
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1492
                    tags.tag(
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1493
                        repo,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1494
                        tagname,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1495
                        ctx.node(),
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1496
                        message=None,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1497
                        user=None,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1498
                        date=None,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1499
                        local=True,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1500
                    )
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1501
        else:
42465
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1502
            # Nothing changed. But still set "newrevphid" so the next revision
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1503
            # could depend on this one and "newrevid" for the summary line.
44444
df8053082364 phabricator: pass ui instead of repo to `querydrev()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44443
diff changeset
  1504
            newrevphid = querydrev(repo.ui, b'%d' % revid)[0][b'phid']
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1505
            newrevid = revid
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1506
            action = b'skipped'
33201
228ad1e58a85 phabricator: add phabsend command to send a stack
Jun Wu <quark@fb.com>
parents: 33200
diff changeset
  1507
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1508
        drevids.append(newrevid)
42465
c19d259fd6ad phabricator: use parents.set to always set dependencies
Ian Moody <moz-ian@perix.co.uk>
parents: 42460
diff changeset
  1509
        lastrevphid = newrevphid
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  1510
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1511
        if fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1512
            for c in ctxs:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1513
                if oldmap.get(c.node(), (None, None, None))[2]:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1514
                    action = b'updated'
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1515
                else:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1516
                    action = b'created'
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1517
                _print_phabsend_action(ui, c, newrevid, action)
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1518
            break
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1519
44652
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1520
        _print_phabsend_action(ui, ctx, newrevid, action)
949a87145336 phabricator: extract logic to print the status when posting a commit
Matt Harbison <matt_harbison@yahoo.com>
parents: 44651
diff changeset
  1521
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1522
    # Update commit messages and remove tags
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1523
    if opts.get(b'amend'):
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1524
        unfi = repo.unfiltered()
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
  1525
        drevs = callconduit(ui, b'differential.query', {b'ids': drevids})
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1526
        with repo.wlock(), repo.lock(), repo.transaction(b'phabsend'):
44720
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1527
            # Eagerly evaluate commits to restabilize before creating new
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1528
            # commits.  The selected revisions are excluded because they are
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1529
            # automatically restacked as part of the submission process.
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1530
            restack = [
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1531
                c
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1532
                for c in repo.set(
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1533
                    b"(%ld::) - (%ld) - unstable() - obsolete() - public()",
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1534
                    revs,
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1535
                    revs,
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1536
                )
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1537
            ]
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1538
            wnode = unfi[b'.'].node()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1539
            mapping = {}  # {oldnode: [newnode]}
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1540
            newnodes = []
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1541
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1542
            drevid = drevids[0]
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1543
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1544
            for i, rev in enumerate(revs):
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1545
                old = unfi[rev]
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1546
                if not fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1547
                    drevid = drevids[i]
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1548
                drev = [d for d in drevs if int(d[b'id']) == drevid][0]
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1549
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1550
                newdesc = get_amended_desc(drev, old, fold)
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1551
                # Make sure commit message contain "Differential Revision"
44718
0680b8a1992a phabricator: avoid creating unstable children within the review stack
Matt Harbison <matt_harbison@yahoo.com>
parents: 44717
diff changeset
  1552
                if (
0680b8a1992a phabricator: avoid creating unstable children within the review stack
Matt Harbison <matt_harbison@yahoo.com>
parents: 44717
diff changeset
  1553
                    old.description() != newdesc
0680b8a1992a phabricator: avoid creating unstable children within the review stack
Matt Harbison <matt_harbison@yahoo.com>
parents: 44717
diff changeset
  1554
                    or old.p1().node() in mapping
0680b8a1992a phabricator: avoid creating unstable children within the review stack
Matt Harbison <matt_harbison@yahoo.com>
parents: 44717
diff changeset
  1555
                    or old.p2().node() in mapping
0680b8a1992a phabricator: avoid creating unstable children within the review stack
Matt Harbison <matt_harbison@yahoo.com>
parents: 44717
diff changeset
  1556
                ):
41163
0101a35deae2 phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents: 41083
diff changeset
  1557
                    if old.phase() == phases.public:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1558
                        ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1559
                            _(b"warning: not updating public commit %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1560
                            % scmutil.formatchangeid(old)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1561
                        )
41163
0101a35deae2 phabricator: warn if unable to amend, instead of aborting after posting
Matt Harbison <matt_harbison@yahoo.com>
parents: 41083
diff changeset
  1562
                        continue
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1563
                    parents = [
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1564
                        mapping.get(old.p1().node(), (old.p1(),))[0],
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1565
                        mapping.get(old.p2().node(), (old.p2(),))[0],
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1566
                    ]
45437
1a5d3e555c70 phabricator: update the hashes in commit messages as they get submitted
Matt Harbison <matt_harbison@yahoo.com>
parents: 45272
diff changeset
  1567
                    newdesc = rewriteutil.update_hash_refs(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  1568
                        repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  1569
                        newdesc,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  1570
                        mapping,
45437
1a5d3e555c70 phabricator: update the hashes in commit messages as they get submitted
Matt Harbison <matt_harbison@yahoo.com>
parents: 45272
diff changeset
  1571
                    )
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1572
                    new = context.metadataonlyctx(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1573
                        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1574
                        old,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1575
                        parents=parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1576
                        text=newdesc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1577
                        user=old.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1578
                        date=old.date(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1579
                        extra=old.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1580
                    )
38342
bb7e3c6ef592 phabricator: preserve the phase when amending in the Differential fields
Matt Harbison <matt_harbison@yahoo.com>
parents: 38075
diff changeset
  1581
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38398
diff changeset
  1582
                    newnode = new.commit()
38342
bb7e3c6ef592 phabricator: preserve the phase when amending in the Differential fields
Matt Harbison <matt_harbison@yahoo.com>
parents: 38075
diff changeset
  1583
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1584
                    mapping[old.node()] = [newnode]
44651
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1585
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1586
                    if fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1587
                        # Defer updating the (single) Diff until all nodes are
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1588
                        # collected.  No tags were created, so none need to be
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1589
                        # removed.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1590
                        newnodes.append(newnode)
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1591
                        continue
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1592
44651
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1593
                    _amend_diff_properties(
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1594
                        unfi, drevid, [newnode], diffmap[old.node()]
99fa161a883c phabricator: extract the logic to amend diff properties to a function
Matt Harbison <matt_harbison@yahoo.com>
parents: 44650
diff changeset
  1595
                    )
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1596
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1597
                    # Remove local tags since it's no longer necessary
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1598
                    tagname = b'D%d' % drevid
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1599
                    if tagname in repo.tags():
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1600
                        tags.tag(
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1601
                            repo,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1602
                            tagname,
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
  1603
                            repo.nullid,
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1604
                            message=None,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1605
                            user=None,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1606
                            date=None,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1607
                            local=True,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1608
                        )
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1609
                elif fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1610
                    # When folding multiple commits into one review with
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1611
                    # --fold, track even the commits that weren't amended, so
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1612
                    # that their association isn't lost if the properties are
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1613
                    # rewritten below.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1614
                    newnodes.append(old.node())
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1615
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1616
            # If the submitted commits are public, no amend takes place so
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1617
            # there are no newnodes and therefore no diff update to do.
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1618
            if fold and newnodes:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1619
                diff = diffmap[old.node()]
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1620
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1621
                # The diff object in diffmap doesn't have the local commits
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1622
                # because that could be returned from differential.creatediff,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1623
                # not differential.querydiffs.  So use the queried diff (if
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1624
                # present), or force the amend (a new revision is being posted.)
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1625
                if not olddiff or set(newnodes) != getlocalcommits(olddiff):
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1626
                    _debug(ui, b"updating local commit list for D%d\n" % drevid)
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1627
                    _amend_diff_properties(unfi, drevid, newnodes, diff)
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1628
                else:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1629
                    _debug(
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1630
                        ui,
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1631
                        b"local commit list for D%d is already up-to-date\n"
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1632
                        % drevid,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1633
                    )
44717
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1634
            elif fold:
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1635
                _debug(ui, b"no newnodes to update\n")
3dc6a70779f2 phabricator: add an option to fold several commits into one review (issue6244)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44715
diff changeset
  1636
44720
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1637
            # Restack any children of first-time submissions that were orphaned
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1638
            # in the process.  The ctx won't report that it is an orphan until
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1639
            # the cleanup takes place below.
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1640
            for old in restack:
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1641
                parents = [
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1642
                    mapping.get(old.p1().node(), (old.p1(),))[0],
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1643
                    mapping.get(old.p2().node(), (old.p2(),))[0],
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1644
                ]
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1645
                new = context.metadataonlyctx(
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1646
                    repo,
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1647
                    old,
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1648
                    parents=parents,
45437
1a5d3e555c70 phabricator: update the hashes in commit messages as they get submitted
Matt Harbison <matt_harbison@yahoo.com>
parents: 45272
diff changeset
  1649
                    text=rewriteutil.update_hash_refs(
1a5d3e555c70 phabricator: update the hashes in commit messages as they get submitted
Matt Harbison <matt_harbison@yahoo.com>
parents: 45272
diff changeset
  1650
                        repo, old.description(), mapping
1a5d3e555c70 phabricator: update the hashes in commit messages as they get submitted
Matt Harbison <matt_harbison@yahoo.com>
parents: 45272
diff changeset
  1651
                    ),
44720
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1652
                    user=old.user(),
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1653
                    date=old.date(),
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1654
                    extra=old.extra(),
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1655
                )
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1656
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1657
                newnode = new.commit()
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1658
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1659
                # Don't obsolete unselected descendants of nodes that have not
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1660
                # been changed in this transaction- that results in an error.
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1661
                if newnode != old.node():
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1662
                    mapping[old.node()] = [newnode]
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1663
                    _debug(
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1664
                        ui,
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1665
                        b"restabilizing %s as %s\n"
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1666
                        % (short(old.node()), short(newnode)),
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1667
                    )
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1668
                else:
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1669
                    _debug(
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1670
                        ui,
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1671
                        b"not restabilizing unchanged %s\n" % short(old.node()),
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1672
                    )
601ce5392cb0 phabricator: restack any new orphans created by phabsend (issue6045)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44719
diff changeset
  1673
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38398
diff changeset
  1674
            scmutil.cleanupnodes(repo, mapping, b'phabsend', fixphase=True)
33808
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1675
            if wnode in mapping:
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1676
                unfi.setparents(mapping[wnode][0])
fa3aa6c98bb7 phabricator: add --amend option to phabsend
Jun Wu <quark@fb.com>
parents: 33806
diff changeset
  1677
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1678
33264
266321579c68 phabricator: add node and p1 to hg:meta property
Jun Wu <quark@fb.com>
parents: 33263
diff changeset
  1679
# 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
  1680
# consistent with "hg export" output.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1681
_metanamemap = util.sortdict(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1682
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1683
        (b'user', b'User'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1684
        (b'date', b'Date'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1685
        (b'branch', b'Branch'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1686
        (b'node', b'Node ID'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1687
        (b'parent', b'Parent '),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1688
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1689
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1690
33264
266321579c68 phabricator: add node and p1 to hg:meta property
Jun Wu <quark@fb.com>
parents: 33263
diff changeset
  1691
33996
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1692
def _confirmbeforesend(repo, revs, oldmap):
42449
500b64c5d991 phabricator: pass ui into readurltoken instead of passing repo
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42447
diff changeset
  1693
    url, token = readurltoken(repo.ui)
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1694
    ui = repo.ui
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1695
    for rev in revs:
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1696
        ctx = repo[rev]
33996
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1697
        oldnode, olddiff, drevid = oldmap.get(ctx.node(), (None, None, None))
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1698
        if drevid:
43321
a2ff3aff81d2 py3: use %d instead of %s when formatting an int into a bytestring
Ian Moody <moz-ian@perix.co.uk>
parents: 43282
diff changeset
  1699
            drevdesc = ui.label(b'D%d' % drevid, b'phabricator.drev')
33996
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1700
        else:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1701
            drevdesc = ui.label(_(b'NEW'), b'phabricator.drev')
33996
088598153aa2 phabsend: show associated Differential Revisions with --confirm
Jun Wu <quark@fb.com>
parents: 33995
diff changeset
  1702
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1703
        ui.write(
45795
294aab57a5f3 phabsend: use default one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45513
diff changeset
  1704
            _(b'%s - %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1705
            % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1706
                drevdesc,
45795
294aab57a5f3 phabsend: use default one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45513
diff changeset
  1707
                cmdutil.format_changeset_summary(ui, ctx, b'phabsend'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1708
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1709
        )
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1710
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1711
    if ui.promptchoice(
44986
7a0a1be721a3 phabricator: make it clear what happen when no response
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 44906
diff changeset
  1712
        _(b'Send the above changes to %s (Y/n)?$$ &Yes $$ &No') % url
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1713
    ):
33716
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1714
        return False
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1715
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1716
    return True
40cfe3197bc1 phabricator: add --confirm option to phabsend command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33601
diff changeset
  1717
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1718
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1719
_knownstatusnames = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1720
    b'accepted',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1721
    b'needsreview',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1722
    b'needsrevision',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1723
    b'closed',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1724
    b'abandoned',
43868
74ec6ca0eb75 phabricator: add the "Changes Planned" status name
Matt Harbison <matt_harbison@yahoo.com>
parents: 43858
diff changeset
  1725
    b'changesplanned',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1726
}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1727
33854
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  1728
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  1729
def _getstatusname(drev):
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  1730
    """get normalized status name from a Differential Revision"""
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1731
    return drev[b'statusName'].replace(b' ', b'').lower()
33854
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  1732
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1733
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1734
# Small language to specify differential revisions. Support symbols: (), :X,
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1735
# +, and -.
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1736
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1737
_elements = {
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1738
    # token-type: binding-strength, primary, prefix, infix, suffix
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1739
    b'(': (12, None, (b'group', 1, b')'), None, None),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1740
    b':': (8, None, (b'ancestors', 8), None, None),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1741
    b'&': (5, None, None, (b'and_', 5), None),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1742
    b'+': (4, None, None, (b'add', 4), None),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1743
    b'-': (4, None, None, (b'sub', 4), None),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1744
    b')': (0, None, None, None, None),
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1745
    b'symbol': (0, b'symbol', None, None, None),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1746
    b'end': (0, None, None, None, None),
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1747
}
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1748
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1749
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1750
def _tokenize(text):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1751
    view = memoryview(text)  # zero-copy slice
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1752
    special = b'():+-& '
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1753
    pos = 0
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1754
    length = len(text)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1755
    while pos < length:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1756
        symbol = b''.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1757
            itertools.takewhile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1758
                lambda ch: ch not in special, pycompat.iterbytestr(view[pos:])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1759
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1760
        )
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1761
        if symbol:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1762
            yield (b'symbol', symbol, pos)
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1763
            pos += len(symbol)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1764
        else:  # special char, ignore space
43282
47946f08e463 py3: don't index into bytes in phabricator's _tokenize()
Ian Moody <moz-ian@perix.co.uk>
parents: 43264
diff changeset
  1765
            if text[pos : pos + 1] != b' ':
47946f08e463 py3: don't index into bytes in phabricator's _tokenize()
Ian Moody <moz-ian@perix.co.uk>
parents: 43264
diff changeset
  1766
                yield (text[pos : pos + 1], None, pos)
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1767
            pos += 1
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1768
    yield (b'end', None, pos)
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1769
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1770
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1771
def _parse(text):
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1772
    tree, pos = parser.parser(_elements).parse(_tokenize(text))
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1773
    if pos != len(text):
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1774
        raise error.ParseError(b'invalid token', pos)
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1775
    return tree
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1776
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1777
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1778
def _parsedrev(symbol):
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1779
    """str -> int or None, ex. 'D45' -> 45; '12' -> 12; 'x' -> None"""
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1780
    if symbol.startswith(b'D') and symbol[1:].isdigit():
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1781
        return int(symbol[1:])
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1782
    if symbol.isdigit():
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1783
        return int(symbol)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1784
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1785
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1786
def _prefetchdrevs(tree):
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1787
    """return ({single-drev-id}, {ancestor-drev-id}) to prefetch"""
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1788
    drevs = set()
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1789
    ancestordrevs = set()
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1790
    op = tree[0]
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1791
    if op == b'symbol':
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1792
        r = _parsedrev(tree[1])
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1793
        if r:
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1794
            drevs.add(r)
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1795
    elif op == b'ancestors':
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1796
        r, a = _prefetchdrevs(tree[1])
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1797
        drevs.update(r)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1798
        ancestordrevs.update(r)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1799
        ancestordrevs.update(a)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1800
    else:
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1801
        for t in tree[1:]:
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1802
            r, a = _prefetchdrevs(t)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1803
            drevs.update(r)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1804
            ancestordrevs.update(a)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1805
    return drevs, ancestordrevs
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1806
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1807
44444
df8053082364 phabricator: pass ui instead of repo to `querydrev()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44443
diff changeset
  1808
def querydrev(ui, spec):
33267
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1809
    """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
  1810
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1811
    spec is a string using a simple query language, see docstring in phabread
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1812
    for details.
33267
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1813
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1814
    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
  1815
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1816
        {
44424
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1817
            "activeDiffPHID": "PHID-DIFF-xoqnjkobbm6k4dk6hi72",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1818
            "authorPHID": "PHID-USER-tv3ohwc4v4jeu34otlye",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1819
            "auxiliary": {
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1820
              "phabricator:depends-on": [
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1821
                "PHID-DREV-gbapp366kutjebt7agcd"
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1822
              ]
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1823
              "phabricator:projects": [],
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1824
            },
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1825
            "branch": "default",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1826
            "ccs": [],
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1827
            "commits": [],
33267
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1828
            "dateCreated": "1499181406",
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1829
            "dateModified": "1499182103",
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1830
            "diffs": [
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1831
              "3",
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1832
              "4",
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1833
            ],
44424
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1834
            "hashes": [],
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1835
            "id": "2",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1836
            "lineCount": "2",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1837
            "phid": "PHID-DREV-672qvysjcczopag46qty",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1838
            "properties": {},
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1839
            "repositoryPHID": "PHID-REPO-hub2hx62ieuqeheznasv",
33267
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1840
            "reviewers": [],
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1841
            "sourcePath": null
44424
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1842
            "status": "0",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1843
            "statusName": "Needs Review",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1844
            "summary": "",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1845
            "testPlan": "",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1846
            "title": "example",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1847
            "uri": "https://phab.example.com/D2",
33267
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1848
        }
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  1849
    """
44424
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1850
    # TODO: replace differential.query and differential.querydiffs with
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1851
    # differential.diff.search because the former (and their output) are
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1852
    # frozen, and planned to be deprecated and removed.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1853
33269
ead6749354e1 phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents: 33268
diff changeset
  1854
    def fetch(params):
ead6749354e1 phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents: 33268
diff changeset
  1855
        """params -> single drev or None"""
41907
59bae59b7498 py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents: 41906
diff changeset
  1856
        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
  1857
        if key in prefetched:
ead6749354e1 phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents: 33268
diff changeset
  1858
            return prefetched[key]
44444
df8053082364 phabricator: pass ui instead of repo to `querydrev()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44443
diff changeset
  1859
        drevs = callconduit(ui, b'differential.query', params)
33269
ead6749354e1 phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents: 33268
diff changeset
  1860
        # Fill prefetched with the result
ead6749354e1 phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents: 33268
diff changeset
  1861
        for drev in drevs:
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1862
            prefetched[drev[b'phid']] = drev
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1863
            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
  1864
        if key not in prefetched:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1865
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1866
                _(b'cannot get Differential Revision %r') % params
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1867
            )
33269
ead6749354e1 phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents: 33268
diff changeset
  1868
        return prefetched[key]
ead6749354e1 phabricator: try to fetch differential revisions in batch
Jun Wu <quark@fb.com>
parents: 33268
diff changeset
  1869
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1870
    def getstack(topdrevids):
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1871
        """given a top, get a stack from the bottom, [id] -> [id]"""
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1872
        visited = set()
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1873
        result = []
41907
59bae59b7498 py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents: 41906
diff changeset
  1874
        queue = [{b'ids': [i]} for i in topdrevids]
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1875
        while queue:
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1876
            params = queue.pop()
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1877
            drev = fetch(params)
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1878
            if drev[b'id'] in visited:
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1879
                continue
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1880
            visited.add(drev[b'id'])
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1881
            result.append(int(drev[b'id']))
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1882
            auxiliary = drev.get(b'auxiliary', {})
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1883
            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
  1884
            for phid in depends:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1885
                queue.append({b'phids': [phid]})
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1886
        result.reverse()
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1887
        return smartset.baseset(result)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1888
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1889
    # Initialize prefetch cache
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1890
    prefetched = {}  # {id or phid: drev}
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1891
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1892
    tree = _parse(spec)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1893
    drevs, ancestordrevs = _prefetchdrevs(tree)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1894
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1895
    # developer config: phabricator.batchsize
44444
df8053082364 phabricator: pass ui instead of repo to `querydrev()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44443
diff changeset
  1896
    batchsize = ui.configint(b'phabricator', b'batchsize')
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1897
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1898
    # Prefetch Differential Revisions in batch
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1899
    tofetch = set(drevs)
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1900
    for r in ancestordrevs:
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1901
        tofetch.update(range(max(1, r - batchsize), r + 1))
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1902
    if drevs:
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1903
        fetch({b'ids': list(tofetch)})
33854
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  1904
    validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs))
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1905
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1906
    # Walk through the tree, return smartsets
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1907
    def walk(tree):
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1908
        op = tree[0]
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1909
        if op == b'symbol':
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1910
            drev = _parsedrev(tree[1])
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1911
            if drev:
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1912
                return smartset.baseset([drev])
33854
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  1913
            elif tree[1] in _knownstatusnames:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1914
                drevs = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1915
                    r
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1916
                    for r in validids
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1917
                    if _getstatusname(prefetched[r]) == tree[1]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1918
                ]
33854
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  1919
                return smartset.baseset(drevs)
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1920
            else:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1921
                raise error.Abort(_(b'unknown symbol: %s') % tree[1])
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1922
        elif op in {b'and_', b'add', b'sub'}:
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1923
            assert len(tree) == 3
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1924
            return getattr(operator, op)(walk(tree[1]), walk(tree[2]))
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1925
        elif op == b'group':
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1926
            return walk(tree[1])
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1927
        elif op == b'ancestors':
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1928
            return getstack(walk(tree[1]))
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1929
        else:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1930
            raise error.ProgrammingError(b'illegal tree: %r' % tree)
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1931
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  1932
    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
  1933
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1934
33268
85391b95961d phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents: 33267
diff changeset
  1935
def getdescfromdrev(drev):
85391b95961d phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents: 33267
diff changeset
  1936
    """get description (commit message) from "Differential Revision"
85391b95961d phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents: 33267
diff changeset
  1937
85391b95961d phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents: 33267
diff changeset
  1938
    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
  1939
    about limited fields: title, summary, test plan, and URL.
85391b95961d phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents: 33267
diff changeset
  1940
    """
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1941
    title = drev[b'title']
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1942
    summary = drev[b'summary'].rstrip()
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1943
    testplan = drev[b'testPlan'].rstrip()
33268
85391b95961d phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents: 33267
diff changeset
  1944
    if testplan:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1945
        testplan = b'Test Plan:\n%s' % testplan
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  1946
    uri = b'Differential Revision: %s' % drev[b'uri']
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  1947
    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
  1948
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  1949
44648
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1950
def get_amended_desc(drev, ctx, folded):
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1951
    """similar to ``getdescfromdrev``, but supports a folded series of commits
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1952
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1953
    This is used when determining if an individual commit needs to have its
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1954
    message amended after posting it for review.  The determination is made for
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1955
    each individual commit, even when they were folded into one review.
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1956
    """
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1957
    if not folded:
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1958
        return getdescfromdrev(drev)
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1959
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1960
    uri = b'Differential Revision: %s' % drev[b'uri']
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1961
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1962
    # Since the commit messages were combined when posting multiple commits
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1963
    # with --fold, the fields can't be read from Phabricator here, or *all*
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1964
    # affected local revisions will end up with the same commit message after
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1965
    # the URI is amended in.  Append in the DREV line, or update it if it
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1966
    # exists.  At worst, this means commit message or test plan updates on
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1967
    # Phabricator aren't propagated back to the repository, but that seems
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1968
    # reasonable for the case where local commits are effectively combined
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1969
    # in Phabricator.
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1970
    m = _differentialrevisiondescre.search(ctx.description())
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1971
    if not m:
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1972
        return b'\n\n'.join([ctx.description(), uri])
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1973
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1974
    return _differentialrevisiondescre.sub(uri, ctx.description())
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1975
dbe9182c90f5 phabricator: combine commit messages into the review when folding commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 44647
diff changeset
  1976
44650
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1977
def getlocalcommits(diff):
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1978
    """get the set of local commits from a diff object
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1979
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1980
    See ``getdiffmeta()`` for an example diff object.
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1981
    """
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1982
    props = diff.get(b'properties') or {}
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1983
    commits = props.get(b'local:commits') or {}
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1984
    if len(commits) > 1:
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1985
        return {bin(c) for c in commits.keys()}
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1986
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1987
    # Storing the diff metadata predates storing `local:commits`, so continue
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1988
    # to use that in the --no-fold case.
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1989
    return {bin(getdiffmeta(diff).get(b'node', b'')) or None}
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1990
5f9c917e3b50 phabricator: teach `getoldnodedrevmap()` to handle folded reviews
Matt Harbison <matt_harbison@yahoo.com>
parents: 44649
diff changeset
  1991
33441
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  1992
def getdiffmeta(diff):
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  1993
    """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
  1994
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  1995
    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
  1996
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  1997
        "properties": {
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  1998
          "hg:meta": {
44424
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  1999
            "branch": "default",
33441
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2000
            "date": "1499571514 25200",
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2001
            "node": "98c08acae292b2faf60a279b4189beb6cff1414d",
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2002
            "user": "Foo Bar <foo@example.com>",
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2003
            "parent": "6d0abad76b30e4724a37ab8721d630394070fe16"
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2004
          }
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2005
        }
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2006
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2007
    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
  2008
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2009
        "properties": {
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2010
          "local:commits": {
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2011
            "98c08acae292b2faf60a279b4189beb6cff1414d": {
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2012
              "author": "Foo Bar",
44424
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  2013
              "authorEmail": "foo@example.com"
33441
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2014
              "branch": "default",
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2015
              "commit": "98c08acae292b2faf60a279b4189beb6cff1414d",
44424
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  2016
              "local": "1000",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  2017
              "message": "...",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  2018
              "parents": ["6d0abad76b30e4724a37ab8721d630394070fe16"],
33441
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2019
              "rev": "98c08acae292b2faf60a279b4189beb6cff1414d",
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2020
              "summary": "...",
44424
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  2021
              "tag": "",
adb93aa98c78 phabricator: update the protocol documentation
Matt Harbison <matt_harbison@yahoo.com>
parents: 44183
diff changeset
  2022
              "time": 1499546314,
33441
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2023
            }
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2024
          }
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2025
        }
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2026
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2027
    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
  2028
    information.
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2029
    """
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  2030
    props = diff.get(b'properties') or {}
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  2031
    meta = props.get(b'hg:meta')
42285
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2032
    if not meta:
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2033
        if props.get(b'local:commits'):
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2034
            commit = sorted(props[b'local:commits'].values())[0]
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2035
            meta = {}
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2036
            if b'author' in commit and b'authorEmail' in commit:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2037
                meta[b'user'] = b'%s <%s>' % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2038
                    commit[b'author'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2039
                    commit[b'authorEmail'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2040
                )
42285
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2041
            if b'time' in commit:
42618
c17e6a3e7356 phabricator: handle local:commits time being string or int
Ian Moody <moz-ian@perix.co.uk>
parents: 42465
diff changeset
  2042
                meta[b'date'] = b'%d 0' % int(commit[b'time'])
42285
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2043
            if b'branch' in commit:
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2044
                meta[b'branch'] = commit[b'branch']
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2045
            node = commit.get(b'commit', commit.get(b'rev'))
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2046
            if node:
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2047
                meta[b'node'] = node
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2048
            if len(commit.get(b'parents', ())) >= 1:
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2049
                meta[b'parent'] = commit[b'parents'][0]
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2050
        else:
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2051
            meta = {}
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2052
    if b'date' not in meta and b'dateCreated' in diff:
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2053
        meta[b'date'] = b'%s 0' % diff[b'dateCreated']
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2054
    if b'branch' not in meta and diff.get(b'branch'):
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2055
        meta[b'branch'] = diff[b'branch']
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2056
    if b'parent' not in meta and diff.get(b'sourceControlBaseRevision'):
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2057
        meta[b'parent'] = diff[b'sourceControlBaseRevision']
a4f7dceb07bf phabricator: fallback to reading metadata from diff for phabread
Ian Moody <moz-ian@perix.co.uk>
parents: 42284
diff changeset
  2058
    return meta
33441
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2059
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2060
44593
2d63a8910db6 phabricator: remove *-argument from _getdrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 44588
diff changeset
  2061
def _getdrevs(ui, stack, specs):
44587
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2062
    """convert user supplied DREVSPECs into "Differential Revision" dicts
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2063
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2064
    See ``hg help phabread`` for how to specify each DREVSPEC.
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2065
    """
44593
2d63a8910db6 phabricator: remove *-argument from _getdrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 44588
diff changeset
  2066
    if len(specs) > 0:
44587
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2067
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2068
        def _formatspec(s):
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2069
            if stack:
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2070
                s = b':(%s)' % s
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2071
            return b'(%s)' % s
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2072
44593
2d63a8910db6 phabricator: remove *-argument from _getdrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 44588
diff changeset
  2073
        spec = b'+'.join(pycompat.maplist(_formatspec, specs))
44587
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2074
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2075
        drevs = querydrev(ui, spec)
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2076
        if drevs:
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2077
            return drevs
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2078
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2079
    raise error.Abort(_(b"empty DREVSPEC set"))
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2080
90adda73676a phabricator: add a helper function to convert DREVSPECs to a DREV dict list
Matt Harbison <matt_harbison@yahoo.com>
parents: 44577
diff changeset
  2081
44443
41217dfa7a6d phabricator: pass ui instead of repo to `readpatch()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44424
diff changeset
  2082
def readpatch(ui, drevs, write):
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2083
    """generate plain-text patch readable by 'hg import'
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2084
44447
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2085
    write takes a list of (DREV, bytes), where DREV is the differential number
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2086
    (as bytes, without the "D" prefix) and the bytes are the text of a patch
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2087
    to be imported. drevs is what "querydrev" returns, results of
33852
75fdaf851e83 phabricator: change "readpatch" to be more flexible
Jun Wu <quark@fb.com>
parents: 33808
diff changeset
  2088
    "differential.query".
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2089
    """
33267
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  2090
    # Prefetch hg:meta property for all diffs
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44456
diff changeset
  2091
    diffids = sorted({max(int(v) for v in drev[b'diffs']) for drev in drevs})
44443
41217dfa7a6d phabricator: pass ui instead of repo to `readpatch()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44424
diff changeset
  2092
    diffs = callconduit(ui, b'differential.querydiffs', {b'ids': diffids})
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2093
44447
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2094
    patches = []
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2095
33267
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  2096
    # 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
  2097
    for drev in drevs:
44443
41217dfa7a6d phabricator: pass ui instead of repo to `readpatch()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44424
diff changeset
  2098
        ui.note(_(b'reading D%s\n') % drev[b'id'])
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2099
41902
c340a8ac7ef3 phabricator: convert conduit response JSON unicode to bytes inside callconduit
Ian Moody <moz-ian@perix.co.uk>
parents: 41716
diff changeset
  2100
        diffid = max(int(v) for v in drev[b'diffs'])
44443
41217dfa7a6d phabricator: pass ui instead of repo to `readpatch()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44424
diff changeset
  2101
        body = callconduit(ui, b'differential.getrawdiff', {b'diffID': diffid})
33268
85391b95961d phabricator: avoid calling differential.getcommitmessage
Jun Wu <quark@fb.com>
parents: 33267
diff changeset
  2102
        desc = getdescfromdrev(drev)
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  2103
        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
  2104
dba9f88659a3 phabricator: rework phabread to reduce memory usage and round-trips
Jun Wu <quark@fb.com>
parents: 33266
diff changeset
  2105
        # 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
  2106
        # 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
  2107
        # and extract in mercurial/patch.py for supported headers.
41907
59bae59b7498 py3: fix a few "dict keys as str instead of bytes" issues in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents: 41906
diff changeset
  2108
        meta = getdiffmeta(diffs[b'%d' % diffid])
33441
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2109
        for k in _metanamemap.keys():
de7c6ec27d99 phabricator: respect metadata sent by arc
Jun Wu <quark@fb.com>
parents: 33271
diff changeset
  2110
            if k in meta:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  2111
                header += b'# %s %s\n' % (_metanamemap[k], meta[k])
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2112
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  2113
        content = b'%s%s\n%s' % (header, desc, body)
44447
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2114
        patches.append((drev[b'id'], content))
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2115
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2116
    # Write patches to the supplied callback
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2117
    write(patches)
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2118
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2119
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2120
@vcrcommand(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2121
    b'phabread',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2122
    [(b'', b'stack', False, _(b'read dependencies'))],
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2123
    _(b'DREVSPEC... [OPTIONS]'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2124
    helpcategory=command.CATEGORY_IMPORT_EXPORT,
44448
5e2d74e5f450 phabricator: make `hg phabread` work outside of a repository
Matt Harbison <matt_harbison@yahoo.com>
parents: 44447
diff changeset
  2125
    optionalrepo=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2126
)
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2127
def phabread(ui, repo, *specs, **opts):
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2128
    """print patches from Phabricator suitable for importing
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2129
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  2130
    DREVSPEC could be a Differential Revision identity, like ``D123``, or just
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  2131
    the number ``123``. It could also have common operators like ``+``, ``-``,
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  2132
    ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2133
    select a stack.  If multiple DREVSPEC values are given, the result is the
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2134
    union of each individually evaluated value.  No attempt is currently made
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2135
    to reorder the values to run from parent to child.
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  2136
33854
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  2137
    ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision``
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  2138
    could be used to filter patches by status. For performance reason, they
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  2139
    only represent a subset of non-status selections and cannot be used alone.
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  2140
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  2141
    For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude
33854
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  2142
    D2 and D4. ``:D9 & needsreview`` selects "Needs Review" revisions in a
fb59192b4981 phabricator: add status to revision query language
Jun Wu <quark@fb.com>
parents: 33853
diff changeset
  2143
    stack up to D9.
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2144
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2145
    If --stack is given, follow dependencies information and read all patches.
33853
539541779010 phabricator: add a small language to query Differential Revisions
Jun Wu <quark@fb.com>
parents: 33852
diff changeset
  2146
    It is equivalent to the ``:`` operator.
33202
04cf9927f350 phabricator: add phabread command to read patches
Jun Wu <quark@fb.com>
parents: 33201
diff changeset
  2147
    """
41975
51ba9fbcca52 py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents: 41955
diff changeset
  2148
    opts = pycompat.byteskwargs(opts)
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2149
    drevs = _getdrevs(ui, opts.get(b'stack'), specs)
44447
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2150
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2151
    def _write(patches):
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2152
        for drev, content in patches:
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2153
            ui.write(content)
d5d262c7e7a2 phabricator: refactor `phabread` to write all patches at once
Matt Harbison <matt_harbison@yahoo.com>
parents: 44446
diff changeset
  2154
44448
5e2d74e5f450 phabricator: make `hg phabread` work outside of a repository
Matt Harbison <matt_harbison@yahoo.com>
parents: 44447
diff changeset
  2155
    readpatch(ui, drevs, _write)
33855
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2156
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2157
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2158
@vcrcommand(
44560
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2159
    b'phabimport',
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2160
    [(b'', b'stack', False, _(b'import dependencies as well'))],
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2161
    _(b'DREVSPEC... [OPTIONS]'),
44560
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2162
    helpcategory=command.CATEGORY_IMPORT_EXPORT,
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2163
)
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2164
def phabimport(ui, repo, *specs, **opts):
44560
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2165
    """import patches from Phabricator for the specified Differential Revisions
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2166
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2167
    The patches are read and applied starting at the parent of the working
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2168
    directory.
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2169
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2170
    See ``hg help phabread`` for how to specify DREVSPEC.
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2171
    """
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2172
    opts = pycompat.byteskwargs(opts)
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2173
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2174
    # --bypass avoids losing exec and symlink bits when importing on Windows,
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2175
    # and allows importing with a dirty wdir.  It also aborts instead of leaving
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2176
    # rejects.
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2177
    opts[b'bypass'] = True
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2178
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2179
    # Mandatory default values, synced with commands.import
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2180
    opts[b'strip'] = 1
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2181
    opts[b'prefix'] = b''
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2182
    # Evolve 9.3.0 assumes this key is present in cmdutil.tryimportone()
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2183
    opts[b'obsolete'] = False
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2184
44561
9bae1d1a0f4c phabricator: add a config knob to import in the secret phase
Matt Harbison <matt_harbison@yahoo.com>
parents: 44560
diff changeset
  2185
    if ui.configbool(b'phabimport', b'secret'):
9bae1d1a0f4c phabricator: add a config knob to import in the secret phase
Matt Harbison <matt_harbison@yahoo.com>
parents: 44560
diff changeset
  2186
        opts[b'secret'] = True
44562
f10055b099b3 phabricator: add a config knob to create obsolete markers when importing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44561
diff changeset
  2187
    if ui.configbool(b'phabimport', b'obsolete'):
f10055b099b3 phabricator: add a config knob to create obsolete markers when importing
Matt Harbison <matt_harbison@yahoo.com>
parents: 44561
diff changeset
  2188
        opts[b'obsolete'] = True  # Handled by evolve wrapping tryimportone()
44561
9bae1d1a0f4c phabricator: add a config knob to import in the secret phase
Matt Harbison <matt_harbison@yahoo.com>
parents: 44560
diff changeset
  2189
44560
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2190
    def _write(patches):
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2191
        parents = repo[None].parents()
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2192
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2193
        with repo.wlock(), repo.lock(), repo.transaction(b'phabimport'):
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2194
            for drev, contents in patches:
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2195
                ui.status(_(b'applying patch from D%s\n') % drev)
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2196
48964
5aafc3c5bdec py3: use io.BytesIO directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48128
diff changeset
  2197
                with patch.extract(ui, io.BytesIO(contents)) as patchdata:
44560
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2198
                    msg, node, rej = cmdutil.tryimportone(
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2199
                        ui,
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2200
                        repo,
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2201
                        patchdata,
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2202
                        parents,
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2203
                        opts,
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2204
                        [],
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2205
                        None,  # Never update wdir to another revision
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2206
                    )
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2207
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2208
                    if not node:
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2209
                        raise error.Abort(_(b'D%s: no diffs found') % drev)
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2210
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2211
                    ui.note(msg + b'\n')
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2212
                    parents = [repo[node]]
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2213
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2214
    drevs = _getdrevs(ui, opts.get(b'stack'), specs)
44560
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2215
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2216
    readpatch(repo.ui, drevs, _write)
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2217
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2218
bbb170f9396d phabricator: add a `phabimport` command
Matt Harbison <matt_harbison@yahoo.com>
parents: 44470
diff changeset
  2219
@vcrcommand(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2220
    b'phabupdate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2221
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2222
        (b'', b'accept', False, _(b'accept revisions')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2223
        (b'', b'reject', False, _(b'reject revisions')),
45136
1ff5070c0ab4 phabupdate: allows revisions to be marked "request-review"
Matt Harbison <matt_harbison@yahoo.com>
parents: 45135
diff changeset
  2224
        (b'', b'request-review', False, _(b'request review on revisions')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2225
        (b'', b'abandon', False, _(b'abandon revisions')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2226
        (b'', b'reclaim', False, _(b'reclaim revisions')),
45137
3ad0855cc602 phabupdate: allow revisions to be marked "closed"
Matt Harbison <matt_harbison@yahoo.com>
parents: 45136
diff changeset
  2227
        (b'', b'close', False, _(b'close revisions')),
45138
2010f3143062 phabupdate: allow revisions to be reopened
Matt Harbison <matt_harbison@yahoo.com>
parents: 45137
diff changeset
  2228
        (b'', b'reopen', False, _(b'reopen revisions')),
45135
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2229
        (b'', b'plan-changes', False, _(b'plan changes for revisions')),
45140
c59e7bed8924 phabupdate: allow resigning from revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 45139
diff changeset
  2230
        (b'', b'resign', False, _(b'resign as a reviewer from revisions')),
45139
383b8c77096d phabupdate: allow revisions to be commandeered
Matt Harbison <matt_harbison@yahoo.com>
parents: 45138
diff changeset
  2231
        (b'', b'commandeer', False, _(b'commandeer revisions')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2232
        (b'm', b'comment', b'', _(b'comment on the last revision')),
46041
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2233
        (b'r', b'rev', b'', _(b'local revision to update'), _(b'REV')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2234
    ],
46041
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2235
    _(b'[DREVSPEC...| -r REV...] [OPTIONS]'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2236
    helpcategory=command.CATEGORY_IMPORT_EXPORT,
44446
b715432fabba phabricator: make `hg phabupdate` work outside of a repository
Matt Harbison <matt_harbison@yahoo.com>
parents: 44445
diff changeset
  2237
    optionalrepo=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2238
)
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2239
def phabupdate(ui, repo, *specs, **opts):
33855
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2240
    """update Differential Revision in batch
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2241
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2242
    DREVSPEC selects revisions. See :hg:`help phabread` for its usage.
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2243
    """
41975
51ba9fbcca52 py3: use pycompat.byteskwargs on opts in phabricator.py
Ian Moody <moz-ian@perix.co.uk>
parents: 41955
diff changeset
  2244
    opts = pycompat.byteskwargs(opts)
45135
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2245
    transactions = [
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2246
        b'abandon',
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2247
        b'accept',
45137
3ad0855cc602 phabupdate: allow revisions to be marked "closed"
Matt Harbison <matt_harbison@yahoo.com>
parents: 45136
diff changeset
  2248
        b'close',
45139
383b8c77096d phabupdate: allow revisions to be commandeered
Matt Harbison <matt_harbison@yahoo.com>
parents: 45138
diff changeset
  2249
        b'commandeer',
45135
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2250
        b'plan-changes',
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2251
        b'reclaim',
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2252
        b'reject',
45138
2010f3143062 phabupdate: allow revisions to be reopened
Matt Harbison <matt_harbison@yahoo.com>
parents: 45137
diff changeset
  2253
        b'reopen',
45136
1ff5070c0ab4 phabupdate: allows revisions to be marked "request-review"
Matt Harbison <matt_harbison@yahoo.com>
parents: 45135
diff changeset
  2254
        b'request-review',
45140
c59e7bed8924 phabupdate: allow resigning from revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 45139
diff changeset
  2255
        b'resign',
45135
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2256
    ]
225588c4c255 phabupdate: allow revisions to be marked with "plan changes"
Matt Harbison <matt_harbison@yahoo.com>
parents: 44986
diff changeset
  2257
    flags = [n for n in transactions if opts.get(n.replace(b'-', b'_'))]
33855
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2258
    if len(flags) > 1:
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  2259
        raise error.Abort(_(b'%s cannot be used together') % b', '.join(flags))
33855
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2260
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2261
    actions = []
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2262
    for f in flags:
43350
132ddd1cba85 phabricator: use True primitive instead of b'true' for phabupdate actions
Ian Moody <moz-ian@perix.co.uk>
parents: 43321
diff changeset
  2263
        actions.append({b'type': f, b'value': True})
33855
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2264
46041
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2265
    revs = opts.get(b'rev')
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2266
    if revs:
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2267
        if not repo:
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2268
            raise error.InputError(_(b'--rev requires a repository'))
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2269
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2270
        if specs:
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2271
            raise error.InputError(_(b'cannot specify both DREVSPEC and --rev'))
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2272
48128
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 47084
diff changeset
  2273
        drevmap = getdrevmap(repo, logcmdutil.revrange(repo, [revs]))
46041
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2274
        specs = []
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2275
        unknown = []
49004
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
  2276
        for r, d in drevmap.items():
46041
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2277
            if d is None:
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2278
                unknown.append(repo[r])
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2279
            else:
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2280
                specs.append(b'D%d' % d)
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2281
        if unknown:
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2282
            raise error.InputError(
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2283
                _(b'selected revisions without a Differential: %s')
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2284
                % scmutil.nodesummaries(repo, unknown)
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2285
            )
9624bf057c2a phabricator: allow local revisions to be specified with `phabupdate`
Matt Harbison <matt_harbison@yahoo.com>
parents: 45985
diff changeset
  2286
44588
a7f8c657a3f0 phabricator: allow multiple DREVSPEC args to phabread|phabimport|phabupdate
Matt Harbison <matt_harbison@yahoo.com>
parents: 44587
diff changeset
  2287
    drevs = _getdrevs(ui, opts.get(b'stack'), specs)
33855
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2288
    for i, drev in enumerate(drevs):
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  2289
        if i + 1 == len(drevs) and opts.get(b'comment'):
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  2290
            actions.append({b'type': b'comment', b'value': opts[b'comment']})
33855
6e666cd59879 phabricator: add phabupdate command to update status in batch
Jun Wu <quark@fb.com>
parents: 33854
diff changeset
  2291
        if actions:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2292
            params = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2293
                b'objectIdentifier': drev[b'phid'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2294
                b'transactions': actions,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2295
            }
42450
f163e2b2594c phabricator: pass ui instead of repo to callconduit
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42449
diff changeset
  2296
            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
  2297
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2298
42975
24bf7a3d3c30 phabricator: use exthelper to register commands, config, and templates
Matt Harbison <matt_harbison@yahoo.com>
parents: 42955
diff changeset
  2299
@eh.templatekeyword(b'phabreview', requires={b'ctx'})
36543
7b74afec6772 templatekw: switch non-showlist template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 35722
diff changeset
  2300
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
  2301
    """: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
  2302
    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
  2303
    """
38398
81a4be7099fa py3: byte-stringify literals in contrib/phabricator.py as example
Yuya Nishihara <yuya@tcha.org>
parents: 38342
diff changeset
  2304
    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
  2305
    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
  2306
    if m:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2307
        return templateutil.hybriddict(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2308
            {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2309
                b'url': m.group('url'),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2310
                b'id': b"D%s" % m.group('id'),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2311
            }
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43047
diff changeset
  2312
        )
41164
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2313
    else:
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2314
        tags = ctx.repo().nodetags(ctx.node())
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2315
        for t in tags:
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2316
            if _differentialrevisiontagre.match(t):
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2317
                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
  2318
                if not url.endswith(b'/'):
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2319
                    url += b'/'
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2320
                url += t
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2321
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2322
                return templateutil.hybriddict(
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2323
                    {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2324
                        b'url': url,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2325
                        b'id': t,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2326
                    }
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2327
                )
41164
43fd1947301d phabricator: teach {phabreview} to work without --amend
Matt Harbison <matt_harbison@yahoo.com>
parents: 41163
diff changeset
  2328
    return None
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2329
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2330
43858
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2331
@eh.templatekeyword(b'phabstatus', requires={b'ctx', b'repo', b'ui'})
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2332
def template_status(context, mapping):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2333
    """:phabstatus: String. Status of Phabricator differential."""
43858
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2334
    ctx = context.resource(mapping, b'ctx')
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2335
    repo = context.resource(mapping, b'repo')
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2336
    ui = context.resource(mapping, b'ui')
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2337
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2338
    rev = ctx.rev()
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2339
    try:
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2340
        drevid = getdrevmap(repo, [rev])[rev]
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2341
    except KeyError:
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2342
        return None
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2343
    drevs = callconduit(ui, b'differential.query', {b'ids': [drevid]})
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2344
    for drev in drevs:
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2345
        if int(drev[b'id']) == drevid:
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2346
            return templateutil.hybriddict(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2347
                {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2348
                    b'url': drev[b'uri'],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2349
                    b'status': drev[b'statusName'],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45795
diff changeset
  2350
                }
43858
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2351
            )
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2352
    return None
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2353
79c0121220e3 phabricator: add a "phabstatus" template keyword
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43857
diff changeset
  2354
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2355
@show.showview(b'phabstatus', csettopic=b'work')
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2356
def phabstatusshowview(ui, repo, displayer):
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2357
    """Phabricator differiential status"""
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2358
    revs = repo.revs('sort(_underway(), topo)')
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2359
    drevmap = getdrevmap(repo, revs)
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44456
diff changeset
  2360
    unknownrevs, drevids, revsbydrevid = [], set(), {}
49004
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
  2361
    for rev, drevid in drevmap.items():
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2362
        if drevid is not None:
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2363
            drevids.add(drevid)
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44456
diff changeset
  2364
            revsbydrevid.setdefault(drevid, set()).add(rev)
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2365
        else:
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2366
            unknownrevs.append(rev)
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2367
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2368
    drevs = callconduit(ui, b'differential.query', {b'ids': list(drevids)})
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2369
    drevsbyrev = {}
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2370
    for drev in drevs:
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2371
        for rev in revsbydrevid[int(drev[b'id'])]:
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2372
            drevsbyrev[rev] = drev
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2373
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2374
    def phabstatus(ctx):
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2375
        drev = drevsbyrev[ctx.rev()]
43869
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
  2376
        status = ui.label(
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
  2377
            b'%(statusName)s' % drev,
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
  2378
            b'phabricator.status.%s' % _getstatusname(drev),
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
  2379
        )
b0867b7751ba phabricator: color the status in the "phabstatus" view
Matt Harbison <matt_harbison@yahoo.com>
parents: 43868
diff changeset
  2380
        ui.write(b"\n%s %s\n" % (drev[b'uri'], status))
43857
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2381
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2382
    revs -= smartset.baseset(unknownrevs)
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2383
    revdag = graphmod.dagwalker(repo, revs)
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2384
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2385
    ui.setconfig(b'experimental', b'graphshorten', True)
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2386
    displayer._exthook = phabstatus
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2387
    nodelen = show.longestshortest(repo, revs)
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2388
    logcmdutil.displaygraph(
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2389
        ui,
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2390
        repo,
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2391
        revdag,
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2392
        displayer,
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2393
        graphmod.asciiedges,
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2394
        props={b'nodelen': nodelen},
70060915c3f2 phabricator: add a "phabstatus" show view
Denis Laxalde <denis@laxalde.org>
parents: 43847
diff changeset
  2395
    )