hgext/graphlog.py
author Patrick Mezard <patrick@mezard.eu>
Wed, 11 Jul 2012 16:47:33 +0200
changeset 17164 8299a9ad48dd
parent 17163 4c5d7124661a
child 17179 0849d725e2f9
permissions -rw-r--r--
graphlog: remove unused ASCIIDATA constant It was introduced by d9acbe7b0049, returned by asciiformat() but never read anywhere. 20140c249e63 stopped using it completely, and the graphmod.CHANGESET type is passed through all functions.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
     1
# ASCII graph log extension for Mercurial
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
     2
#
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
     3
# Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
4516
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4509
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
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: 10097
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
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8932
diff changeset
     8
'''command to view revision graphs from a shell
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
     9
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
    10
This extension adds a --graph option to the incoming, outgoing and log
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
    11
commands. When this options is given, an ASCII representation of the
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
    12
revision graph is also shown.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
    13
'''
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    14
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14311
diff changeset
    15
from mercurial.cmdutil import show_changeset
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    16
from mercurial.i18n import _
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14311
diff changeset
    17
from mercurial import cmdutil, commands, extensions, scmutil
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
    18
from mercurial import hg, util, graphmod, templatekw, revset
5938
9ed100559851 graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents: 4735
diff changeset
    19
14311
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
    20
cmdtable = {}
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
    21
command = cmdutil.command(cmdtable)
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16434
diff changeset
    22
testedwith = 'internal'
14311
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
    23
14130
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    24
def asciiedges(type, char, lines, seen, rev, parents):
8840
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
    25
    """adds edge info to changelog DAG walk suitable for ascii()"""
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    26
    if rev not in seen:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    27
        seen.append(rev)
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    28
    nodeidx = seen.index(rev)
5938
9ed100559851 graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents: 4735
diff changeset
    29
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    30
    knownparents = []
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    31
    newparents = []
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    32
    for parent in parents:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    33
        if parent in seen:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    34
            knownparents.append(parent)
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    35
        else:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    36
            newparents.append(parent)
5938
9ed100559851 graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents: 4735
diff changeset
    37
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    38
    ncols = len(seen)
14130
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    39
    nextseen = seen[:]
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    40
    nextseen[nodeidx:nodeidx + 1] = newparents
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    41
    edges = [(nodeidx, nextseen.index(p)) for p in knownparents]
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    42
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    43
    while len(newparents) > 2:
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    44
        # ascii() only knows how to add or remove a single column between two
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    45
        # calls. Nodes with more than two parents break this constraint so we
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    46
        # introduce intermediate expansion lines to grow the active node list
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    47
        # slowly.
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    48
        edges.append((nodeidx, nodeidx))
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    49
        edges.append((nodeidx, nodeidx + 1))
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    50
        nmorecols = 1
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    51
        yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    52
        char = '\\'
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    53
        lines = []
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    54
        nodeidx += 1
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    55
        ncols += 1
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    56
        edges = []
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    57
        del newparents[0]
7370
7bc62ebe7693 graphlog: refactor common grapher code
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7369
diff changeset
    58
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    59
    if len(newparents) > 0:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    60
        edges.append((nodeidx, nodeidx))
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    61
    if len(newparents) > 1:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
    62
        edges.append((nodeidx, nodeidx + 1))
14130
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    63
    nmorecols = len(nextseen) - ncols
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    64
    seen[:] = nextseen
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
    65
    yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
5938
9ed100559851 graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents: 4735
diff changeset
    66
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
    67
def _fixlongrightedges(edges):
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    68
    for (i, (start, end)) in enumerate(edges):
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    69
        if end > start:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    70
            edges[i] = (start, end + 1)
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    71
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
    72
