hgext/hgk.py
author Matt Harbison <matt_harbison@yahoo.com>
Thu, 24 Oct 2024 22:47:31 -0400
changeset 52127 fd200f5bcaea
parent 51863 f4733654f144
permissions -rw-r--r--
wireprototypes: make `baseprotocolhandler` methods abstract The documentation says it's an abstract base class, so let's enforce it. The `typing.Protocol` class is already an ABC, but it only prevents instantiation if there are abstract attrs that are missing. For example, from `hg debugshell`: >>> from mercurial import wireprototypes >>> x = wireprototypes.baseprotocolhandler() Traceback (most recent call last): File "<console>", line 1, in <module> TypeError: Can't instantiate abstract class baseprotocolhandler with abstract method name >>> class fake(wireprototypes.baseprotocolhandler): ... pass ... >>> x = fake() Traceback (most recent call last): File "<console>", line 1, in <module> TypeError: Can't instantiate abstract class fake with abstract method name That's great, but it doesn't protect against calling non-abstract methods at runtime, rather it depends on the protocol type hint being added to method signatures or class attrs, and then running a type checker to notice when an instance is assigned that doesn't conform to the protocol. We don't widely use type hints yet, and do have a lot of class hierarchy in the repository area, which could lead to surprises like this: >>> class fake(wireprototypes.baseprotocolhandler): ... @property ... def name(self) -> bytes: ... return b'name' ... >>> z = fake() >>> z.client() >>> print(z.client()) None Oops. That was supposed to return `bytes`. So not only is a bad/unexpected value returned, but it's one that violates the type hints (since the base client() method will be annotated to return bytes). With this change, we get: >>> from mercurial import wireprototypes >>> class fake(wireprototypes.baseprotocolhandler): ... @property ... def name(self) -> bytes: ... return b'name' ... >>> x = fake() Traceback (most recent call last): File "<console>", line 1, in <module> TypeError: Can't instantiate abstract class fake with abstract methods addcapabilities, checkperm, client, getargs, getpayload, getprotocaps, mayberedirectstdio So this looks like a reasonable safety harness to me, and lets us catch problems by running the standard tests while the type hints are being added, and pytype is improved. We should probably do this for all Protocol class methods that don't supply a method implementation.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     1
# Minimal support for git commands on an hg repository
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     2
#
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2744
diff changeset
     3
# Copyright 2005, 2006 Chris Mason <mason@suse.com>
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 7992
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9467
diff changeset
     6
# GNU General Public License version 2 or any later version.
8228
eee2319c5895 add blank line after copyright notices and after header
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     7
8894
868670dbc237 extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents: 8866
diff changeset
     8
'''browse the repository in a graphical way
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
     9
9261
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    10
The hgk extension allows browsing the history of a repository in a
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    11
graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    12
distributed with Mercurial.)
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    13
9261
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    14
hgk consists of two parts: a Tcl script that does the displaying and
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    15
querying of information, and an extension to Mercurial named hgk.py,
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    16
which provides hooks for hgk to get information. hgk can be found in
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    17
the contrib directory, and the extension is shipped in the hgext
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    18
repository, and needs to be enabled.
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    19
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 10394
diff changeset
    20
The :hg:`view` command will launch the hgk Tcl script. For this command
9261
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    21
to work, hgk must be in your search path. Alternately, you can specify
12083
ebfc46929f3e help: refer to user configuration file more consistently
Brodie Rao <brodie@bitheap.org>
parents: 11321
diff changeset
    22
the path to hgk in your configuration file::
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    23
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    24
  [hgk]
25793
084957666642 hgk: tweak doc format for path option
Matt Mackall <mpm@selenic.com>
parents: 25186
diff changeset
    25
  path = /location/of/hgk
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    26
9261
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    27
hgk can make use of the extdiff extension to visualize revisions.
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    28
Assuming you had already configured extdiff vdiff command, just add::
6666
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    29
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    30
  [hgk]
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    31
  vdiff=vdiff
53465a7464e2 convert comments to docstrings in a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6616
diff changeset
    32
9261
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    33
Revisions context menu will now display additional entries to fire
1a9a650004b6 hgk: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9209
diff changeset
    34
vdiff on hovered and selected revisions.
9063
0772889d8a65 hgk: wrapped docstrings at 78 characters
Martin Geisler <mg@lazybytes.net>
parents: 8946
diff changeset
    35
'''
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    36
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 49284
diff changeset
    37
