annotate hgext/graphlog.py @ 17119:2e13c1bd34dc

graphlog: display obsolete changeset as "x" Changeset detected as obsolete will be displayed as "x" instead of 'o': o new rewritten changeset | | x old obsolete changeset |/ | o base This will be useful even when some obsolete changeset will be "hidden" because not all obsolete changeset can be hidden. If an obsolete changeset have non-obsolete descendant we can't simply hide it. And having a clear visual hint that the changeset is obsolete is useful. The main reason to make this minor change right now is to: 1) introduce an officiel user of the `ctx.obsolete()` method that will detect breakage earlier than third party code (mutable, hgview) 2) Do not display any vocabulary related to obsolete. Such vocabulary will require discussion.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Wed, 04 Jul 2012 17:29:49 +0200
parents 058e14da7044
children 01d847e0fdc9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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 _
6212
e75aab656f46 Remove unused imports
Joel Rosdahl <joel@rosdahl.net>
parents: 6192
diff changeset
17 from mercurial.node import nullrev
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14311
diff changeset
18 from mercurial import cmdutil, commands, extensions, scmutil
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
19 from mercurial import hg, util, graphmod, templatekw, revset
5938
9ed100559851 graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents: 4735
diff changeset
20
14311
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
21 cmdtable = {}
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
22 command = cmdutil.command(cmdtable)
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16434
diff changeset
23 testedwith = 'internal'
14311
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
24
8840
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
25 ASCIIDATA = 'ASC'
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
26
14130
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
27 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
28 """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
29 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
30 seen.append(rev)
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
31 nodeidx = seen.index(rev)
5938
9ed100559851 graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents: 4735
diff changeset
32
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
33 knownparents = []
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
34 newparents = []
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
35 for parent in parents:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
36 if parent in seen:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
37 knownparents.append(parent)
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
38 else:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
39 newparents.append(parent)
5938
9ed100559851 graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents: 4735
diff changeset
40
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
41 ncols = len(seen)
14130
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
42 nextseen = seen[:]
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
43 nextseen[nodeidx:nodeidx + 1] = newparents
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
44 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
45
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
46 while len(newparents) > 2:
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
47 # 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
48 # 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
49 # 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
50 # slowly.
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
51 edges.append((nodeidx, nodeidx))
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
52 edges.append((nodeidx, nodeidx + 1))
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
53 nmorecols = 1
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
54 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
55 char = '\\'
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
56 lines = []
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
57 nodeidx += 1
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
58 ncols += 1
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
59 edges = []
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
60 del newparents[0]
7370
7bc62ebe7693 graphlog: refactor common grapher code
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7369
diff changeset
61
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
62 if len(newparents) > 0:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
63 edges.append((nodeidx, nodeidx))
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
64 if len(newparents) > 1:
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
65 edges.append((nodeidx, nodeidx + 1))
14130
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
66 nmorecols = len(nextseen) - ncols
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
67 seen[:] = nextseen
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
68 yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
5938
9ed100559851 graphlog: add filelog revision grapher
Steve Borho <steve@borho.org>
parents: 4735
diff changeset
69
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
70 def fix_long_right_edges(edges):
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
71 for (i, (start, end)) in enumerate(edges):
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
72 if end > start:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
73 edges[i] = (start, end + 1)
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
74
7326
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
75 def get_nodeline_edges_tail(
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
76 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
77 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
78 # 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
79 if n_columns_diff == -1:
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
80 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
81 tail = ["|", " "] * (start - node_index - 1)
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
82 tail.extend(["/", " "] * (n_columns - start))
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
83 return tail
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
84 else:
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
85 return ["\\", " "] * (n_columns - node_index - 1)
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
86 else:
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
87 return ["|", " "] * (n_columns - node_index - 1)
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
88
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
89 def draw_edges(edges, nodeline, interline):
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
90 for (start, end) in edges:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
91 if start == end + 1:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
92 interline[2 * end + 1] = "/"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
93 elif start == end - 1:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
94 interline[2 * start + 1] = "\\"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
95 elif start == end:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
96 interline[2 * start] = "|"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
97 else:
15032
eb87fbc6d702 graphlog: attempt to fix index overrun (issue2912)
Matt Mackall <mpm@selenic.com>
parents: 14416
diff changeset
98 if 2 * end >= len(nodeline):
eb87fbc6d702 graphlog: attempt to fix index overrun (issue2912)
Matt Mackall <mpm@selenic.com>
parents: 14416
diff changeset
99 continue
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
100 nodeline[2 * end] = "+"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
101 if start > end:
9198
061eeb602354 coding style: use a space after comma
Martin Geisler <mg@lazybytes.net>
parents: 9180
diff changeset
102 (start, end) = (end, start)
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
103 for i in range(2 * start + 1, 2 * end):
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
104 if nodeline[i] != "+":
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
105 nodeline[i] = "-"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
106
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
107 def get_padding_line(ni, n_columns, edges):
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
108 line = []
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
109 line.extend(["|", " "] * ni)
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
110 if (ni, ni - 1) in edges or (ni, ni) in edges:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
111 # (ni, ni - 1) (ni, ni)
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 # +---o | | o---+
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
114 # | | c | | c | |
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
115 # | |/ / | |/ /
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
116 # | | | | | |
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
117 c = "|"
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
118 else:
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
119 c = " "
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
120 line.extend([c, " "])
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
121 line.extend(["|", " "] * (n_columns - ni - 1))
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
122 return line
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
123
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
124 def asciistate():
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
125 """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
126 return [0, 0]
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
127
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
128 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
129 """prints an ASCII graph of the DAG
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
130
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
131 takes the following arguments (one call per node in the graph):
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
132
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
133 - ui to write to
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
134 - 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
135 - Column of the current node in the set of ongoing edges.
8840
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
136 - Type indicator of node data == ASCIIDATA.
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
137 - Payload: (char, lines):
d9acbe7b0049 graphmod/graphlog: make dag walks carry data as type, payload
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8839
diff changeset
138 - 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
139 - 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
140 - 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
141 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
142 - 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
143 - 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
144 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
145 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
146 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
147 """
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
148
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
149 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
150 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
151 if coldiff == -1:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
152 # Transform
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
153 #
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
154 # | | | | | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
155 # o | | into o---+
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
156 # |X / |/ /
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
157 # | | | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
158 fix_long_right_edges(edges)
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 # 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
161 #
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
162 # | | | | | | | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
163 # | o---+ into | o---+
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
164 # | / / | | | # <--- padding line
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
165 # o | | | / /
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
166 # o | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
167 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
168 [x for (x, y) in edges if x + 1 < y])
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
169
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
170 # 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
171 #
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
172 # | | o | | | | o | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
173 # | | |/ / | | |/ /
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
174 # | 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
175 # | |/ / | |/ /
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
176 # o | | o | |
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
177 fix_nodeline_tail = len(text) <= 2 and not add_padding_line
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
178
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
179 # 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
180 nodeline = ["|", " "] * idx
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
181 nodeline.extend([char, " "])
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
182
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
183 nodeline.extend(
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
184 get_nodeline_edges_tail(idx, state[1], ncols, coldiff,
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
185 state[0], fix_nodeline_tail))
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
186
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
187 # 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
188 # 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
189 shift_interline = ["|", " "] * idx
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
190 if coldiff == -1:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
191 n_spaces = 1
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 elif coldiff == 0:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
194 n_spaces = 2
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 else:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
197 n_spaces = 3
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
198 edge_ch = "\\"
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
199 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
200 shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
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 # draw edges from the current node to its parents
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
203 draw_edges(edges, nodeline, shift_interline)
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
204
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
205 # 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
206 lines = [nodeline]
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
207 if add_padding_line:
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
208 lines.append(get_padding_line(idx, ncols, edges))
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
209 lines.append(shift_interline)
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
210
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
211 # 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
212 # log strings
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
213 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
214 text.append("")
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
215 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
216 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
217 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
218 lines.append(extra_interline)
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
219
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
220 # print lines
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
221 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
222 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
223 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
224 ui.write(ln.rstrip() + '\n')
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
225
9371
571a7acb4544 graphlog: simplify ascii drawing to process one cset at a time
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9370
diff changeset
226 # ... and start over
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
227 state[0] = coldiff
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
228 state[1] = idx
4344
345ed833854d Add graphlog extension
Joel Rosdahl <joel@rosdahl.net>
parents:
diff changeset
229
7326
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
230 def get_revs(repo, rev_opt):
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
231 if rev_opt:
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14311
diff changeset
232 revs = scmutil.revrange(repo, rev_opt)
11448
25430ff23cfa glog: fix crash on empty revision range
Eric Eisner <ede@mit.edu>
parents: 11321
diff changeset
233 if len(revs) == 0:
25430ff23cfa glog: fix crash on empty revision range
Eric Eisner <ede@mit.edu>
parents: 11321
diff changeset
234 return (nullrev, nullrev)
7326
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
235 return (max(revs), min(revs))
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
236 else:
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
237 return (len(repo) - 1, 0)
ba7ab8c4a577 graphlog: move functions around, eliminate helper function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7325
diff changeset
238
14086
2d7cb340a53f graphlog: log -G --follow file does not work, forbid it
Patrick Mezard <pmezard@gmail.com>
parents: 14085
diff changeset
239 def check_unsupported_flags(pats, opts):
16180
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
240 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
241 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
242 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
243 % op.replace("_", "-"))
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
244
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
245 def _makefilematcher(repo, pats, followfirst):
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
246 # 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
247 # 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
248 # --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
249 # 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
250 # 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
251 # 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
252 # good enough).
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
253 fcache = {}
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
254 fcacheready = [False]
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
255 pctx = repo['.']
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
256 wctx = repo[None]
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
257
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
258 def populate():
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
259 for fn in pats:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
260 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
261 for c in i:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
262 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
263
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
264 def filematcher(rev):
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
265 if not fcacheready[0]:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
266 # Lazy initialization
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
267 fcacheready[0] = True
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
268 populate()
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
269 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
270
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
271 return filematcher
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
272
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
273 def _makelogrevset(repo, pats, opts, revs):
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
274 """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
275 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
276 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
277 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
278 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
279 """
14085
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
280 opt2revset = {
16174
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
281 'no_merges': ('not merge()', None),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
282 'only_merges': ('merge()', None),
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
283 '_ancestors': ('ancestors(%(val)s)', None),
16409
2cbd7dd0cc1f graphlog: fix --follow-first --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16408
diff changeset
284 '_fancestors': ('_firstancestors(%(val)s)', None),
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
285 '_descendants': ('descendants(%(val)s)', None),
16409
2cbd7dd0cc1f graphlog: fix --follow-first --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16408
diff changeset
286 '_fdescendants': ('_firstdescendants(%(val)s)', None),
16316
0f1e621d3d3b graphlog: handle old-style --rev values
Patrick Mezard <patrick@mezard.eu>
parents: 16314
diff changeset
287 '_matchfiles': ('_matchfiles(%(val)s)', None),
16174
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
288 'date': ('date(%(val)r)', None),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
289 'branch': ('branch(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
290 '_patslog': ('filelog(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
291 '_patsfollow': ('follow(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
292 '_patsfollowfirst': ('_followfirst(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
293 'keyword': ('keyword(%(val)r)', ' or '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
294 'prune': ('not (%(val)r or ancestors(%(val)r))', ' and '),
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
295 'user': ('user(%(val)r)', ' or '),
14085
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
296 }
16157
4a828d3bc04a graphlog: --branch and --only-branch are the same
Patrick Mezard <patrick@mezard.eu>
parents: 16150
diff changeset
297
16159
ec33539b61f6 graphlog: paths arguments must be or'ed
Patrick Mezard <patrick@mezard.eu>
parents: 16158
diff changeset
298 opts = dict(opts)
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
299 # follow or not follow?
16174
0a73c4bd9f47 graphlog: implement --follow-first
Patrick Mezard <patrick@mezard.eu>
parents: 16173
diff changeset
300 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
301 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
302 # --follow with FILE behaviour depends on revs...
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
303 startrev = revs[0]
16433
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
304 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
305
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
306 # 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
307 # the same time
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
308 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
309 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
310 # 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
311 # _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
312 # 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
313 # platforms without shell expansion (windows).
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
314 pctx = repo[None]
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
315 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
316 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
317 if not slowpath:
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
318 for f in match.files():
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
319 if follow and f not in pctx:
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
320 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
321 'revision: "%s"') % f)
16160
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
322 filelog = repo.file(f)
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
323 if not len(filelog):
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
324 # 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
325 # 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
326 if follow:
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
327 raise util.Abort(
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
328 _('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
329 slowpath = True
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
330 if slowpath:
16161
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
331 # See cmdutil.walkchangerevs() slow path.
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
332 #
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
333 if follow:
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
334 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
335 'filenames'))
16161
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
336 # 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
337 # 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
338 # 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
339 # "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
340 # 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
341 # directory.
16411
4c2edcd84175 graphlog: correctly handle calls in subdirectories
Patrick Mezard <patrick@mezard.eu>
parents: 16409
diff changeset
342 matchargs = ['r:', 'd:relpath']
16161
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
343 for p in pats:
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
344 matchargs.append('p:' + p)
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
345 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
346 matchargs.append('i:' + p)
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
347 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
348 matchargs.append('x:' + p)
5a627b49b4d9 graphlog: paths/-I/-X handling requires a new revset
Patrick Mezard <patrick@mezard.eu>
parents: 16160
diff changeset
349 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
350 opts['_matchfiles'] = matchargs
16160
1bfc7ba8b404 graphlog: imitate log slowpath when inputs are explicit files
Patrick Mezard <patrick@mezard.eu>
parents: 16159
diff changeset
351 else:
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
352 if follow:
16433
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
353 fpats = ('_patsfollow', '_patsfollowfirst')
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
354 fnopats = (('_ancestors', '_fancestors'),
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
355 ('_descendants', '_fdescendants'))
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
356 if pats:
16434
8b62a77d0895 graphlog: fix --follow FILE and relative paths
Patrick Mezard <patrick@mezard.eu>
parents: 16433
diff changeset
357 # 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
358 # 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
359 opts[fpats[followfirst]] = list(match.files())
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
360 else:
16433
e38b29937118 graphlog: reduce duplication in --follow code
Patrick Mezard <patrick@mezard.eu>
parents: 16432
diff changeset
361 opts[fnopats[followdescendants][followfirst]] = str(startrev)
16173
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
362 else:
9178d284b880 graphlog: implement --follow with file arguments
Patrick Mezard <patrick@mezard.eu>
parents: 16171
diff changeset
363 opts['_patslog'] = list(pats)
16157
4a828d3bc04a graphlog: --branch and --only-branch are the same
Patrick Mezard <patrick@mezard.eu>
parents: 16150
diff changeset
364
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
365 filematcher = None
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
366 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
367 if follow:
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
368 filematcher = _makefilematcher(repo, pats, followfirst)
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
369 else:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
370 filematcher = lambda rev: match
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
371
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
372 expr = []
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
373 for op, val in opts.iteritems():
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
374 if not val:
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
375 continue
14085
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
376 if op not in opt2revset:
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
377 continue
16147
5607d829bf17 graphlog: explicitely join multivalue parameters
Patrick Mezard <patrick@mezard.eu>
parents: 15032
diff changeset
378 revop, andor = opt2revset[op]
16158
e04cc21b01b2 graphlog: rewrite --rev like all other options
Patrick Mezard <patrick@mezard.eu>
parents: 16157
diff changeset
379 if '%(val)' not in revop:
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
380 expr.append(revop)
14085
4852753dae36 graphlog: unify log -G revset translation
Patrick Mezard <pmezard@gmail.com>
parents: 14084
diff changeset
381 else:
16147
5607d829bf17 graphlog: explicitely join multivalue parameters
Patrick Mezard <patrick@mezard.eu>
parents: 15032
diff changeset
382 if not isinstance(val, list):
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
383 e = revop % {'val': val}
16147
5607d829bf17 graphlog: explicitely join multivalue parameters
Patrick Mezard <patrick@mezard.eu>
parents: 15032
diff changeset
384 else:
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
385 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
386 expr.append(e)
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
387
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
388 if expr:
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
389 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
390 else:
16412
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
391 expr = None
1a10bee86e33 graphlog: cleanup before code move
Patrick Mezard <patrick@mezard.eu>
parents: 16411
diff changeset
392 return expr, filematcher
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
393
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
394 def getlogrevs(repo, pats, opts):
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
395 """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
396 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
397 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
398 --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
399 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
400 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
401 """
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
402 def increasingrevs(repo, revs, matcher):
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
403 # 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
404 # 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
405 # 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
406 # the original sub-sequence. This achieve several things:
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
407 #
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
408 # - getlogrevs() now returns a generator which behaviour is
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
409 # 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
410 # are batched for performances.
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
411 #
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
412 # - revset matchers often operate faster on revision in
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
413 # changelog order, because most filters deal with the
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
414 # changelog.
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
415 #
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
416 # - 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
417 # 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
418 # 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
419 # 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
420 # again achieves this.
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
421 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
422 orevs = revs[i:i + window]
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
423 nrevs = set(matcher(repo, sorted(orevs)))
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
424 for rev in orevs:
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
425 if rev in nrevs:
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
426 yield rev
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
427
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
428 if not len(repo):
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
429 return iter([]), None, None
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
430 # Default --rev value depends on --follow but --follow behaviour
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
431 # depends on revisions resolved from --rev...
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
432 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
433 if opts.get('rev'):
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
434 revs = scmutil.revrange(repo, opts['rev'])
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
435 else:
16408
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
436 if follow and len(repo) > 0:
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
437 revs = scmutil.revrange(repo, ['.:0'])
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
438 else:
d74099ac2ac1 graphlog: fix --follow --rev combinations
Patrick Mezard <patrick@mezard.eu>
parents: 16407
diff changeset
439 revs = range(len(repo) - 1, -1, -1)
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
440 if not revs:
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
441 return iter([]), None, None
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
442 expr, filematcher = _makelogrevset(repo, pats, opts, revs)
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
443 if expr:
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
444 matcher = revset.match(repo.ui, expr)
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
445 revs = increasingrevs(repo, revs, matcher)
16431
c85098cdd7df graphlog: implement --hidden
Patrick Mezard <patrick@mezard.eu>
parents: 16412
diff changeset
446 if not opts.get('hidden'):
c85098cdd7df graphlog: implement --hidden
Patrick Mezard <patrick@mezard.eu>
parents: 16412
diff changeset
447 # --hidden is still experimental and not worth a dedicated revset
c85098cdd7df graphlog: implement --hidden
Patrick Mezard <patrick@mezard.eu>
parents: 16412
diff changeset
448 # yet. Fortunately, filtering revision number is fast.
16777
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
449 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
450 else:
058e14da7044 graphlog: turn getlogrevs() into a generator
Patrick Mezard <patrick@mezard.eu>
parents: 16743
diff changeset
451 revs = iter(revs)
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
452 return revs, expr, filematcher
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
453
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
454 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
455 filematcher=None):
9631
1c34fca5d785 graphlog: hide internal state of ascii() from users
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9371
diff changeset
456 seen, state = [], asciistate()
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
457 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
458 char = 'o'
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
459 if ctx.node() in showparents:
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
460 char = '@'
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
461 elif ctx.obsolete():
2e13c1bd34dc graphlog: display obsolete changeset as "x"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 16777
diff changeset
462 char = 'x'
16180
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
463 copies = None
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
464 if getrenamed and ctx.rev():
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
465 copies = []
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
466 for fn in ctx.files():
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
467 rename = getrenamed(fn, ctx.rev())
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
468 if rename:
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
469 copies.append((fn, rename[0]))
16186
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
470 revmatchfn = None
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
471 if filematcher is not None:
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
472 revmatchfn = filematcher(ctx.rev())
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
473 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
474 lines = displayer.hunk.pop(rev).split('\n')[:-1]
12579
aa1faedeac5a graphlog: style with header and footer (issue2395)
Mads Kiilerich <mads@kiilerich.com>
parents: 11776
diff changeset
475 displayer.flush(rev)
14130
5e4ec4119485 graphlog: display nodes with more than 2 predecessors
Patrick Mezard <pmezard@gmail.com>
parents: 14086
diff changeset
476 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
477 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
478 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
479 displayer.close()
9369
20140c249e63 graphlog: move common code into function again, change function types
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9368
diff changeset
480
14311
9bbac962f4dd graphlog: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14139
diff changeset
481 @command('glog',
16432
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
482 [('f', 'follow', None,
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
483 _('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
484 ('', 'follow-first', None,
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
485 _('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
486 ('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
487 ('C', 'copies', None, _('show copied files')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
488 ('k', 'keyword', [],
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
489 _('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
490 ('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
491 ('', '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
492 ('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
493 ('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
494 ('', 'only-branch', [],
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
495 _('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
496 _('BRANCH')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
497 ('b', 'branch', [],
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
498 _('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
499 ('P', 'prune', [],
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
500 _('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
501 ('', 'hidden', False, _('show hidden changesets (DEPRECATED)')),
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
502 ] + commands.logopts + commands.walkopts,
365bb0fa73a4 graphlog: add all log options to glog command
Patrick Mezard <patrick@mezard.eu>
parents: 16431
diff changeset
503 _('[OPTION]... [FILE]'))
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
504 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
505 """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
506
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
507 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
508 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
509
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
510 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
511 directory.
7325
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
512 """
f9985108d4e4 graphlog: split the actual DAG grapher out into a separate method
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7324
diff changeset
513
16405
17deb6bbfbab graphlog: refactor revset() to return revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16316
diff changeset
514 revs, expr, filematcher = getlogrevs(repo, pats, opts)
16316
0f1e621d3d3b graphlog: handle old-style --rev values
Patrick Mezard <patrick@mezard.eu>
parents: 16314
diff changeset
515 revs = sorted(revs, reverse=1)
14133
28085b82f801 graphlog: always sort revisions topologically
Patrick Mezard <pmezard@gmail.com>
parents: 14132
diff changeset
516 limit = cmdutil.loglimit(opts)
28085b82f801 graphlog: always sort revisions topologically
Patrick Mezard <pmezard@gmail.com>
parents: 14132
diff changeset
517 if limit is not None:
28085b82f801 graphlog: always sort revisions topologically
Patrick Mezard <pmezard@gmail.com>
parents: 14132
diff changeset
518 revs = revs[:limit]
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
519 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
520
16180
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
521 getrenamed = None
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
522 if opts.get('copies'):
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
523 endrev = None
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
524 if opts.get('rev'):
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
525 endrev = max(scmutil.revrange(repo, opts.get('rev'))) + 1
46a96cc830c2 graphlog: implement --copies
Patrick Mezard <patrick@mezard.eu>
parents: 16174
diff changeset
526 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
527 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
528 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
529 generate(ui, revdag, displayer, showparents, asciiedges, getrenamed,
af3e67354beb graphlog: apply file filters --patch/--stat output
Patrick Mezard <patrick@mezard.eu>
parents: 16184
diff changeset
530 filematcher)
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
531
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
532 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
533 limit = cmdutil.loglimit(opts)
8837
d8e3a98018cb graphmod/graphlog: extract nodelistwalk
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8836
diff changeset
534 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
535 if limit is not None:
8837
d8e3a98018cb graphmod/graphlog: extract nodelistwalk
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8836
diff changeset
536 nodes = nodes[:limit]
d8e3a98018cb graphmod/graphlog: extract nodelistwalk
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8836
diff changeset
537 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
538
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
539 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
540 """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
541
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
542 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
543 ASCII characters.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
544
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
545 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
546 directory.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
547 """
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
548
14086
2d7cb340a53f graphlog: log -G --follow file does not work, forbid it
Patrick Mezard <pmezard@gmail.com>
parents: 14085
diff changeset
549 check_unsupported_flags([], opts)
12735
8888e56ac417 outgoing: unify common graphlog.outgoing and hg.outgoing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12730
diff changeset
550 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
551 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
552 return
7716
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
553
4ad12930a459 graphlog: extract large parts of repeated code from incoming/outgoing
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7715
diff changeset
554 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
555 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
556 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
557 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
558
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
559 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
560 """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
561
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
562 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
563 ASCII characters.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
564
9259
19a4b8fd5c48 graphlog: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9198
diff changeset
565 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
566 directory.
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
567 """
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12579
diff changeset
568 def subreporecurse():
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12579
diff changeset
569 return 1
7426
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
570
14086
2d7cb340a53f graphlog: log -G --follow file does not work, forbid it
Patrick Mezard <pmezard@gmail.com>
parents: 14085
diff changeset
571 check_unsupported_flags([], opts)
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12579
diff changeset
572 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
573 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
574 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
575 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
576
12730
33e1fd2aeb3c incoming: unify code for incoming and graphlog.incoming
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12579
diff changeset
577 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
578
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
579 def uisetup(ui):
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
580 '''Initialize the extension.'''
14416
253bda94372e graphlog: remove unused arg from _wrapcmd
Idan Kamara <idankk86@gmail.com>
parents: 14319
diff changeset
581 _wrapcmd('log', commands.table, graphlog)
253bda94372e graphlog: remove unused arg from _wrapcmd
Idan Kamara <idankk86@gmail.com>
parents: 14319
diff changeset
582 _wrapcmd('incoming', commands.table, gincoming)
253bda94372e graphlog: remove unused arg from _wrapcmd
Idan Kamara <idankk86@gmail.com>
parents: 14319
diff changeset
583 _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
584
14416
253bda94372e graphlog: remove unused arg from _wrapcmd
Idan Kamara <idankk86@gmail.com>
parents: 14319
diff changeset
585 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
586 '''wrap the command'''
df0962f6c54e Graphlog extension adds a --graph option to log/in/out
Alpar Juttner <alpar@cs.elte.hu>
parents: 7383
diff changeset
587 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
588 if kwargs['graph']:
14043
1c1e1232abdc graphlog: make use of graphmod's revset support
Alexander Solovyov <alexander@solovyov.net>
parents: 14042
diff changeset
589 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
590 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
591 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
592 entry[1].append(('G', 'graph', None, _("show the revision DAG")))