def _getnodelineedgestail(
7326
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    73
        node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    74
    if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    75
        # Still going in the same non-vertical direction.
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    76
        if n_columns_diff == -1:
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    77
            start = max(node_index + 1, p_node_index)
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    78
            tail = ["|", " "] * (start - node_index - 1)
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    79
            tail.extend(["/", " "] * (n_columns - start))
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    80
            return tail
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    81
        else:
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    82
            return ["\\", " "] * (n_columns - node_index - 1)
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    83
    else:
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    84
        return ["|", " "] * (n_columns - node_index - 1)
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
    85
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
    86
def _drawedges(edges, nodeline, interline):
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    87
    for (start, end) in edges:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    88
        if start == end + 1:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    89
            interline[2 * end + 1] = "/"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    90
        elif start == end - 1:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    91
            interline[2 * start + 1] = "\\"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    92
        elif start == end:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    93
            interline[2 * start] = "|"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    94
        else:
15032
eb87fbc6d702 graphlog: attempt to fix index overrun (issue2912)
Matt Mackall <mpm@selenic.com>
parents: 14416
diff changeset
    95
            if 2 * end >= len(nodeline):
eb87fbc6d702 graphlog: attempt to fix index overrun (issue2912)
Matt Mackall <mpm@selenic.com>
parents: 14416
diff changeset
    96
                continue
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    97
            nodeline[2 * end] = "+"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
    98
            if start > end:
9198
061eeb602354 coding style: use a space after comma
Martin Geisler <mg@lazybytes.net>
parents: 9180
diff changeset
    99
                (start, end) = (end, start)
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   100
            for i in range(2 * start + 1, 2 * end):
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   101
                if nodeline[i] != "+":
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   102
                    nodeline[i] = "-"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   103
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   104
def _getpaddingline(ni, n_columns, edges):
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   105
    line = []
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   106
    line.extend(["|", " "] * ni)
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   107
    if (ni, ni - 1) in edges or (ni, ni) in edges:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   108
        # (ni, ni - 1)      (ni, ni)
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   109
        # | | | |           | | | |
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   110
        # +---o |           | o---+
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   111
        # | | c |           | c | |
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   112
        # | |/ /            | |/ /
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   113
        # | | |             | | |
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   114
        c = "|"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   115
    else:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   116
        c = " "
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   117
    line.extend([c, " "])
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   118
    line.extend(["|", " "] * (n_columns - ni - 1))
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   119
    return line
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   120
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   121
def asciistate():
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   122
    """returns the initial value for the "state" argument to ascii()"""
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   123
    return [0, 0]
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   124
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   125
def ascii(ui, state, type, char, text, coldata):
8839
bbfa21b6f18a graphlog: rename grapher to asciiedges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8838
diff changeset
   126
    """prints an ASCII graph of the DAG
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   127
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   128
    takes the following arguments (one call per node in the graph):
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   129
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   130
      - ui to write to
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   131
      - Somewhere to keep the needed state in (init to asciistate())
7325
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   132
      - Column of the current node in the set of ongoing edges.
17164
8299a9ad48dd graphlog: remove unused ASCIIDATA constant
Patrick Mezard <patrick@mezard.eu>
parents: 17163
diff changeset
   133
      - Type indicator of node data, usually 'C' for changesets.
8840
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
   134
      - Payload: (char, lines):
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
   135
        - Character to use as node's symbol.
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
   136
        - List of lines to display as the node's text.
7325
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   137
      - Edges; a list of (col, next_col) indicating the edges between
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   138
        the current node and its parents.
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   139
      - Number of columns (ongoing edges) in the current revision.
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   140
      - The difference between the number of columns (ongoing edges)
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   141
        in the next revision and the number of columns (ongoing edges)
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   142
        in the current revision. That is: -1 means one column removed;
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   143
        0 means no columns added or removed; 1 means one column added.
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   144
    """
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   145
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   146
    idx, edges, ncols, coldiff = coldata
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   147
    assert -2 < coldiff < 2
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   148
    if coldiff == -1:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   149
        # Transform
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   150
        #
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   151
        #     | | |        | | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   152
        #     o | |  into  o---+
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   153
        #     |X /         |/ /
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   154
        #     | |          | |
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   155
        _fixlongrightedges(edges)
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   156
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   157
    # add_padding_line says whether to rewrite
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   158
    #
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   159
    #     | | | |        | | | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   160
    #     | o---+  into  | o---+
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   161
    #     |  / /         |   | |  # <--- padding line
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   162
    #     o | |          |  / /
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   163
    #                    o | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   164
    add_padding_line = (len(text) > 2 and coldiff == -1 and
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   165
                        [x for (x, y) in edges if x + 1 < y])
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   166
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   167
    # fix_nodeline_tail says whether to rewrite
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   168
    #
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   169
    #     | | o | |        | | o | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   170
    #     | | |/ /         | | |/ /
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   171
    #     | o | |    into  | o / /   # <--- fixed nodeline tail
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   172
    #     | |/ /           | |/ /
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   173
    #     o | |            o | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   174
    fix_nodeline_tail = len(text) <= 2 and not add_padding_line
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   175
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   176
    # nodeline is the line containing the node character (typically o)
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   177
    nodeline = ["|", " "] * idx
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   178
    nodeline.extend([char, " "])
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   179
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   180
    nodeline.extend(
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   181
        _getnodelineedgestail(idx, state[1], ncols, coldiff,
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   182
                              state[0], fix_nodeline_tail))
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   183
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   184
    # shift_interline is the line containing the non-vertical
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   185
    # edges between this entry and the next
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   186
    shift_interline = ["|", " "] * idx
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   187
    if coldiff == -1:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   188
        n_spaces = 1
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   189
        edge_ch = "/"
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   190
    elif coldiff == 0:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   191
        n_spaces = 2
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   192
        edge_ch = "|"
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   193
    else:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   194
        n_spaces = 3
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   195
        edge_ch = "\\"
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   196
    shift_interline.extend(n_spaces * [" "])
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   197
    shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   198
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   199
    # draw edges from the current node to its parents
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   200
    _drawedges(edges, nodeline, shift_interline)
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   201
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   202
    # lines is the list of all graph lines to print
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   203
    lines = [nodeline]
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   204
    if add_padding_line:
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   205
        lines.append(_getpaddingline(idx, ncols, edges))
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   206
    lines.append(shift_interline)
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   207
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   208
    # make sure that there are as many graph lines as there are
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   209
    # log strings
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   210
    while len(text) < len(lines):
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   211
        text.append("")
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   212
    if len(lines) < len(text):
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   213
        extra_interline = ["|", " "] * (ncols + coldiff)
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   214
        while len(lines) < len(text):
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   215
            lines.append(extra_interline)
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   216
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   217
    # print lines
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   218
    indentation_level = max(ncols, ncols + coldiff)
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   219
    for (line, logstr) in zip(lines, text):
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   220
        ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr)
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   221
        ui.write(ln.rstrip() + '\n')
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   222
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   223
    # ... and start over
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   224
    state[0] = coldiff
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   225
    state[1] = idx
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
   226
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   227
def _checkunsupportedflags(pats, opts):
16180
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   228
    for op in ["newest_first"]:
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   229
        if op in opts and opts[op]:
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   230
            raise util.Abort(_("-G/--graph option is incompatible with --%s")
10097
ffa6f2eb934e glog: fix "incompatible option" error message.
Greg Ward <greg-hg@gerg.ca>
parents: 10084
diff changeset
   231
                             % op.replace("_", "-"))
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   232
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   233
def _makefilematcher(repo, pats, followfirst):
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   234
    # When displaying a revision with --patch --follow FILE, we have
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   235
    # to know which file of the revision must be diffed. With
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   236
    # --follow, we want the names of the ancestors of FILE in the
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   237
    # revision, stored in "fcache". "fcache" is populated by
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   238
    # reproducing the graph traversal already done by --follow revset
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   239
    # and relating linkrevs to file names (which is not "correct" but
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   240
    # good enough).
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   241
    fcache = {}
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   242
    fcacheready = [False]
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   243
    pctx = repo['.']
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   244
    wctx = repo[None]
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   245
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   246
    def populate():
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   247
        for fn in pats:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   248
            for i in ((pctx[fn],), pctx[fn].ancestors(followfirst=followfirst)):
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   249
                for c in i:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   250
                    fcache.setdefault(c.linkrev(), set()).add(c.path())
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   251
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   252
    def filematcher(rev):
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   253
        if not fcacheready[0]:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   254
            # Lazy initialization
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   255
            fcacheready[0] = True
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   256
            populate()
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   257
        return scmutil.match(wctx, fcache.get(rev, []), default='path')
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   258
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   259
    return filematcher
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   260
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   261
def _makelogrevset(repo, pats, opts, revs):
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   262
    """Return (expr, filematcher) where expr is a revset string built
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   263
    from log options and file patterns or None. If --stat or --patch
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   264
    are not passed filematcher is None. Otherwise it is a callable
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   265
    taking a revision number and returning a match objects filtering
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   266
    the files to be detailed when displaying the revision.
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   267
    """