from __future__ import annotations
29125
9b12517a7081 py3: make hgext/hgk.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 25793
diff changeset
    38
5878
d39af2eabb8c transform a bunch of print statements to appropriate ui calls
Matt Mackall <mpm@selenic.com>
parents: 5859
diff changeset
    39
import os
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29125
diff changeset
    40
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29125
diff changeset
    41
from mercurial.i18n import _
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29125
diff changeset
    42
from mercurial.node import (
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29125
diff changeset
    43
    nullrev,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29125
diff changeset
    44
    short,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29125
diff changeset
    45
)
29125
9b12517a7081 py3: make hgext/hgk.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 25793
diff changeset
    46
from mercurial import (
9b12517a7081 py3: make hgext/hgk.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 25793
diff changeset
    47
    commands,
9b12517a7081 py3: make hgext/hgk.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 25793
diff changeset
    48
    obsolete,
9b12517a7081 py3: make hgext/hgk.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 25793
diff changeset
    49
    patch,
34998
fc0e6d298cd4 py3: handle keyword arguments in hgext/hgk.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34499
diff changeset
    50
    pycompat,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31409
diff changeset
    51
    registrar,
29125
9b12517a7081 py3: make hgext/hgk.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 25793
diff changeset
    52
    scmutil,
9b12517a7081 py3: make hgext/hgk.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 25793
diff changeset
    53
)
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
    54
21250
8d354d58147c hgk: declare commands using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 18816
diff changeset
    55
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31409
diff changeset
    56
command = registrar.command(cmdtable)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29397
diff changeset
    57
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24604
diff changeset
    58
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24604
diff changeset
    59
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24604
diff changeset
    60
# leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    61
testedwith = b'ships-with-hg-core'
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16683
diff changeset
    62
34499
b8f74c4d188f configitems: register the 'hgk.path' config
Boris Feld <boris.feld@octobus.net>
parents: 33839
diff changeset
    63
configtable = {}
b8f74c4d188f configitems: register the 'hgk.path' config
Boris Feld <boris.feld@octobus.net>
parents: 33839
diff changeset
    64
configitem = registrar.configitem(configtable)
b8f74c4d188f configitems: register the 'hgk.path' config
Boris Feld <boris.feld@octobus.net>
parents: 33839
diff changeset
    65
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
    66
configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44676
diff changeset
    67
    b'hgk',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44676
diff changeset
    68
    b'path',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44676
diff changeset
    69
    default=b'hgk',
