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