14085
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
   268
    opt2revset = {
16174
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   269
        'no_merges':        ('not merge()', None),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   270
        'only_merges':      ('merge()', None),
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   271
        '_ancestors':       ('ancestors(%(val)s)', None),
16409
2cbd7dd0cc1f graphlog: fix --follow-first --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16408
diff changeset
   272
        '_fancestors':      ('_firstancestors(%(val)s)', None),
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   273
        '_descendants':     ('descendants(%(val)s)', None),
16409
2cbd7dd0cc1f graphlog: fix --follow-first --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16408
diff changeset
   274
        '_fdescendants':    ('_firstdescendants(%(val)s)', None),
16316
0f1e621d3d3b graphlog: handle old-style --rev values
Patrick Mezard <patrick@mezard.eu>
parents: 16314
diff changeset
   275
        '_matchfiles':      ('_matchfiles(%(val)s)', None),
16174
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   276
        'date':             ('date(%(val)r)', None),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   277
        'branch':           ('branch(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   278
        '_patslog':         ('filelog(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   279
        '_patsfollow':      ('follow(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   280
        '_patsfollowfirst': ('_followfirst(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   281
        'keyword':          ('keyword(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   282
        'prune':            ('not (%(val)r or ancestors(%(val)r))', ' and '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   283
        'user':             ('user(%(val)r)', ' or '),
14085
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
   284
        }
16157
4a828d3bc04a graphlog: --branch and --only-branch are the same
Patrick Mezard <patrick@mezard.eu>
parents: 16150
diff changeset
   285
16159
ec33539b61f6 graphlog: paths arguments must be or'ed
Patrick Mezard <patrick@mezard.eu>
parents: 16158
diff changeset
   286
    opts = dict(opts)
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   287
    # follow or not follow?
16174
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
   288
    follow = opts.get('follow') or opts.get('follow_first')
16433
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
   289
    followfirst = opts.get('follow_first') and 1 or 0
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   290
    # --follow with FILE behaviour depends on revs...
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   291
    startrev = revs[0]
16433
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
   292
    followdescendants = (len(revs) > 1 and revs[0] < revs[1]) and 1 or 0
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   293
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   294
    # branch and only_branch are really aliases and must be handled at
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   295
    # the same time
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   296
    opts['branch'] = opts.get('branch', []) + opts.get('only_branch', [])
16407
49ef1c382965 graphlog: support changeset identifiers in --branch
Patrick Mezard <patrick@mezard.eu>
parents: 16406
diff changeset
   297
    opts['branch'] = [repo.lookupbranch(b) for b in opts['branch']]
16171
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16161
diff changeset
   298
    # pats/include/exclude are passed to match.match() directly in
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16161
diff changeset
   299
    # _matchfile() revset but walkchangerevs() builds its matcher with
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16161
diff changeset
   300
    # scmutil.match(). The difference is input pats are globbed on
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16161
diff changeset
   301
    # platforms without shell expansion (windows).
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   302
    pctx = repo[None]
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   303
    match, pats = scmutil.matchandpats(pctx, pats, opts)
16160
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   304
    slowpath = match.anypats() or (match.files() and opts.get('removed'))
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   305
    if not slowpath:
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   306
        for f in match.files():
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   307
            if follow and f not in pctx:
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   308
                raise util.Abort(_('cannot follow file not in parent '
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   309
                                   'revision: "%s"') % f)
16160
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   310
            filelog = repo.file(f)
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   311
            if not len(filelog):
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   312
                # A zero count may be a directory or deleted file, so
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   313
                # try to find matching entries on the slow path.
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   314
                if follow:
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   315
                    raise util.Abort(
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   316
                        _('cannot follow nonexistent file: "%s"') % f)
16160
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   317
                slowpath = True
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   318
    if slowpath:
16161
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   319
        # See cmdutil.walkchangerevs() slow path.
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   320
        #
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   321
        if follow:
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   322
            raise util.Abort(_('can only follow copies/renames for explicit '
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   323
                               'filenames'))
16161
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   324
        # pats/include/exclude cannot be represented as separate
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   325
        # revset expressions as their filtering logic applies at file
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   326
        # level. For instance "-I a -X a" matches a revision touching
16181
1fd352aa08fc graphlog: evaluate FILE/-I/-X filesets on the working dir
Patrick Mezard <patrick@mezard.eu>
parents: 16180
diff changeset
   327
        # "a" and "b" while "file(a) and not file(b)" does
1fd352aa08fc graphlog: evaluate FILE/-I/-X filesets on the working dir
Patrick Mezard <patrick@mezard.eu>
parents: 16180
diff changeset
   328
        # not. Besides, filesets are evaluated against the working
1fd352aa08fc graphlog: evaluate FILE/-I/-X filesets on the working dir
Patrick Mezard <patrick@mezard.eu>
parents: 16180
diff changeset
   329
        # directory.
16411
4c2edcd84175 graphlog: correctly handle calls in subdirectories
Patrick Mezard <patrick@mezard.eu>
parents: 16409
diff changeset
   330
        matchargs = ['r:', 'd:relpath']
16161
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   331
        for p in pats:
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   332
            matchargs.append('p:' + p)
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   333
        for p in opts.get('include', []):
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   334
            matchargs.append('i:' + p)
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   335
        for p in opts.get('exclude', []):
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   336
            matchargs.append('x:' + p)
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
   337
        matchargs = ','.join(('%r' % p) for p in matchargs)
16316
0f1e621d3d3b graphlog: handle old-style --rev values
Patrick Mezard <patrick@mezard.eu>
parents: 16314
diff changeset
   338
        opts['_matchfiles'] = matchargs
16160
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
   339
    else:
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   340
        if follow:
16433
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
   341
            fpats = ('_patsfollow', '_patsfollowfirst')
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
   342
            fnopats = (('_ancestors', '_fancestors'),
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
   343
                       ('_descendants', '_fdescendants'))
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
   344
            if pats:
16434
8b62a77d0895 graphlog: fix --follow FILE and relative paths
Patrick Mezard <patrick@mezard.eu>
parents: 16433
diff changeset
   345
                # follow() revset inteprets its file argument as a
8b62a77d0895 graphlog: fix --follow FILE and relative paths
Patrick Mezard <patrick@mezard.eu>
parents: 16433
diff changeset
   346
                # manifest entry, so use match.files(), not pats.
8b62a77d0895 graphlog: fix --follow FILE and relative paths
Patrick Mezard <patrick@mezard.eu>
parents: 16433
diff changeset
   347
                opts[fpats[followfirst]] = list(match.files())
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   348
            else:
16433
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
   349
                opts[fnopats[followdescendants][followfirst]] = str(startrev)
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   350
        else:
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
   351
            opts['_patslog'] = list(pats)
16157
4a828d3bc04a graphlog: --branch and --only-branch are the same
Patrick Mezard <patrick@mezard.eu>
parents: 16150
diff changeset
   352
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   353
    filematcher = None
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   354
    if opts.get('patch') or opts.get('stat'):
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   355
        if follow:
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   356
            filematcher = _makefilematcher(repo, pats, followfirst)
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   357
        else:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   358
            filematcher = lambda rev: match
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   359
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   360
    expr = []
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   361
    for op, val in opts.iteritems():
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   362
        if not val:
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   363
            continue
14085
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
   364
        if op not in opt2revset:
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
   365
            continue
16147
5607d829bf17 graphlog: explicitely join multivalue parameters
Patrick Mezard <patrick@mezard.eu>
parents: 15032
diff changeset
   366
        revop, andor = opt2revset[op]
16158
e04cc21b01b2 graphlog: rewrite --rev like all other options
Patrick Mezard <patrick@mezard.eu>
parents: 16157
diff changeset
   367
        if '%(val)' not in revop:
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   368
            expr.append(revop)
14085
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
   369
        else:
16147
5607d829bf17 graphlog: explicitely join multivalue parameters
Patrick Mezard <patrick@mezard.eu>
parents: 15032
diff changeset
   370
            if not isinstance(val, list):
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   371
                e = revop % {'val': val}
16147
5607d829bf17 graphlog: explicitely join multivalue parameters
Patrick Mezard <patrick@mezard.eu>
parents: 15032
diff changeset
   372
            else:
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   373
                e = '(' + andor.join((revop % {'val': v}) for v in val) + ')'
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   374
            expr.append(e)
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   375
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   376
    if expr:
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   377
        expr = '(' + ' and '.join(expr) + ')'
14132
7d3bd0640262 graphlog: take the union of --rev specs instead of the intersection
Patrick Mezard <pmezard@gmail.com>
parents: 14130
diff changeset
   378
    else:
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   379
        expr = None
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
   380
    return expr, filematcher
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   381
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   382
def getlogrevs(repo, pats, opts):
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   383
    """Return (revs, expr, filematcher) where revs is an iterable of
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   384
    revision numbers, expr is a revset string built from log options
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   385
    and file patterns or None, and used to filter 'revs'. If --stat or
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   386
    --patch are not passed filematcher is None. Otherwise it is a
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   387
    callable taking a revision number and returning a match objects
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   388
    filtering the files to be detailed when displaying the revision.
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   389
    """
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   390
    def increasingrevs(repo, revs, matcher):
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   391
        # The sorted input rev sequence is chopped in sub-sequences
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   392
        # which are sorted in ascending order and passed to the
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   393
        # matcher. The filtered revs are sorted again as they were in
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   394
        # the original sub-sequence. This achieve several things:
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   395
        #
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   396
        # - getlogrevs() now returns a generator which behaviour is
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   397
        #   adapted to log need. First results come fast, last ones
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   398
        #   are batched for performances.
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   399
        #
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   400
        # - revset matchers often operate faster on revision in
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   401
        #   changelog order, because most filters deal with the
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   402
        #   changelog.
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   403
        #
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   404
        # - revset matchers can reorder revisions. "A or B" typically
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   405
        #   returns returns the revision matching A then the revision
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   406
        #   matching B. We want to hide this internal implementation
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   407
        #   detail from the caller, and sorting the filtered revision
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   408
        #   again achieves this.
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   409
        for i, window in cmdutil.increasingwindows(0, len(revs), windowsize=1):
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   410
            orevs = revs[i:i + window]
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   411
            nrevs = set(matcher(repo, sorted(orevs)))
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   412
            for rev in orevs:
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   413
                if rev in nrevs:
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   414
                    yield rev
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   415
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   416
    if not len(repo):
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   417
        return iter([]), None, None
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   418
    # Default --rev value depends on --follow but --follow behaviour
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   419
    # depends on revisions resolved from --rev...
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   420
    follow = opts.get('follow') or opts.get('follow_first')
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   421
    if opts.get('rev'):
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   422
        revs = scmutil.revrange(repo, opts['rev'])
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   423
    else:
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   424
        if follow and len(repo) > 0:
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   425
            revs = scmutil.revrange(repo, ['.:0'])
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   426
        else:
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
   427
            revs = range(len(repo) - 1, -1, -1)
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   428
    if not revs:
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   429
        return iter([]), None, None
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   430
    expr, filematcher = _makelogrevset(repo, pats, opts, revs)
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   431
    if expr:
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   432
        matcher = revset.match(repo.ui, expr)
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   433
        revs = increasingrevs(repo, revs, matcher)
16431
c85098cdd7df graphlog: implement --hidden
Patrick Mezard <patrick@mezard.eu>
parents: 16412
diff changeset
   434
    if not opts.get('hidden'):
c85098cdd7df graphlog: implement --hidden
Patrick Mezard <patrick@mezard.eu>
parents: 16412
diff changeset
   435
        # --hidden is still experimental and not worth a dedicated revset
c85098cdd7df graphlog: implement --hidden
Patrick Mezard <patrick@mezard.eu>
parents: 16412
diff changeset
   436
        # yet. Fortunately, filtering revision number is fast.
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   437
        revs = (r for r in revs if r not in repo.changelog.hiddenrevs)
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   438
    else:
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
   439
        revs = iter(revs)
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   440
    return revs, expr, filematcher
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   441
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   442
def generate(ui, dag, displayer, showparents, edgefn, getrenamed=None,
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   443
             filematcher=None):
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
   444
    seen, state = [], asciistate()
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
   445
    for rev, type, ctx, parents in dag:
17119
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
   446
        char = 'o'
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
   447
        if ctx.node() in showparents:
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
   448
            char = '@'
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
   449
        elif ctx.obsolete():
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
   450
            char = 'x'
16180
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   451
        copies = None
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   452
        if getrenamed and ctx.rev():
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   453
            copies = []
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   454
            for fn in ctx.files():
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   455
                rename = getrenamed(fn, ctx.rev())
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   456
                if rename:
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   457
                    copies.append((fn, rename[0]))
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   458
        revmatchfn = None
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   459
        if filematcher is not None:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   460
            revmatchfn = filematcher(ctx.rev())
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   461
        displayer.show(ctx, copies=copies, matchfn=revmatchfn)
17120
01d847e0fdc9 graphlog: don't truncate template value at last \n
Mads Kiilerich <mads@kiilerich.com>
parents: 17119
diff changeset
   462
        lines = displayer.hunk.pop(rev).split('\n')
01d847e0fdc9 graphlog: don't truncate template value at last \n
Mads Kiilerich <mads@kiilerich.com>
parents: 17119
diff changeset
   463
        if not lines[-1]:
01d847e0fdc9 graphlog: don't truncate template value at last \n
Mads Kiilerich <mads@kiilerich.com>
parents: 17119
diff changeset
   464
            del lines[-1]
12579
aa1faedeac5a graphlog: style with header and footer (issue2395)
Mads Kiilerich <mads@kiilerich.com>
parents: 11776
diff changeset
   465
        displayer.flush(rev)
14130
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
   466
        edges = edgefn(type, char, lines, seen, rev, parents)
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
   467
        for type, char, lines, coldata in edges:
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
   468
            ascii(ui, state, type, char, lines, coldata)
12579
aa1faedeac5a graphlog: style with header and footer (issue2395)
Mads Kiilerich <mads@kiilerich.com>
parents: 11776
diff changeset
   469
    displayer.close()
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
   470
14311
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
   471
@command('glog',
16432
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   472
    [('f', 'follow', None,
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   473
     _('follow changeset history, or file history across copies and renames')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   474
    ('', 'follow-first', None,
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   475
     _('only follow the first parent of merge changesets (DEPRECATED)')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   476
    ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   477
    ('C', 'copies', None, _('show copied files')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   478
    ('k', 'keyword', [],
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   479
     _('do case-insensitive search for a given text'), _('TEXT')),
14311
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
   480
    ('r', 'rev', [], _('show the specified revision or range'), _('REV')),
16432
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   481
    ('', 'removed', None, _('include revisions where files were removed')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   482
    ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   483
    ('u', 'user', [], _('revisions committed by user'), _('USER')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   484
    ('', 'only-branch', [],
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   485
     _('show only changesets within the given named branch (DEPRECATED)'),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   486
     _('BRANCH')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   487
    ('b', 'branch', [],
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   488
     _('show changesets within the given named branch'), _('BRANCH')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   489
    ('P', 'prune', [],
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   490
     _('do not display revision or any of its ancestors'), _('REV')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   491
    ('', 'hidden', False, _('show hidden changesets (DEPRECATED)')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   492
    ] + commands.logopts + commands.walkopts,
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
   493
    _('[OPTION]... [FILE]'))
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   494
def graphlog(ui, repo, *pats, **opts):
7325
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   495
    """show revision history alongside an ASCII revision graph
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   496
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
   497
    Print a revision history alongside a revision graph drawn with
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
   498
    ASCII characters.
7325
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   499
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
   500
    Nodes printed as an @ character are parents of the working
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
   501
    directory.
7325
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   502
    """
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   503
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
   504
    revs, expr, filematcher = getlogrevs(repo, pats, opts)
16316
0f1e621d3d3b graphlog: handle old-style --rev values
Patrick Mezard <patrick@mezard.eu>
parents: 16314
diff changeset
   505
    revs = sorted(revs, reverse=1)
14133
28085b82f801 graphlog: always sort revisions topologically
Patrick Mezard <pmezard@gmail.com>
parents: 14132
diff changeset
   506
    limit = cmdutil.loglimit(opts)
28085b82f801 graphlog: always sort revisions topologically
Patrick Mezard <pmezard@gmail.com>
parents: 14132
diff changeset
   507
    if limit is not None:
28085b82f801 graphlog: always sort revisions topologically
Patrick Mezard <pmezard@gmail.com>
parents: 14132
diff changeset
   508
        revs = revs[:limit]
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   509
    revdag = graphmod.dagwalker(repo, revs)
7325
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   510
16180
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   511
    getrenamed = None
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   512
    if opts.get('copies'):
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   513
        endrev = None
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   514
        if opts.get('rev'):
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   515
            endrev = max(scmutil.revrange(repo, opts.get('rev'))) + 1
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
   516
        getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
9368
8a4773bcbaec graphlog: extract some setup code out of common functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9259
diff changeset
   517
    displayer = show_changeset(ui, repo, opts, buffered=True)
8a4773bcbaec graphlog: extract some setup code out of common functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9259
diff changeset
   518
    showparents = [ctx.node() for ctx in repo[None].parents()]
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   519
    generate(ui, revdag, displayer, showparents, asciiedges, getrenamed,
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
   520
             filematcher)
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   521
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   522
def graphrevs(repo, nodes, opts):
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   523
    limit = cmdutil.loglimit(opts)
8837
d8e3a98018cb graphmod/graphlog: extract nodelistwalk
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8836
diff changeset
   524
    nodes.reverse()
10111
27457d31ae3f cmdutil: replace sys.maxint with None as default value in loglimit
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10097
diff changeset
   525
    if limit is not None:
8837
d8e3a98018cb graphmod/graphlog: extract nodelistwalk
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8836
diff changeset
   526
        nodes = nodes[:limit]
d8e3a98018cb graphmod/graphlog: extract nodelistwalk
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8836
diff changeset
   527
    return graphmod.nodes(repo, nodes)
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   528
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   529
def goutgoing(ui, repo, dest=None, **opts):
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   530
    """show the outgoing changesets alongside an ASCII revision graph
7325
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
   531
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   532
    Print the outgoing changesets alongside a revision graph drawn with
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   533
    ASCII characters.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   534
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   535
    Nodes printed as an @ character are parents of the working
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   536
    directory.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   537
    """
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   538
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   539
    _checkunsupportedflags([], opts)
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12730
diff changeset
   540
    o = hg._outgoing(ui, repo, dest, opts)
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12730
diff changeset
   541
    if o is None:
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   542
        return
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   543
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   544
    revdag = graphrevs(repo, o, opts)
9368
8a4773bcbaec graphlog: extract some setup code out of common functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9259
diff changeset
   545
    displayer = show_changeset(ui, repo, opts, buffered=True)
8a4773bcbaec graphlog: extract some setup code out of common functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9259
diff changeset
   546
    showparents = [ctx.node() for ctx in repo[None].parents()]
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   547
    generate(ui, revdag, displayer, showparents, asciiedges)
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   548
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   549
def gincoming(ui, repo, source="default", **opts):
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   550
    """show the incoming changesets alongside an ASCII revision graph
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   551
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
   552
    Print the incoming changesets alongside a revision graph drawn with
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
   553
    ASCII characters.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   554
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
   555
    Nodes printed as an @ character are parents of the working
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
   556
    directory.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   557
    """
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12579
diff changeset
   558
    def subreporecurse():
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12579
diff changeset
   559
        return 1
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   560
17163
4c5d7124661a graphlog: make functions private, fix names
Patrick Mezard <patrick@mezard.eu>
parents: 17162
diff changeset
   561
    _checkunsupportedflags([], opts)
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12579
diff changeset
   562
    def display(other, chlist, displayer):
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
   563
        revdag = graphrevs(other, chlist, opts)
9368
8a4773bcbaec graphlog: extract some setup code out of common functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9259
diff changeset
   564
        showparents = [ctx.node() for ctx in repo[None].parents()]
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
   565
        generate(ui, revdag, displayer, showparents, asciiedges)
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   566
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12579
diff changeset
   567
    hg._incoming(display, subreporecurse, ui, repo, source, opts, buffered=True)
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   568
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   569
def uisetup(ui):
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   570
    '''Initialize the extension.'''
14416
253bda94372e graphlog: remove unused arg from _wrapcmd
Idan Kamara <idankk86@gmail.com>
parents: 14319
diff changeset
   571
    _wrapcmd('log', commands.table, graphlog)
253bda94372e graphlog: remove unused arg from _wrapcmd
Idan Kamara <idankk86@gmail.com>
parents: 14319
diff changeset
   572
    _wrapcmd('incoming', commands.table, gincoming)
253bda94372e graphlog: remove unused arg from _wrapcmd
Idan Kamara <idankk86@gmail.com>
parents: 14319
diff changeset
   573
    _wrapcmd('outgoing', commands.table, goutgoing)
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   574
14416
253bda94372e graphlog: remove unused arg from _wrapcmd
Idan Kamara <idankk86@gmail.com>
parents: 14319
diff changeset
   575
def _wrapcmd(cmd, table, wrapfn):
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   576
    '''wrap the command'''
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   577
    def graph(orig, *args, **kwargs):
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   578
        if kwargs['graph']:
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
   579
            return wrapfn(*args, **kwargs)
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   580
        return orig(*args, **kwargs)
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
   581
    entry = extensions.wrapcommand(table, cmd, graph)
7763
cdc913e7fc5f log-like commands now use -G for --graph, -g for --git
Jim Correia <jim.correia@pobox.com>
parents: 7716
diff changeset
   582
    entry[1].append(('G', 'graph', None, _("show the revision DAG")))