34499
b8f74c4d188f configitems: register the 'hgk.path' config
Boris Feld <boris.feld@octobus.net>
parents: 33839
diff changeset
    70
)
b8f74c4d188f configitems: register the 'hgk.path' config
Boris Feld <boris.feld@octobus.net>
parents: 33839
diff changeset
    71
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
    72
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
    73
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    74
    b'debug-diff-tree',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
    75
    [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    76
        (b'p', b'patch', None, _(b'generate patch')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    77
        (b'r', b'recursive', None, _(b'recursive')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    78
        (b'P', b'pretty', None, _(b'pretty')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    79
        (b's', b'stdin', None, _(b'stdin')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    80
        (b'C', b'copy', None, _(b'detect copies')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    81
        (b'S', b'search', b"", _(b'search')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
    82
    ],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    83
    b'[OPTION]... NODE1 NODE2 [FILE]...',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
    84
    inferrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
    85
)
3063
aa1cee5b8afb hgk.py: add an optional file list to debug-diff-tree
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3059
diff changeset
    86
def difftree(ui, repo, node1=None, node2=None, *files, **opts):
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
    87
    """diff trees from two commits"""
34998
fc0e6d298cd4 py3: handle keyword arguments in hgext/hgk.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34499
diff changeset
    88
31409
dddc4812aa7a hgk: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31203
diff changeset
    89
    def __difftree(repo, node1, node2, files=None):
3978
ee5663cb4406 hgk: remove unused code, node2 is always set
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3963
diff changeset
    90
        assert node2 is not None
31409
dddc4812aa7a hgk: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31203
diff changeset
    91
        if files is None:
dddc4812aa7a hgk: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31203
diff changeset
    92
            files = []
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6666
diff changeset
    93
        mmap = repo[node1].manifest()
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6666
diff changeset
    94
        mmap2 = repo[node2].manifest()
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14322
diff changeset
    95
        m = scmutil.match(repo[node1], files)
43639
52a73fb498a4 hgk: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43506
diff changeset
    96
        st = repo.status(node1, node2, m)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    97
        empty = short(repo.nullid)
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
    98
43639
52a73fb498a4 hgk: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43506
diff changeset
    99
        for f in st.modified:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   100
            # TODO get file permissions
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
   101
            ui.writenoi18n(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   102
                b":100664 100664 %s %s M\t%s\t%s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   103
                % (short(mmap[f]), short(mmap2[f]), f, f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   104
            )
43639
52a73fb498a4 hgk: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43506
diff changeset
   105
        for f in st.added:
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
   106
            ui.writenoi18n(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   107
                b":000000 100664 %s %s N\t%s\t%s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   108
                % (empty, short(mmap2[f]), f, f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   109
            )
43639
52a73fb498a4 hgk: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43506
diff changeset
   110
        for f in st.removed:
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
   111
            ui.writenoi18n(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   112
                b":100664 000000 %s %s D\t%s\t%s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   113
                % (short(mmap[f]), empty, f, f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   114
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   115
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   116
    ##
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   117
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   118
    while True:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   119
        if opts['stdin']:
36790
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   120
            line = ui.fin.readline()
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   121
            if not line:
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   122
                break
36790
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   123
            line = line.rstrip(pycompat.oslinesep).split(b' ')
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   124
            node1 = line[0]
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   125
            if len(line) > 1:
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   126
                node2 = line[1]
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   127
            else:
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   128
                node2 = None
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   129
        node1 = repo.lookup(node1)
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   130
        if node2:
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   131
            node2 = repo.lookup(node2)
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   132
        else:
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   133
            node2 = node1
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   134
            node1 = repo.changelog.parents(node1)[0]
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   135
        if opts['patch']:
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   136
            if opts['pretty']:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   137
                catcommit(ui, repo, node2, b"")
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14322
diff changeset
   138
            m = scmutil.match(repo[node1], files)
23451
5fb1fc2e1281 hgk: don't honor whitespace and format-changing diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23270
diff changeset
   139
            diffopts = patch.difffeatureopts(ui)
5fb1fc2e1281 hgk: don't honor whitespace and format-changing diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23270
diff changeset
   140
            diffopts.git = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   141
            chunks = patch.diff(repo, node1, node2, match=m, opts=diffopts)
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7000
diff changeset
   142
            for chunk in chunks:
8615
94ca38e63576 use ui instead of repo.ui when the former is in scope
Martin Geisler <mg@lazybytes.net>
parents: 8459
diff changeset
   143
                ui.write(chunk)
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   144
        else:
3063
aa1cee5b8afb hgk.py: add an optional file list to debug-diff-tree
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3059
diff changeset
   145
            __difftree(repo, node1, node2, files=files)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   146
        if not opts['stdin']:
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   147
            break
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   148
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   149
5878
d39af2eabb8c transform a bunch of print statements to appropriate ui calls
Matt Mackall <mpm@selenic.com>
parents: 5859
diff changeset
   150
def catcommit(ui, repo, n, prefix, ctx=None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   151
    nlprefix = b'\n' + prefix
3979
e0d13267f7a4 hgk: use contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3978
diff changeset
   152
    if ctx is None:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6666
diff changeset
   153
        ctx = repo[n]
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 14671
diff changeset
   154
    # use ctx.node() instead ??
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   155
    ui.write((b"tree %s\n" % short(ctx.changeset()[0])))
6768
e3bb005373b1 hgk: fix parent breakage
Matt Mackall <mpm@selenic.com>
parents: 6760
diff changeset
   156
    for p in ctx.parents():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   157
        ui.write((b"parent %s\n" % p))
6768
e3bb005373b1 hgk: fix parent breakage
Matt Mackall <mpm@selenic.com>
parents: 6760
diff changeset
   158
3979
e0d13267f7a4 hgk: use contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3978
diff changeset
   159
    date = ctx.date()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   160
    description = ctx.description().replace(b"\0", b"")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   161
    ui.write((b"author %s %d %d\n" % (ctx.user(), int(date[0]), date[1])))
1308
2073e5a71008 Cleanup of tabs and trailing spaces.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1278
diff changeset
   162
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   163
    if b'committer' in ctx.extra():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   164
        ui.write((b"committer %s\n" % ctx.extra()[b'committer']))
24604
ce8dd4fd2d5d hgk: display committer name when set by hg-git
Andrew Shadura <andrew@shadura.me>
parents: 24517
diff changeset
   165
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   166
    ui.write((b"revision %d\n" % ctx.rev()))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   167
    ui.write((b"branch %s\n" % ctx.branch()))
24513
b5a0b2374eb6 hgk: display obsolete changesets in darkgrey
Andrew Shadura <andrew@shadura.me>
parents: 24512
diff changeset
   168
    if obsolete.isenabled(repo, obsolete.createmarkersopt):
b5a0b2374eb6 hgk: display obsolete changesets in darkgrey
Andrew Shadura <andrew@shadura.me>
parents: 24512
diff changeset
   169
        if ctx.obsolete():
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
   170
            ui.writenoi18n(b"obsolete\n")
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   171
    ui.write((b"phase %s\n\n" % ctx.phasestr()))
5878
d39af2eabb8c transform a bunch of print statements to appropriate ui calls
Matt Mackall <mpm@selenic.com>
parents: 5859
diff changeset
   172
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   173
    if prefix != b"":
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   174
        ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   175
            b"%s%s\n" % (prefix, description.replace(b'\n', nlprefix).strip())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   176
        )
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   177
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   178
        ui.write(description + b"\n")
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   179
    if prefix:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   180
        ui.write(b'\0')
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   181
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   182
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   183
@command(b'debug-merge-base', [], _(b'REV REV'))
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   184
def base(ui, repo, node1, node2):
7598
26adfaccdf73 lowercase help output
Martin Geisler <mg@daimi.au.dk>
parents: 7308
diff changeset
   185
    """output common ancestor information"""
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   186
    node1 = repo.lookup(node1)
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   187
    node2 = repo.lookup(node2)
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   188
    n = repo.changelog.ancestor(node1, node2)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   189
    ui.write(short(n) + b"\n")
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   190
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   191
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   192
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   193
    b'debug-cat-file',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   194
    [(b's', b'stdin', None, _(b'stdin'))],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   195
    _(b'[OPTION]... TYPE FILE'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   196
    inferrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   197
)
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   198
def catfile(ui, repo, type=None, r=None, **opts):
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   199
    """cat a specific revision"""
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   200
    # in stdin mode, every line except the commit is prefixed with two
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   201
    # spaces.  This way the our caller can find the commit without magic
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   202
    # strings
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   203
    #
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   204
    prefix = b""
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   205
    if opts['stdin']:
36790
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   206
        line = ui.fin.readline()
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   207
        if not line:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   208
            return
36790
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   209
        (type, r) = line.rstrip(pycompat.oslinesep).split(b' ')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   210
        prefix = b"    "
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   211
    else:
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   212
        if not type or not r:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   213
            ui.warn(_(b"cat-file: type or revision not supplied\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   214
            commands.help_(ui, b'cat-file')
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   215
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   216
    while r:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   217
        if type != b"commit":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   218
            ui.warn(_(b"aborting hg cat-file only understands commits\n"))
10394
4612cded5176 fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
   219
            return 1
720
095dd8c757e0 Change hgit revision lookup to use repo.lookup
mason@suse.com
parents: 719
diff changeset
   220
        n = repo.lookup(r)
5878
d39af2eabb8c transform a bunch of print statements to appropriate ui calls
Matt Mackall <mpm@selenic.com>
parents: 5859
diff changeset
   221
        catcommit(ui, repo, n, prefix)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   222
        if opts['stdin']:
36790
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   223
            line = ui.fin.readline()
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   224
            if not line:
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   225
                break
36790
cb0afaf112e8 hgk: stop using util.bytesinput() to read a single line from stdin
Yuya Nishihara <yuya@tcha.org>
parents: 36490
diff changeset
   226
            (type, r) = line.rstrip(pycompat.oslinesep).split(b' ')
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   227
        else:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   228
            break
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   229
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   230
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   231
# git rev-tree is a confusing thing.  You can supply a number of
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   232
# commit sha1s on the command line, and it walks the commit history
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   233
# telling you which commits are reachable from the supplied ones via
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   234
# a bitmask based on arg position.
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   235
# you can specify a commit to stop at by starting the sha1 with ^
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
def revtree(ui, args, repo, full=b"tree", maxnr=0, parents=False):
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   237
    def chlogwalk():
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
   238
        count = len(repo)
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   239
        i = count
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   240
        l = [0] * 100
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   241
        chunk = 100
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   242
        while True:
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   243
            if chunk > i:
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   244
                chunk = i
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   245
                i = 0
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   246
            else:
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   247
                i -= chunk
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   248
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 48913
diff changeset
   249
            for x in range(chunk):
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   250
                if i + x >= count:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   251
                    l[chunk - x :] = [0] * (chunk - x)
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   252
                    break
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 12083
diff changeset
   253
                if full is not None:
22580
271a1ddad1fb hgk: don't break on repositories with obsolete changesets
Andrew Shadura <andrew@shadura.me>
parents: 21783
diff changeset
   254
                    if (i + x) in repo:
271a1ddad1fb hgk: don't break on repositories with obsolete changesets
Andrew Shadura <andrew@shadura.me>
parents: 21783
diff changeset
   255
                        l[x] = repo[i + x]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   256
                        l[x].changeset()  # force reading
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   257
                else:
22580
271a1ddad1fb hgk: don't break on repositories with obsolete changesets
Andrew Shadura <andrew@shadura.me>
parents: 21783
diff changeset
   258
                    if (i + x) in repo:
271a1ddad1fb hgk: don't break on repositories with obsolete changesets
Andrew Shadura <andrew@shadura.me>
parents: 21783
diff changeset
   259
                        l[x] = 1
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 48913
diff changeset
   260
            for x in range(chunk - 1, -1, -1):
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   261
                if l[x] != 0:
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 12083
diff changeset
   262
                    yield (i + x, full is not None and l[x] or None)
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   263
            if i == 0:
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   264
                break
1308
2073e5a71008 Cleanup of tabs and trailing spaces.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1278
diff changeset
   265
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   266
    # calculate and return the reachability bitmask for sha
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   267
    def is_reachable(ar, reachable, sha):
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   268
        if len(ar) == 0:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   269
            return 1
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   270
        mask = 0
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 48913
diff changeset
   271
        for i in range(len(ar)):
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   272
            if sha in reachable[i]:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   273
                mask |= 1 << i
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   274
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   275
        return mask
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   276
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   277
    reachable = []
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   278
    stop_sha1 = []
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   279
    want_sha1 = []
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   280
    count = 0
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   281
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   282
    # figure out which commits they are asking for and which ones they
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   283
    # want us to stop on
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
   284
    for i, arg in enumerate(args):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   285
        if arg.startswith(b'^'):
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
   286
            s = repo.lookup(arg[1:])
720
095dd8c757e0 Change hgit revision lookup to use repo.lookup
mason@suse.com
parents: 719
diff changeset
   287
            stop_sha1.append(s)
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   288
            want_sha1.append(s)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   289
        elif arg != b'HEAD':
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
   290
            want_sha1.append(repo.lookup(arg))
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   291
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   292
    # calculate the graph for the supplied commits
8632
9e055cfdd620 replace "i in range(len(xs))" with "i, x in enumerate(xs)"
Martin Geisler <mg@lazybytes.net>
parents: 8624
diff changeset
   293
    for i, n in enumerate(want_sha1):
10394
4612cded5176 fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
   294
        reachable.append(set())
4612cded5176 fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
   295
        visit = [n]
8459
1e63816ce8a2 hgk: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8228
diff changeset
   296
        reachable[i].add(n)
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   297
        while visit:
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   298
            n = visit.pop(0)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   299
            if n in stop_sha1:
1243
9d10f89b75a5 Fix hgit revtree bug with stop revision handling
root@coffee.suse.com
parents: 1239
diff changeset
   300
                continue
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   301
            for p in repo.changelog.parents(n):
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   302
                if p not in reachable[i]:
8459
1e63816ce8a2 hgk: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8228
diff changeset
   303
                    reachable[i].add(p)
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   304
                    visit.append(p)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   305
                if p in stop_sha1:
1243
9d10f89b75a5 Fix hgit revtree bug with stop revision handling
root@coffee.suse.com
parents: 1239
diff changeset
   306
                    continue
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   307
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   308
    # walk the repository looking for commits that are in our
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   309
    # reachability graph
3979
e0d13267f7a4 hgk: use contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3978
diff changeset
   310
    for i, ctx in chlogwalk():
22580
271a1ddad1fb hgk: don't break on repositories with obsolete changesets
Andrew Shadura <andrew@shadura.me>
parents: 21783
diff changeset
   311
        if i not in repo:
271a1ddad1fb hgk: don't break on repositories with obsolete changesets
Andrew Shadura <andrew@shadura.me>
parents: 21783
diff changeset
   312
            continue
334
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   313
        n = repo.changelog.node(i)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   314
        mask = is_reachable(want_sha1, reachable, n)
290574209284 hgit: remove tabs
mpm@selenic.com
parents: 280
diff changeset
   315
        if mask:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   316
            parentstr = b""
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   317
            if parents:
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   318
                pp = repo.changelog.parents(n)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   319
                if pp[0] != repo.nullid:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   320
                    parentstr += b" " + short(pp[0])
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   321
                if pp[1] != repo.nullid:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   322
                    parentstr += b" " + short(pp[1])
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   323
            if not full:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   324
                ui.write(b"%s%s\n" % (short(n), parentstr))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   325
            elif full == b"commit":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   326
                ui.write(b"%s%s\n" % (short(n), parentstr))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   327
                catcommit(ui, repo, n, b'    ', ctx)
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   328
            else:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   329
                (p1, p2) = repo.changelog.parents(n)
6217
fe8dbbe9520d Avoid importing mercurial.node/mercurial.repo stuff from mercurial.hg
Joel Rosdahl <joel@rosdahl.net>
parents: 6212
diff changeset
   330
                (h, h1, h2) = map(short, (n, p1, p2))
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   331
                (i1, i2) = map(repo.changelog.rev, (p1, p2))
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   332
3979
e0d13267f7a4 hgk: use contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3978
diff changeset
   333
                date = ctx.date()[0]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   334
                ui.write(b"%s %s:%s" % (date, h, mask))
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   335
                mask = is_reachable(want_sha1, reachable, p1)
6217
fe8dbbe9520d Avoid importing mercurial.node/mercurial.repo stuff from mercurial.hg
Joel Rosdahl <joel@rosdahl.net>
parents: 6212
diff changeset
   336
                if i1 != nullrev and mask > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   337
                    ui.write(b"%s:%s " % (h1, mask)),
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   338
                mask = is_reachable(want_sha1, reachable, p2)
6217
fe8dbbe9520d Avoid importing mercurial.node/mercurial.repo stuff from mercurial.hg
Joel Rosdahl <joel@rosdahl.net>
parents: 6212
diff changeset
   339
                if i2 != nullrev and mask > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   340
                    ui.write(b"%s:%s " % (h2, mask))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   341
                ui.write(b"\n")
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   342
            if maxnr and count >= maxnr:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   343
                break
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   344
            count += 1
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   345
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   346
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   347
# git rev-list tries to order things by date, and has the ability to stop
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   348
# at a given commit without walking the whole repo.  TODO add the stop
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   349
# parameter
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   350
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   351
    b'debug-rev-list',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   352
    [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   353
        (b'H', b'header', None, _(b'header')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   354
        (b't', b'topo-order', None, _(b'topo-order')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   355
        (b'p', b'parents', None, _(b'parents')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   356
        (b'n', b'max-count', 0, _(b'max-count')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   357
    ],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   358
    b'[OPTION]... REV...',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   359
)
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   360
def revlist(ui, repo, *revs, **opts):
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   361
    """print revisions"""
44676
1756f75873bf hgk: remove a "b" used on a kwargs expansion, the keys are strs
Kyle Lippincott <spectral@google.com>
parents: 43787
diff changeset
   362
    if opts['header']:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   363
        full = b"commit"
356
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   364
    else:
7dec9a46d82a hgit rev-list support
mpm@selenic.com
parents: 350
diff changeset
   365
        full = None
1239
29f17e083e84 Turn hgit into an extension, and add commands supporting the latest gitk
mason@suse.com
parents: 740
diff changeset
   366
    copy = [x for x in revs]
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   367
    revtree(ui, copy, repo, full, opts['max_count'], opts[r'parents'])
267
497aa6d276d2 Initial import of hgit and hgk
mpm@selenic.com
parents:
diff changeset
   368
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   369
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   370
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   371
    b'view',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   372
    [(b'l', b'limit', b'', _(b'limit number of changes displayed'), _(b'NUM'))],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   373
    _(b'[-l LIMIT] [REVRANGE]'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   374
    helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40293
diff changeset
   375
)
3093
edefbb3a3b08 hgk: add --limit, and revranges
Brendan Cully <brendan@kublai.com>
parents: 3092
diff changeset
   376
def view(ui, repo, *etc, **opts):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43639
diff changeset
   377
    """start interactive history viewer"""
34998
fc0e6d298cd4 py3: handle keyword arguments in hgext/hgk.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34499
diff changeset
   378
    opts = pycompat.byteskwargs(opts)
1278
6a0d373d3126 hgit -> hgk.py
mpm@selenic.com
parents: 1243
diff changeset
   379
    os.chdir(repo.root)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   380
    optstr = b' '.join([b'--%s %s' % (k, v) for k, v in opts.items() if v])
24512
e5c5ddc3b172 hgk: pass --hidden switch to hg subprocesses when needed
Andrew Shadura <andrew@shadura.me>
parents: 24511
diff changeset
   381
    if repo.filtername is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   382
        optstr += b'--hidden'
24512
e5c5ddc3b172 hgk: pass --hidden switch to hg subprocesses when needed
Andrew Shadura <andrew@shadura.me>
parents: 24511
diff changeset
   383
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   384
    cmd = ui.config(b"hgk", b"path") + b" %s %s" % (optstr, b" ".join(etc))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   385
    ui.debug(b"running %s\n" % cmd)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   386
    ui.system(cmd, blockedtag=b'hgk_view')