##// END OF EJS Templates
graphmod: use revsets internally...
Alexander Solovyov -
r14042:9966c95b default
parent child Browse files
Show More
@@ -1,342 +1,340 b''
1 # ASCII graph log extension for Mercurial
1 # ASCII graph log extension for Mercurial
2 #
2 #
3 # Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
3 # Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 '''command to view revision graphs from a shell
8 '''command to view revision graphs from a shell
9
9
10 This extension adds a --graph option to the incoming, outgoing and log
10 This extension adds a --graph option to the incoming, outgoing and log
11 commands. When this options is given, an ASCII representation of the
11 commands. When this options is given, an ASCII representation of the
12 revision graph is also shown.
12 revision graph is also shown.
13 '''
13 '''
14
14
15 import os
15 import os
16 from mercurial.cmdutil import revrange, show_changeset
16 from mercurial.cmdutil import revrange, show_changeset
17 from mercurial.commands import templateopts
17 from mercurial.commands import templateopts
18 from mercurial.i18n import _
18 from mercurial.i18n import _
19 from mercurial.node import nullrev
19 from mercurial.node import nullrev
20 from mercurial import cmdutil, commands, extensions
20 from mercurial import cmdutil, commands, extensions
21 from mercurial import hg, scmutil, util, graphmod
21 from mercurial import hg, scmutil, util, graphmod
22
22
23 ASCIIDATA = 'ASC'
23 ASCIIDATA = 'ASC'
24
24
25 def asciiedges(seen, rev, parents):
25 def asciiedges(seen, rev, parents):
26 """adds edge info to changelog DAG walk suitable for ascii()"""
26 """adds edge info to changelog DAG walk suitable for ascii()"""
27 if rev not in seen:
27 if rev not in seen:
28 seen.append(rev)
28 seen.append(rev)
29 nodeidx = seen.index(rev)
29 nodeidx = seen.index(rev)
30
30
31 knownparents = []
31 knownparents = []
32 newparents = []
32 newparents = []
33 for parent in parents:
33 for parent in parents:
34 if parent in seen:
34 if parent in seen:
35 knownparents.append(parent)
35 knownparents.append(parent)
36 else:
36 else:
37 newparents.append(parent)
37 newparents.append(parent)
38
38
39 ncols = len(seen)
39 ncols = len(seen)
40 seen[nodeidx:nodeidx + 1] = newparents
40 seen[nodeidx:nodeidx + 1] = newparents
41 edges = [(nodeidx, seen.index(p)) for p in knownparents]
41 edges = [(nodeidx, seen.index(p)) for p in knownparents]
42
42
43 if len(newparents) > 0:
43 if len(newparents) > 0:
44 edges.append((nodeidx, nodeidx))
44 edges.append((nodeidx, nodeidx))
45 if len(newparents) > 1:
45 if len(newparents) > 1:
46 edges.append((nodeidx, nodeidx + 1))
46 edges.append((nodeidx, nodeidx + 1))
47
47
48 nmorecols = len(seen) - ncols
48 nmorecols = len(seen) - ncols
49 return nodeidx, edges, ncols, nmorecols
49 return nodeidx, edges, ncols, nmorecols
50
50
51 def fix_long_right_edges(edges):
51 def fix_long_right_edges(edges):
52 for (i, (start, end)) in enumerate(edges):
52 for (i, (start, end)) in enumerate(edges):
53 if end > start:
53 if end > start:
54 edges[i] = (start, end + 1)
54 edges[i] = (start, end + 1)
55
55
56 def get_nodeline_edges_tail(
56 def get_nodeline_edges_tail(
57 node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
57 node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
58 if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
58 if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
59 # Still going in the same non-vertical direction.
59 # Still going in the same non-vertical direction.
60 if n_columns_diff == -1:
60 if n_columns_diff == -1:
61 start = max(node_index + 1, p_node_index)
61 start = max(node_index + 1, p_node_index)
62 tail = ["|", " "] * (start - node_index - 1)
62 tail = ["|", " "] * (start - node_index - 1)
63 tail.extend(["/", " "] * (n_columns - start))
63 tail.extend(["/", " "] * (n_columns - start))
64 return tail
64 return tail
65 else:
65 else:
66 return ["\\", " "] * (n_columns - node_index - 1)
66 return ["\\", " "] * (n_columns - node_index - 1)
67 else:
67 else:
68 return ["|", " "] * (n_columns - node_index - 1)
68 return ["|", " "] * (n_columns - node_index - 1)
69
69
70 def draw_edges(edges, nodeline, interline):
70 def draw_edges(edges, nodeline, interline):
71 for (start, end) in edges:
71 for (start, end) in edges:
72 if start == end + 1:
72 if start == end + 1:
73 interline[2 * end + 1] = "/"
73 interline[2 * end + 1] = "/"
74 elif start == end - 1:
74 elif start == end - 1:
75 interline[2 * start + 1] = "\\"
75 interline[2 * start + 1] = "\\"
76 elif start == end:
76 elif start == end:
77 interline[2 * start] = "|"
77 interline[2 * start] = "|"
78 else:
78 else:
79 nodeline[2 * end] = "+"
79 nodeline[2 * end] = "+"
80 if start > end:
80 if start > end:
81 (start, end) = (end, start)
81 (start, end) = (end, start)
82 for i in range(2 * start + 1, 2 * end):
82 for i in range(2 * start + 1, 2 * end):
83 if nodeline[i] != "+":
83 if nodeline[i] != "+":
84 nodeline[i] = "-"
84 nodeline[i] = "-"
85
85
86 def get_padding_line(ni, n_columns, edges):
86 def get_padding_line(ni, n_columns, edges):
87 line = []
87 line = []
88 line.extend(["|", " "] * ni)
88 line.extend(["|", " "] * ni)
89 if (ni, ni - 1) in edges or (ni, ni) in edges:
89 if (ni, ni - 1) in edges or (ni, ni) in edges:
90 # (ni, ni - 1) (ni, ni)
90 # (ni, ni - 1) (ni, ni)
91 # | | | | | | | |
91 # | | | | | | | |
92 # +---o | | o---+
92 # +---o | | o---+
93 # | | c | | c | |
93 # | | c | | c | |
94 # | |/ / | |/ /
94 # | |/ / | |/ /
95 # | | | | | |
95 # | | | | | |
96 c = "|"
96 c = "|"
97 else:
97 else:
98 c = " "
98 c = " "
99 line.extend([c, " "])
99 line.extend([c, " "])
100 line.extend(["|", " "] * (n_columns - ni - 1))
100 line.extend(["|", " "] * (n_columns - ni - 1))
101 return line
101 return line
102
102
103 def asciistate():
103 def asciistate():
104 """returns the initial value for the "state" argument to ascii()"""
104 """returns the initial value for the "state" argument to ascii()"""
105 return [0, 0]
105 return [0, 0]
106
106
107 def ascii(ui, state, type, char, text, coldata):
107 def ascii(ui, state, type, char, text, coldata):
108 """prints an ASCII graph of the DAG
108 """prints an ASCII graph of the DAG
109
109
110 takes the following arguments (one call per node in the graph):
110 takes the following arguments (one call per node in the graph):
111
111
112 - ui to write to
112 - ui to write to
113 - Somewhere to keep the needed state in (init to asciistate())
113 - Somewhere to keep the needed state in (init to asciistate())
114 - Column of the current node in the set of ongoing edges.
114 - Column of the current node in the set of ongoing edges.
115 - Type indicator of node data == ASCIIDATA.
115 - Type indicator of node data == ASCIIDATA.
116 - Payload: (char, lines):
116 - Payload: (char, lines):
117 - Character to use as node's symbol.
117 - Character to use as node's symbol.
118 - List of lines to display as the node's text.
118 - List of lines to display as the node's text.
119 - Edges; a list of (col, next_col) indicating the edges between
119 - Edges; a list of (col, next_col) indicating the edges between
120 the current node and its parents.
120 the current node and its parents.
121 - Number of columns (ongoing edges) in the current revision.
121 - Number of columns (ongoing edges) in the current revision.
122 - The difference between the number of columns (ongoing edges)
122 - The difference between the number of columns (ongoing edges)
123 in the next revision and the number of columns (ongoing edges)
123 in the next revision and the number of columns (ongoing edges)
124 in the current revision. That is: -1 means one column removed;
124 in the current revision. That is: -1 means one column removed;
125 0 means no columns added or removed; 1 means one column added.
125 0 means no columns added or removed; 1 means one column added.
126 """
126 """
127
127
128 idx, edges, ncols, coldiff = coldata
128 idx, edges, ncols, coldiff = coldata
129 assert -2 < coldiff < 2
129 assert -2 < coldiff < 2
130 if coldiff == -1:
130 if coldiff == -1:
131 # Transform
131 # Transform
132 #
132 #
133 # | | | | | |
133 # | | | | | |
134 # o | | into o---+
134 # o | | into o---+
135 # |X / |/ /
135 # |X / |/ /
136 # | | | |
136 # | | | |
137 fix_long_right_edges(edges)
137 fix_long_right_edges(edges)
138
138
139 # add_padding_line says whether to rewrite
139 # add_padding_line says whether to rewrite
140 #
140 #
141 # | | | | | | | |
141 # | | | | | | | |
142 # | o---+ into | o---+
142 # | o---+ into | o---+
143 # | / / | | | # <--- padding line
143 # | / / | | | # <--- padding line
144 # o | | | / /
144 # o | | | / /
145 # o | |
145 # o | |
146 add_padding_line = (len(text) > 2 and coldiff == -1 and
146 add_padding_line = (len(text) > 2 and coldiff == -1 and
147 [x for (x, y) in edges if x + 1 < y])
147 [x for (x, y) in edges if x + 1 < y])
148
148
149 # fix_nodeline_tail says whether to rewrite
149 # fix_nodeline_tail says whether to rewrite
150 #
150 #
151 # | | o | | | | o | |
151 # | | o | | | | o | |
152 # | | |/ / | | |/ /
152 # | | |/ / | | |/ /
153 # | o | | into | o / / # <--- fixed nodeline tail
153 # | o | | into | o / / # <--- fixed nodeline tail
154 # | |/ / | |/ /
154 # | |/ / | |/ /
155 # o | | o | |
155 # o | | o | |
156 fix_nodeline_tail = len(text) <= 2 and not add_padding_line
156 fix_nodeline_tail = len(text) <= 2 and not add_padding_line
157
157
158 # nodeline is the line containing the node character (typically o)
158 # nodeline is the line containing the node character (typically o)
159 nodeline = ["|", " "] * idx
159 nodeline = ["|", " "] * idx
160 nodeline.extend([char, " "])
160 nodeline.extend([char, " "])
161
161
162 nodeline.extend(
162 nodeline.extend(
163 get_nodeline_edges_tail(idx, state[1], ncols, coldiff,
163 get_nodeline_edges_tail(idx, state[1], ncols, coldiff,
164 state[0], fix_nodeline_tail))
164 state[0], fix_nodeline_tail))
165
165
166 # shift_interline is the line containing the non-vertical
166 # shift_interline is the line containing the non-vertical
167 # edges between this entry and the next
167 # edges between this entry and the next
168 shift_interline = ["|", " "] * idx
168 shift_interline = ["|", " "] * idx
169 if coldiff == -1:
169 if coldiff == -1:
170 n_spaces = 1
170 n_spaces = 1
171 edge_ch = "/"
171 edge_ch = "/"
172 elif coldiff == 0:
172 elif coldiff == 0:
173 n_spaces = 2
173 n_spaces = 2
174 edge_ch = "|"
174 edge_ch = "|"
175 else:
175 else:
176 n_spaces = 3
176 n_spaces = 3
177 edge_ch = "\\"
177 edge_ch = "\\"
178 shift_interline.extend(n_spaces * [" "])
178 shift_interline.extend(n_spaces * [" "])
179 shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
179 shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
180
180
181 # draw edges from the current node to its parents
181 # draw edges from the current node to its parents
182 draw_edges(edges, nodeline, shift_interline)
182 draw_edges(edges, nodeline, shift_interline)
183
183
184 # lines is the list of all graph lines to print
184 # lines is the list of all graph lines to print
185 lines = [nodeline]
185 lines = [nodeline]
186 if add_padding_line:
186 if add_padding_line:
187 lines.append(get_padding_line(idx, ncols, edges))
187 lines.append(get_padding_line(idx, ncols, edges))
188 lines.append(shift_interline)
188 lines.append(shift_interline)
189
189
190 # make sure that there are as many graph lines as there are
190 # make sure that there are as many graph lines as there are
191 # log strings
191 # log strings
192 while len(text) < len(lines):
192 while len(text) < len(lines):
193 text.append("")
193 text.append("")
194 if len(lines) < len(text):
194 if len(lines) < len(text):
195 extra_interline = ["|", " "] * (ncols + coldiff)
195 extra_interline = ["|", " "] * (ncols + coldiff)
196 while len(lines) < len(text):
196 while len(lines) < len(text):
197 lines.append(extra_interline)
197 lines.append(extra_interline)
198
198
199 # print lines
199 # print lines
200 indentation_level = max(ncols, ncols + coldiff)
200 indentation_level = max(ncols, ncols + coldiff)
201 for (line, logstr) in zip(lines, text):
201 for (line, logstr) in zip(lines, text):
202 ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr)
202 ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr)
203 ui.write(ln.rstrip() + '\n')
203 ui.write(ln.rstrip() + '\n')
204
204
205 # ... and start over
205 # ... and start over
206 state[0] = coldiff
206 state[0] = coldiff
207 state[1] = idx
207 state[1] = idx
208
208
209 def get_revs(repo, rev_opt):
209 def get_revs(repo, rev_opt):
210 if rev_opt:
210 if rev_opt:
211 revs = revrange(repo, rev_opt)
211 revs = revrange(repo, rev_opt)
212 if len(revs) == 0:
212 if len(revs) == 0:
213 return (nullrev, nullrev)
213 return (nullrev, nullrev)
214 return (max(revs), min(revs))
214 return (max(revs), min(revs))
215 else:
215 else:
216 return (len(repo) - 1, 0)
216 return (len(repo) - 1, 0)
217
217
218 def check_unsupported_flags(opts):
218 def check_unsupported_flags(opts):
219 for op in ["follow", "follow_first", "date", "copies", "keyword", "remove",
219 for op in ["follow", "follow_first", "date", "copies", "keyword", "remove",
220 "only_merges", "user", "branch", "only_branch", "prune",
220 "only_merges", "user", "branch", "only_branch", "prune",
221 "newest_first", "no_merges", "include", "exclude"]:
221 "newest_first", "no_merges", "include", "exclude"]:
222 if op in opts and opts[op]:
222 if op in opts and opts[op]:
223 raise util.Abort(_("--graph option is incompatible with --%s")
223 raise util.Abort(_("--graph option is incompatible with --%s")
224 % op.replace("_", "-"))
224 % op.replace("_", "-"))
225
225
226 def generate(ui, dag, displayer, showparents, edgefn):
226 def generate(ui, dag, displayer, showparents, edgefn):
227 seen, state = [], asciistate()
227 seen, state = [], asciistate()
228 for rev, type, ctx, parents in dag:
228 for rev, type, ctx, parents in dag:
229 char = ctx.node() in showparents and '@' or 'o'
229 char = ctx.node() in showparents and '@' or 'o'
230 displayer.show(ctx)
230 displayer.show(ctx)
231 lines = displayer.hunk.pop(rev).split('\n')[:-1]
231 lines = displayer.hunk.pop(rev).split('\n')[:-1]
232 displayer.flush(rev)
232 displayer.flush(rev)
233 ascii(ui, state, type, char, lines, edgefn(seen, rev, parents))
233 ascii(ui, state, type, char, lines, edgefn(seen, rev, parents))
234 displayer.close()
234 displayer.close()
235
235
236 def graphlog(ui, repo, path=None, **opts):
236 def graphlog(ui, repo, path=None, **opts):
237 """show revision history alongside an ASCII revision graph
237 """show revision history alongside an ASCII revision graph
238
238
239 Print a revision history alongside a revision graph drawn with
239 Print a revision history alongside a revision graph drawn with
240 ASCII characters.
240 ASCII characters.
241
241
242 Nodes printed as an @ character are parents of the working
242 Nodes printed as an @ character are parents of the working
243 directory.
243 directory.
244 """
244 """
245
245
246 check_unsupported_flags(opts)
246 check_unsupported_flags(opts)
247 limit = cmdutil.loglimit(opts)
247 limit = cmdutil.loglimit(opts)
248 start, stop = get_revs(repo, opts["rev"])
248 start, stop = get_revs(repo, opts["rev"])
249 if start == nullrev:
249 if start == nullrev:
250 return
250 return
251
251
252 if path:
253 path = scmutil.canonpath(repo.root, os.getcwd(), path)
254 if path: # could be reset in canonpath
252 if path: # could be reset in canonpath
255 revdag = graphmod.filerevs(repo, path, start, stop, limit)
253 revdag = graphmod.filerevs(repo, path, start, stop, limit)
256 else:
254 else:
257 if limit is not None:
255 if limit is not None:
258 stop = max(stop, start - limit + 1)
256 stop = max(stop, start - limit + 1)
259 revdag = graphmod.revisions(repo, start, stop)
257 revdag = graphmod.revisions(repo, start, stop)
260
258
261 displayer = show_changeset(ui, repo, opts, buffered=True)
259 displayer = show_changeset(ui, repo, opts, buffered=True)
262 showparents = [ctx.node() for ctx in repo[None].parents()]
260 showparents = [ctx.node() for ctx in repo[None].parents()]
263 generate(ui, revdag, displayer, showparents, asciiedges)
261 generate(ui, revdag, displayer, showparents, asciiedges)
264
262
265 def graphrevs(repo, nodes, opts):
263 def graphrevs(repo, nodes, opts):
266 limit = cmdutil.loglimit(opts)
264 limit = cmdutil.loglimit(opts)
267 nodes.reverse()
265 nodes.reverse()
268 if limit is not None:
266 if limit is not None:
269 nodes = nodes[:limit]
267 nodes = nodes[:limit]
270 return graphmod.nodes(repo, nodes)
268 return graphmod.nodes(repo, nodes)
271
269
272 def goutgoing(ui, repo, dest=None, **opts):
270 def goutgoing(ui, repo, dest=None, **opts):
273 """show the outgoing changesets alongside an ASCII revision graph
271 """show the outgoing changesets alongside an ASCII revision graph
274
272
275 Print the outgoing changesets alongside a revision graph drawn with
273 Print the outgoing changesets alongside a revision graph drawn with
276 ASCII characters.
274 ASCII characters.
277
275
278 Nodes printed as an @ character are parents of the working
276 Nodes printed as an @ character are parents of the working
279 directory.
277 directory.
280 """
278 """
281
279
282 check_unsupported_flags(opts)
280 check_unsupported_flags(opts)
283 o = hg._outgoing(ui, repo, dest, opts)
281 o = hg._outgoing(ui, repo, dest, opts)
284 if o is None:
282 if o is None:
285 return
283 return
286
284
287 revdag = graphrevs(repo, o, opts)
285 revdag = graphrevs(repo, o, opts)
288 displayer = show_changeset(ui, repo, opts, buffered=True)
286 displayer = show_changeset(ui, repo, opts, buffered=True)
289 showparents = [ctx.node() for ctx in repo[None].parents()]
287 showparents = [ctx.node() for ctx in repo[None].parents()]
290 generate(ui, revdag, displayer, showparents, asciiedges)
288 generate(ui, revdag, displayer, showparents, asciiedges)
291
289
292 def gincoming(ui, repo, source="default", **opts):
290 def gincoming(ui, repo, source="default", **opts):
293 """show the incoming changesets alongside an ASCII revision graph
291 """show the incoming changesets alongside an ASCII revision graph
294
292
295 Print the incoming changesets alongside a revision graph drawn with
293 Print the incoming changesets alongside a revision graph drawn with
296 ASCII characters.
294 ASCII characters.
297
295
298 Nodes printed as an @ character are parents of the working
296 Nodes printed as an @ character are parents of the working
299 directory.
297 directory.
300 """
298 """
301 def subreporecurse():
299 def subreporecurse():
302 return 1
300 return 1
303
301
304 check_unsupported_flags(opts)
302 check_unsupported_flags(opts)
305 def display(other, chlist, displayer):
303 def display(other, chlist, displayer):
306 revdag = graphrevs(other, chlist, opts)
304 revdag = graphrevs(other, chlist, opts)
307 showparents = [ctx.node() for ctx in repo[None].parents()]
305 showparents = [ctx.node() for ctx in repo[None].parents()]
308 generate(ui, revdag, displayer, showparents, asciiedges)
306 generate(ui, revdag, displayer, showparents, asciiedges)
309
307
310 hg._incoming(display, subreporecurse, ui, repo, source, opts, buffered=True)
308 hg._incoming(display, subreporecurse, ui, repo, source, opts, buffered=True)
311
309
312 def uisetup(ui):
310 def uisetup(ui):
313 '''Initialize the extension.'''
311 '''Initialize the extension.'''
314 _wrapcmd(ui, 'log', commands.table, graphlog)
312 _wrapcmd(ui, 'log', commands.table, graphlog)
315 _wrapcmd(ui, 'incoming', commands.table, gincoming)
313 _wrapcmd(ui, 'incoming', commands.table, gincoming)
316 _wrapcmd(ui, 'outgoing', commands.table, goutgoing)
314 _wrapcmd(ui, 'outgoing', commands.table, goutgoing)
317
315
318 def _wrapcmd(ui, cmd, table, wrapfn):
316 def _wrapcmd(ui, cmd, table, wrapfn):
319 '''wrap the command'''
317 '''wrap the command'''
320 def graph(orig, *args, **kwargs):
318 def graph(orig, *args, **kwargs):
321 if kwargs['graph']:
319 if kwargs['graph']:
322 try:
320 try:
323 return wrapfn(*args, **kwargs)
321 return wrapfn(*args, **kwargs)
324 except TypeError, e:
322 except TypeError, e:
325 if len(args) > wrapfn.func_code.co_argcount:
323 if len(args) > wrapfn.func_code.co_argcount:
326 raise util.Abort(_('--graph option allows at most one file'))
324 raise util.Abort(_('--graph option allows at most one file'))
327 raise
325 raise
328 return orig(*args, **kwargs)
326 return orig(*args, **kwargs)
329 entry = extensions.wrapcommand(table, cmd, graph)
327 entry = extensions.wrapcommand(table, cmd, graph)
330 entry[1].append(('G', 'graph', None, _("show the revision DAG")))
328 entry[1].append(('G', 'graph', None, _("show the revision DAG")))
331
329
332 cmdtable = {
330 cmdtable = {
333 "glog":
331 "glog":
334 (graphlog,
332 (graphlog,
335 [('l', 'limit', '',
333 [('l', 'limit', '',
336 _('limit number of changes displayed'), _('NUM')),
334 _('limit number of changes displayed'), _('NUM')),
337 ('p', 'patch', False, _('show patch')),
335 ('p', 'patch', False, _('show patch')),
338 ('r', 'rev', [],
336 ('r', 'rev', [],
339 _('show the specified revision or range'), _('REV')),
337 _('show the specified revision or range'), _('REV')),
340 ] + templateopts,
338 ] + templateopts,
341 _('hg glog [OPTION]... [FILE]')),
339 _('hg glog [OPTION]... [FILE]')),
342 }
340 }
@@ -1,122 +1,220 b''
1 # Revision graph generator for Mercurial
1 # Revision graph generator for Mercurial
2 #
2 #
3 # Copyright 2008 Dirkjan Ochtman <dirkjan@ochtman.nl>
3 # Copyright 2008 Dirkjan Ochtman <dirkjan@ochtman.nl>
4 # Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
4 # Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8
8
9 """supports walking the history as DAGs suitable for graphical output
9 """supports walking the history as DAGs suitable for graphical output
10
10
11 The most basic format we use is that of::
11 The most basic format we use is that of::
12
12
13 (id, type, data, [parentids])
13 (id, type, data, [parentids])
14
14
15 The node and parent ids are arbitrary integers which identify a node in the
15 The node and parent ids are arbitrary integers which identify a node in the
16 context of the graph returned. Type is a constant specifying the node type.
16 context of the graph returned. Type is a constant specifying the node type.
17 Data depends on type.
17 Data depends on type.
18 """
18 """
19
19
20 from mercurial.node import nullrev
20 from mercurial.node import nullrev
21 from mercurial.cmdutil import revrange
21
22
22 CHANGESET = 'C'
23 CHANGESET = 'C'
23
24
24 def revisions(repo, start, stop):
25 def revisions(repo, start, end):
25 """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
26 """DAG generator for revisions between start and end
26
27 This generator function walks through the revision history from revision
28 start to revision stop (which must be less than or equal to start). It
29 returns a tuple for each node. The node and parent ids are arbitrary
30 integers which identify a node in the context of the graph returned.
31 """
27 """
32 cur = start
28 revset = '%s:%s' % (start, end)
33 while cur >= stop:
29 return dagwalker(repo, revrange(repo, [revset]))
34 ctx = repo[cur]
35 parents = set([p.rev() for p in ctx.parents() if p.rev() != nullrev])
36 yield (cur, CHANGESET, ctx, sorted(parents))
37 cur -= 1
38
30
39 def filerevs(repo, path, start, stop, limit=None):
31 def filerevs(repo, path, start, stop, limit=None):
40 """file cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
32 """DAG generator, which is limited by file passed
33 """
34 revset = '%s:%s and file("%s")' % (start, stop, path)
35 if limit:
36 revset = 'limit(%s, %s)' % (revset, limit)
37 return dagwalker(repo, revrange(repo, [revset]))
41
38
42 This generator function walks through the revision history of a single
39 def dagwalker(repo, revs):
43 file from revision start down to revision stop.
40 """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
41
42 This generator function walks through revisions (which should be ordered
43 from bigger to lower). It returns a tuple for each node. The node and parent
44 ids are arbitrary integers which identify a node in the context of the graph
45 returned.
44 """
46 """
45 filerev = len(repo.file(path)) - 1
47 if not revs:
46 rev = stop + 1
48 return []
47 count = 0
49
48 while filerev >= 0 and rev > stop:
50 ns = [repo[r].node() for r in revs]
49 fctx = repo.filectx(path, fileid=filerev)
51 revdag = list(nodes(repo, ns))
50 parents = set([f.linkrev() for f in fctx.parents() if f.path() == path])
52
51 rev = fctx.rev()
53 cl = repo.changelog
52 if rev <= start:
54 lowestrev = min(revs)
53 yield (rev, CHANGESET, fctx.changectx(), sorted(parents))
55 gpcache = {}
54 count += 1
56 leafs = {}
55 if count == limit:
57
56 break
58 for i, (id, c, ctx, parents) in enumerate(revdag):
57 filerev -= 1
59 mpars = [p.rev() for p in ctx.parents() if
60 p.rev() != nullrev and p.rev() not in parents]
61 grandparents = []
62
63 for mpar in mpars:
64 gp = gpcache.get(mpar) or grandparent(cl, lowestrev, revs, mpar)
65 gpcache[mpar] = gp
66 if gp is None:
67 leafs.setdefault(mpar, []).append((i, ctx))
68 else:
69 grandparents.append(gp)
70
71 if grandparents:
72 for gp in grandparents:
73 if gp not in revdag[i][3]:
74 revdag[i][3].append(gp)
75
76 for parent, leafs in leafs.iteritems():
77 for i, ctx in leafs:
78 revdag[i][3].append(parent)
79
80 return revdag
58
81
59 def nodes(repo, nodes):
82 def nodes(repo, nodes):
60 """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
83 """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
61
84
62 This generator function walks the given nodes. It only returns parents
85 This generator function walks the given nodes. It only returns parents
63 that are in nodes, too.
86 that are in nodes, too.
64 """
87 """
65 include = set(nodes)
88 include = set(nodes)
66 for node in nodes:
89 for node in nodes:
67 ctx = repo[node]
90 ctx = repo[node]
68 parents = set([p.rev() for p in ctx.parents() if p.node() in include])
91 parents = set([p.rev() for p in ctx.parents() if p.node() in include])
69 yield (ctx.rev(), CHANGESET, ctx, sorted(parents))
92 yield (ctx.rev(), CHANGESET, ctx, sorted(parents))
70
93
71 def colored(dag):
94 def colored(dag):
72 """annotates a DAG with colored edge information
95 """annotates a DAG with colored edge information
73
96
74 For each DAG node this function emits tuples::
97 For each DAG node this function emits tuples::
75
98
76 (id, type, data, (col, color), [(col, nextcol, color)])
99 (id, type, data, (col, color), [(col, nextcol, color)])
77
100
78 with the following new elements:
101 with the following new elements:
79
102
80 - Tuple (col, color) with column and color index for the current node
103 - Tuple (col, color) with column and color index for the current node
81 - A list of tuples indicating the edges between the current node and its
104 - A list of tuples indicating the edges between the current node and its
82 parents.
105 parents.
83 """
106 """
84 seen = []
107 seen = []
85 colors = {}
108 colors = {}
86 newcolor = 1
109 newcolor = 1
87 for (cur, type, data, parents) in dag:
110 for (cur, type, data, parents) in dag:
88
111
89 # Compute seen and next
112 # Compute seen and next
90 if cur not in seen:
113 if cur not in seen:
91 seen.append(cur) # new head
114 seen.append(cur) # new head
92 colors[cur] = newcolor
115 colors[cur] = newcolor
93 newcolor += 1
116 newcolor += 1
94
117
95 col = seen.index(cur)
118 col = seen.index(cur)
96 color = colors.pop(cur)
119 color = colors.pop(cur)
97 next = seen[:]
120 next = seen[:]
98
121
99 # Add parents to next
122 # Add parents to next
100 addparents = [p for p in parents if p not in next]
123 addparents = [p for p in parents if p not in next]
101 next[col:col + 1] = addparents
124 next[col:col + 1] = addparents
102
125
103 # Set colors for the parents
126 # Set colors for the parents
104 for i, p in enumerate(addparents):
127 for i, p in enumerate(addparents):
105 if not i:
128 if not i:
106 colors[p] = color
129 colors[p] = color
107 else:
130 else:
108 colors[p] = newcolor
131 colors[p] = newcolor
109 newcolor += 1
132 newcolor += 1
110
133
111 # Add edges to the graph
134 # Add edges to the graph
112 edges = []
135 edges = []
113 for ecol, eid in enumerate(seen):
136 for ecol, eid in enumerate(seen):
114 if eid in next:
137 if eid in next:
115 edges.append((ecol, next.index(eid), colors[eid]))
138 edges.append((ecol, next.index(eid), colors[eid]))
116 elif eid == cur:
139 elif eid == cur:
117 for p in parents:
140 for p in parents:
118 edges.append((ecol, next.index(p), color))
141 edges.append((ecol, next.index(p), color))
119
142
120 # Yield and move on
143 # Yield and move on
121 yield (cur, type, data, (col, color), edges)
144 yield (cur, type, data, (col, color), edges)
122 seen = next
145 seen = next
146
147
148 def grandparent(cl, lowestrev, roots, head):
149 """Return closest 'root' rev in topological path from 'roots' to 'head'.
150
151 Derived from revlog.revlog.nodesbetween, but only returns next rev
152 of topologically sorted list of all nodes N that satisfy of these
153 constraints:
154
155 1. N is a descendant of some node in 'roots'
156 2. N is an ancestor of 'head'
157 3. N is some node in 'roots' or nullrev
158
159 Every node is considered to be both a descendant and an ancestor
160 of itself, so every reachable node in 'roots' and 'head' will be
161 included in 'nodes'.
162 """
163 ancestors = set()
164 # Start at the top and keep marking parents until we're done.
165 revstotag = set([head])
166 revstotag.discard(nullrev)
167 llowestrev = max(nullrev, lowestrev)
168
169 while revstotag:
170 r = revstotag.pop()
171 # A node's revision number represents its place in a
172 # topologically sorted list of nodes.
173 if r >= llowestrev:
174 if r not in ancestors:
175 # If we are possibly a descendent of one of the roots
176 # and we haven't already been marked as an ancestor
177 ancestors.add(r) # Mark as ancestor
178 # Add non-nullrev parents to list of nodes to tag.
179 revstotag.update([p for p in cl.parentrevs(r)])
180
181 if not ancestors:
182 return
183 # Now that we have our set of ancestors, we want to remove any
184 # roots that are not ancestors.
185
186 # If one of the roots was nullrev, everything is included anyway.
187 if lowestrev > nullrev:
188 # But, since we weren't, let's recompute the lowest rev to not
189 # include roots that aren't ancestors.
190
191 # Filter out roots that aren't ancestors of heads
192 _roots = ancestors.intersection(roots)
193 if not _roots:
194 return
195 # Recompute the lowest revision
196 lowestrev = min(roots)
197 else:
198 # We are descending from nullrev, and don't need to care about
199 # any other roots.
200 lowestrev = nullrev
201 _roots = [nullrev]
202
203 # The roots are just the descendants.
204 # Don't start at nullrev since we don't want nullrev in our output list,
205 # and if nullrev shows up in descedents, empty parents will look like
206 # they're descendents.
207 lowestrevisnullrev = (lowestrev == nullrev)
208 for r in xrange(head - 1, max(lowestrev, -1) - 1, -1):
209 if lowestrevisnullrev or r in _roots:
210 pass
211 elif _roots.issuperset(cl.parentrevs(r)):
212 # A node is a descendent if either of its parents are
213 # descendents. (We seeded the dependents list with the roots
214 # up there, remember?)
215 _roots.add(r)
216 else:
217 continue
218 if r in ancestors:
219 # Only include nodes that are both descendents and ancestors.
220 return r
@@ -1,321 +1,321 b''
1 $ echo "[extensions]" >> $HGRCPATH
1 $ echo "[extensions]" >> $HGRCPATH
2 $ echo "graphlog=" >> $HGRCPATH
2 $ echo "graphlog=" >> $HGRCPATH
3
3
4 overwritten and appended files
4 overwritten and appended files
5
5
6 $ rm -rf repo
6 $ rm -rf repo
7 $ hg init repo
7 $ hg init repo
8 $ cd repo
8 $ cd repo
9 $ hg debugbuilddag '+2:f +3:p2 @temp <f+4 @default /p2 +2' -q -oa
9 $ hg debugbuilddag '+2:f +3:p2 @temp <f+4 @default /p2 +2' -q -oa
10 dag
10 dag
11 $ hg debugdag -t -b
11 $ hg debugdag -t -b
12 +2:f
12 +2:f
13 +3:p2
13 +3:p2
14 @temp*f+3
14 @temp*f+3
15 @default*/p2+2:tip
15 @default*/p2+2:tip
16 tip
16 tip
17 $ hg id
17 $ hg id
18 f96e381c614c tip
18 f96e381c614c tip
19 glog
19 glog
20 $ hg glog --template '{rev}: {desc} [{branches}] @ {date}\n'
20 $ hg glog --template '{rev}: {desc} [{branches}] @ {date}\n'
21 @ 11: r11 [] @ 11.00
21 @ 11: r11 [] @ 11.00
22 |
22 |
23 o 10: r10 [] @ 10.00
23 o 10: r10 [] @ 10.00
24 |
24 |
25 o 9: r9 [] @ 9.00
25 o 9: r9 [] @ 9.00
26 |\
26 |\
27 | o 8: r8 [temp] @ 8.00
27 | o 8: r8 [temp] @ 8.00
28 | |
28 | |
29 | o 7: r7 [temp] @ 7.00
29 | o 7: r7 [temp] @ 7.00
30 | |
30 | |
31 | o 6: r6 [temp] @ 6.00
31 | o 6: r6 [temp] @ 6.00
32 | |
32 | |
33 | o 5: r5 [temp] @ 5.00
33 | o 5: r5 [temp] @ 5.00
34 | |
34 | |
35 o | 4: r4 [] @ 4.00
35 o | 4: r4 [] @ 4.00
36 | |
36 | |
37 o | 3: r3 [] @ 3.00
37 o | 3: r3 [] @ 3.00
38 | |
38 | |
39 o | 2: r2 [] @ 2.00
39 o | 2: r2 [] @ 2.00
40 |/
40 |/
41 o 1: r1 [] @ 1.00
41 o 1: r1 [] @ 1.00
42 |
42 |
43 o 0: r0 [] @ 0.00
43 o 0: r0 [] @ 0.00
44
44
45 glog of
45 glog of
46 $ hg glog --template '{rev}: {desc} [{branches}]\n' of
46 $ hg glog --template '{rev}: {desc} [{branches}]\n' of
47 @ 11: r11 []
47 @ 11: r11 []
48 |
48 |
49 o 10: r10 []
49 o 10: r10 []
50 |
50 |
51 o 9: r9 []
51 o 9: r9 []
52 |\
52 |\
53 | o 8: r8 [temp]
53 | o 8: r8 [temp]
54 | |
54 | |
55 | o 7: r7 [temp]
55 | o 7: r7 [temp]
56 | |
56 | |
57 | o 6: r6 [temp]
57 | o 6: r6 [temp]
58 | |
58 | |
59 | o 5: r5 [temp]
59 | o 5: r5 [temp]
60 | |
60 | |
61 o | 4: r4 []
61 o | 4: r4 []
62 | |
62 | |
63 o | 3: r3 []
63 o | 3: r3 []
64 | |
64 | |
65 o | 2: r2 []
65 o | 2: r2 []
66 |/
66 |/
67 o 1: r1 []
67 o 1: r1 []
68 |
68 |
69 o 0: r0 []
69 o 0: r0 []
70
70
71 glog af
71 glog af
72 $ hg glog --template '{rev}: {desc} [{branches}]\n' af
72 $ hg glog --template '{rev}: {desc} [{branches}]\n' af
73 @ 11: r11 []
73 @ 11: r11 []
74 |
74 |
75 o 10: r10 []
75 o 10: r10 []
76 |
76 |
77 o 9: r9 []
77 o 9: r9 []
78 |\
78 |\
79 | o 8: r8 [temp]
79 | o 8: r8 [temp]
80 | |
80 | |
81 | o 7: r7 [temp]
81 | o 7: r7 [temp]
82 | |
82 | |
83 | o 6: r6 [temp]
83 | o 6: r6 [temp]
84 | |
84 | |
85 | o 5: r5 [temp]
85 | o 5: r5 [temp]
86 | |
86 | |
87 o | 4: r4 []
87 o | 4: r4 []
88 | |
88 | |
89 o | 3: r3 []
89 o | 3: r3 []
90 | |
90 | |
91 o | 2: r2 []
91 o | 2: r2 []
92 |/
92 |/
93 o 1: r1 []
93 o 1: r1 []
94 |
94 |
95 o 0: r0 []
95 o 0: r0 []
96
96
97 tags
97 tags
98 $ hg tags -v
98 $ hg tags -v
99 tip 11:f96e381c614c
99 tip 11:f96e381c614c
100 p2 4:d9d6db981b55 local
100 p2 4:d9d6db981b55 local
101 f 1:73253def624e local
101 f 1:73253def624e local
102 cat of
102 cat of
103 $ hg cat of
103 $ hg cat of
104 r11
104 r11
105 cat af
105 cat af
106 $ hg cat af
106 $ hg cat af
107 r0
107 r0
108 r1
108 r1
109 r5
109 r5
110 r6
110 r6
111 r7
111 r7
112 r8
112 r8
113 r9
113 r9
114 r10
114 r10
115 r11
115 r11
116 $ cd ..
116 $ cd ..
117
117
118 new and mergeable files
118 new and mergeable files
119
119
120 $ rm -rf repo
120 $ rm -rf repo
121 $ hg init repo
121 $ hg init repo
122 $ cd repo
122 $ cd repo
123 $ hg debugbuilddag '+2:f +3:p2 @temp <f+4 @default /p2 +2' -q -mn
123 $ hg debugbuilddag '+2:f +3:p2 @temp <f+4 @default /p2 +2' -q -mn
124 dag
124 dag
125 $ hg debugdag -t -b
125 $ hg debugdag -t -b
126 +2:f
126 +2:f
127 +3:p2
127 +3:p2
128 @temp*f+3
128 @temp*f+3
129 @default*/p2+2:tip
129 @default*/p2+2:tip
130 tip
130 tip
131 $ hg id
131 $ hg id
132 9c5ce9b70771 tip
132 9c5ce9b70771 tip
133 glog
133 glog
134 $ hg glog --template '{rev}: {desc} [{branches}] @ {date}\n'
134 $ hg glog --template '{rev}: {desc} [{branches}] @ {date}\n'
135 @ 11: r11 [] @ 11.00
135 @ 11: r11 [] @ 11.00
136 |
136 |
137 o 10: r10 [] @ 10.00
137 o 10: r10 [] @ 10.00
138 |
138 |
139 o 9: r9 [] @ 9.00
139 o 9: r9 [] @ 9.00
140 |\
140 |\
141 | o 8: r8 [temp] @ 8.00
141 | o 8: r8 [temp] @ 8.00
142 | |
142 | |
143 | o 7: r7 [temp] @ 7.00
143 | o 7: r7 [temp] @ 7.00
144 | |
144 | |
145 | o 6: r6 [temp] @ 6.00
145 | o 6: r6 [temp] @ 6.00
146 | |
146 | |
147 | o 5: r5 [temp] @ 5.00
147 | o 5: r5 [temp] @ 5.00
148 | |
148 | |
149 o | 4: r4 [] @ 4.00
149 o | 4: r4 [] @ 4.00
150 | |
150 | |
151 o | 3: r3 [] @ 3.00
151 o | 3: r3 [] @ 3.00
152 | |
152 | |
153 o | 2: r2 [] @ 2.00
153 o | 2: r2 [] @ 2.00
154 |/
154 |/
155 o 1: r1 [] @ 1.00
155 o 1: r1 [] @ 1.00
156 |
156 |
157 o 0: r0 [] @ 0.00
157 o 0: r0 [] @ 0.00
158
158
159 glog mf
159 glog mf
160 $ hg glog --template '{rev}: {desc} [{branches}]\n' mf
160 $ hg glog --template '{rev}: {desc} [{branches}]\n' mf
161 @ 11: r11 []
161 @ 11: r11 []
162 |
162 |
163 o 10: r10 []
163 o 10: r10 []
164 |
164 |
165 o 9: r9 []
165 o 9: r9 []
166 |\
166 |\
167 | o 8: r8 [temp]
167 | o 8: r8 [temp]
168 | |
168 | |
169 | o 7: r7 [temp]
169 | o 7: r7 [temp]
170 | |
170 | |
171 | o 6: r6 [temp]
171 | o 6: r6 [temp]
172 | |
172 | |
173 | o 5: r5 [temp]
173 | o 5: r5 [temp]
174 | |
174 | |
175 o | 4: r4 []
175 o | 4: r4 []
176 | |
176 | |
177 o | 3: r3 []
177 o | 3: r3 []
178 | |
178 | |
179 o | 2: r2 []
179 o | 2: r2 []
180 |/
180 |/
181 o 1: r1 []
181 o 1: r1 []
182 |
182 |
183 o 0: r0 []
183 o 0: r0 []
184
184
185
185
186 man r4
186 man r4
187 $ hg manifest -r4
187 $ hg manifest -r4
188 mf
188 mf
189 nf0
189 nf0
190 nf1
190 nf1
191 nf2
191 nf2
192 nf3
192 nf3
193 nf4
193 nf4
194 cat r4 mf
194 cat r4 mf
195 $ hg cat -r4 mf
195 $ hg cat -r4 mf
196 0 r0
196 0 r0
197 1
197 1
198 2 r1
198 2 r1
199 3
199 3
200 4 r2
200 4 r2
201 5
201 5
202 6 r3
202 6 r3
203 7
203 7
204 8 r4
204 8 r4
205 9
205 9
206 10
206 10
207 11
207 11
208 12
208 12
209 13
209 13
210 14
210 14
211 15
211 15
212 16
212 16
213 17
213 17
214 18
214 18
215 19
215 19
216 20
216 20
217 21
217 21
218 22
218 22
219 23
219 23
220 man r8
220 man r8
221 $ hg manifest -r8
221 $ hg manifest -r8
222 mf
222 mf
223 nf0
223 nf0
224 nf1
224 nf1
225 nf5
225 nf5
226 nf6
226 nf6
227 nf7
227 nf7
228 nf8
228 nf8
229 cat r8 mf
229 cat r8 mf
230 $ hg cat -r8 mf
230 $ hg cat -r8 mf
231 0 r0
231 0 r0
232 1
232 1
233 2 r1
233 2 r1
234 3
234 3
235 4
235 4
236 5
236 5
237 6
237 6
238 7
238 7
239 8
239 8
240 9
240 9
241 10 r5
241 10 r5
242 11
242 11
243 12 r6
243 12 r6
244 13
244 13
245 14 r7
245 14 r7
246 15
246 15
247 16 r8
247 16 r8
248 17
248 17
249 18
249 18
250 19
250 19
251 20
251 20
252 21
252 21
253 22
253 22
254 23
254 23
255 man
255 man
256 $ hg manifest
256 $ hg manifest
257 mf
257 mf
258 nf0
258 nf0
259 nf1
259 nf1
260 nf10
260 nf10
261 nf11
261 nf11
262 nf2
262 nf2
263 nf3
263 nf3
264 nf4
264 nf4
265 nf5
265 nf5
266 nf6
266 nf6
267 nf7
267 nf7
268 nf8
268 nf8
269 nf9
269 nf9
270 cat mf
270 cat mf
271 $ hg cat mf
271 $ hg cat mf
272 0 r0
272 0 r0
273 1
273 1
274 2 r1
274 2 r1
275 3
275 3
276 4 r2
276 4 r2
277 5
277 5
278 6 r3
278 6 r3
279 7
279 7
280 8 r4
280 8 r4
281 9
281 9
282 10 r5
282 10 r5
283 11
283 11
284 12 r6
284 12 r6
285 13
285 13
286 14 r7
286 14 r7
287 15
287 15
288 16 r8
288 16 r8
289 17
289 17
290 18 r9
290 18 r9
291 19
291 19
292 20 r10
292 20 r10
293 21
293 21
294 22 r11
294 22 r11
295 23
295 23
296 $ cd ..
296 $ cd ..
297
297
298 command
298 command
299
299
300 $ rm -rf repo
300 $ rm -rf repo
301 $ hg init repo
301 $ hg init repo
302 $ cd repo
302 $ cd repo
303 $ hg debugbuilddag '+2 !"touch X" +2' -q -o
303 $ hg debugbuilddag '+2 !"touch X" +2' -q -o
304 dag
304 dag
305 $ hg debugdag -t -b
305 $ hg debugdag -t -b
306 +4:tip
306 +4:tip
307 glog
307 glog
308 $ hg glog --template '{rev}: {desc} [{branches}]\n'
308 $ hg glog --template '{rev}: {desc} [{branches}]\n'
309 @ 3: r3 []
309 @ 3: r3 []
310 |
310 |
311 o 2: r2 []
311 o 2: r2 []
312 |
312 |
313 o 1: r1 []
313 o 1: r1 []
314 |
314 |
315 o 0: r0 []
315 o 0: r0 []
316
316
317 glog X
317 glog X
318 $ hg glog --template '{rev}: {desc} [{branches}]\n' X
318 $ hg glog --template '{rev}: {desc} [{branches}]\n' X
319 o 2: r2 []
319 o 2: r2 []
320
320 |
321 $ cd ..
321 $ cd ..
@@ -1,930 +1,930 b''
1 @ (34) head
1 @ (34) head
2 |
2 |
3 | o (33) head
3 | o (33) head
4 | |
4 | |
5 o | (32) expand
5 o | (32) expand
6 |\ \
6 |\ \
7 | o \ (31) expand
7 | o \ (31) expand
8 | |\ \
8 | |\ \
9 | | o \ (30) expand
9 | | o \ (30) expand
10 | | |\ \
10 | | |\ \
11 | | | o | (29) regular commit
11 | | | o | (29) regular commit
12 | | | | |
12 | | | | |
13 | | o | | (28) merge zero known
13 | | o | | (28) merge zero known
14 | | |\ \ \
14 | | |\ \ \
15 o | | | | | (27) collapse
15 o | | | | | (27) collapse
16 |/ / / / /
16 |/ / / / /
17 | | o---+ (26) merge one known; far right
17 | | o---+ (26) merge one known; far right
18 | | | | |
18 | | | | |
19 +---o | | (25) merge one known; far left
19 +---o | | (25) merge one known; far left
20 | | | | |
20 | | | | |
21 | | o | | (24) merge one known; immediate right
21 | | o | | (24) merge one known; immediate right
22 | | |\| |
22 | | |\| |
23 | | o | | (23) merge one known; immediate left
23 | | o | | (23) merge one known; immediate left
24 | |/| | |
24 | |/| | |
25 +---o---+ (22) merge two known; one far left, one far right
25 +---o---+ (22) merge two known; one far left, one far right
26 | | / /
26 | | / /
27 o | | | (21) expand
27 o | | | (21) expand
28 |\ \ \ \
28 |\ \ \ \
29 | o---+-+ (20) merge two known; two far right
29 | o---+-+ (20) merge two known; two far right
30 | / / /
30 | / / /
31 o | | | (19) expand
31 o | | | (19) expand
32 |\ \ \ \
32 |\ \ \ \
33 +---+---o (18) merge two known; two far left
33 +---+---o (18) merge two known; two far left
34 | | | |
34 | | | |
35 | o | | (17) expand
35 | o | | (17) expand
36 | |\ \ \
36 | |\ \ \
37 | | o---+ (16) merge two known; one immediate right, one near right
37 | | o---+ (16) merge two known; one immediate right, one near right
38 | | |/ /
38 | | |/ /
39 o | | | (15) expand
39 o | | | (15) expand
40 |\ \ \ \
40 |\ \ \ \
41 | o-----+ (14) merge two known; one immediate right, one far right
41 | o-----+ (14) merge two known; one immediate right, one far right
42 | |/ / /
42 | |/ / /
43 o | | | (13) expand
43 o | | | (13) expand
44 |\ \ \ \
44 |\ \ \ \
45 +---o | | (12) merge two known; one immediate right, one far left
45 +---o | | (12) merge two known; one immediate right, one far left
46 | | |/ /
46 | | |/ /
47 | o | | (11) expand
47 | o | | (11) expand
48 | |\ \ \
48 | |\ \ \
49 | | o---+ (10) merge two known; one immediate left, one near right
49 | | o---+ (10) merge two known; one immediate left, one near right
50 | |/ / /
50 | |/ / /
51 o | | | (9) expand
51 o | | | (9) expand
52 |\ \ \ \
52 |\ \ \ \
53 | o-----+ (8) merge two known; one immediate left, one far right
53 | o-----+ (8) merge two known; one immediate left, one far right
54 |/ / / /
54 |/ / / /
55 o | | | (7) expand
55 o | | | (7) expand
56 |\ \ \ \
56 |\ \ \ \
57 +---o | | (6) merge two known; one immediate left, one far left
57 +---o | | (6) merge two known; one immediate left, one far left
58 | |/ / /
58 | |/ / /
59 | o | | (5) expand
59 | o | | (5) expand
60 | |\ \ \
60 | |\ \ \
61 | | o | | (4) merge two known; one immediate left, one immediate right
61 | | o | | (4) merge two known; one immediate left, one immediate right
62 | |/|/ /
62 | |/|/ /
63 | o / / (3) collapse
63 | o / / (3) collapse
64 |/ / /
64 |/ / /
65 o / / (2) collapse
65 o / / (2) collapse
66 |/ /
66 |/ /
67 o / (1) collapse
67 o / (1) collapse
68 |/
68 |/
69 o (0) root
69 o (0) root
70
70
71
71
72 $ "$TESTDIR/hghave" no-outer-repo || exit 80
72 $ "$TESTDIR/hghave" no-outer-repo || exit 80
73
73
74 $ commit()
74 $ commit()
75 > {
75 > {
76 > rev=$1
76 > rev=$1
77 > msg=$2
77 > msg=$2
78 > shift 2
78 > shift 2
79 > if [ "$#" -gt 0 ]; then
79 > if [ "$#" -gt 0 ]; then
80 > hg debugsetparents "$@"
80 > hg debugsetparents "$@"
81 > fi
81 > fi
82 > echo $rev > a
82 > echo $rev > a
83 > hg commit -Aqd "$rev 0" -m "($rev) $msg"
83 > hg commit -Aqd "$rev 0" -m "($rev) $msg"
84 > }
84 > }
85
85
86 $ echo "[extensions]" >> $HGRCPATH
86 $ echo "[extensions]" >> $HGRCPATH
87 $ echo "graphlog=" >> $HGRCPATH
87 $ echo "graphlog=" >> $HGRCPATH
88
88
89 $ hg init repo
89 $ hg init repo
90 $ cd repo
90 $ cd repo
91
91
92 Empty repo:
92 Empty repo:
93
93
94 $ hg glog
94 $ hg glog
95
95
96
96
97 Building DAG:
97 Building DAG:
98
98
99 $ commit 0 "root"
99 $ commit 0 "root"
100 $ commit 1 "collapse" 0
100 $ commit 1 "collapse" 0
101 $ commit 2 "collapse" 1
101 $ commit 2 "collapse" 1
102 $ commit 3 "collapse" 2
102 $ commit 3 "collapse" 2
103 $ commit 4 "merge two known; one immediate left, one immediate right" 1 3
103 $ commit 4 "merge two known; one immediate left, one immediate right" 1 3
104 $ commit 5 "expand" 3 4
104 $ commit 5 "expand" 3 4
105 $ commit 6 "merge two known; one immediate left, one far left" 2 5
105 $ commit 6 "merge two known; one immediate left, one far left" 2 5
106 $ commit 7 "expand" 2 5
106 $ commit 7 "expand" 2 5
107 $ commit 8 "merge two known; one immediate left, one far right" 0 7
107 $ commit 8 "merge two known; one immediate left, one far right" 0 7
108 $ commit 9 "expand" 7 8
108 $ commit 9 "expand" 7 8
109 $ commit 10 "merge two known; one immediate left, one near right" 0 6
109 $ commit 10 "merge two known; one immediate left, one near right" 0 6
110 $ commit 11 "expand" 6 10
110 $ commit 11 "expand" 6 10
111 $ commit 12 "merge two known; one immediate right, one far left" 1 9
111 $ commit 12 "merge two known; one immediate right, one far left" 1 9
112 $ commit 13 "expand" 9 11
112 $ commit 13 "expand" 9 11
113 $ commit 14 "merge two known; one immediate right, one far right" 0 12
113 $ commit 14 "merge two known; one immediate right, one far right" 0 12
114 $ commit 15 "expand" 13 14
114 $ commit 15 "expand" 13 14
115 $ commit 16 "merge two known; one immediate right, one near right" 0 1
115 $ commit 16 "merge two known; one immediate right, one near right" 0 1
116 $ commit 17 "expand" 12 16
116 $ commit 17 "expand" 12 16
117 $ commit 18 "merge two known; two far left" 1 15
117 $ commit 18 "merge two known; two far left" 1 15
118 $ commit 19 "expand" 15 17
118 $ commit 19 "expand" 15 17
119 $ commit 20 "merge two known; two far right" 0 18
119 $ commit 20 "merge two known; two far right" 0 18
120 $ commit 21 "expand" 19 20
120 $ commit 21 "expand" 19 20
121 $ commit 22 "merge two known; one far left, one far right" 18 21
121 $ commit 22 "merge two known; one far left, one far right" 18 21
122 $ commit 23 "merge one known; immediate left" 1 22
122 $ commit 23 "merge one known; immediate left" 1 22
123 $ commit 24 "merge one known; immediate right" 0 23
123 $ commit 24 "merge one known; immediate right" 0 23
124 $ commit 25 "merge one known; far left" 21 24
124 $ commit 25 "merge one known; far left" 21 24
125 $ commit 26 "merge one known; far right" 18 25
125 $ commit 26 "merge one known; far right" 18 25
126 $ commit 27 "collapse" 21
126 $ commit 27 "collapse" 21
127 $ commit 28 "merge zero known" 1 26
127 $ commit 28 "merge zero known" 1 26
128 $ commit 29 "regular commit" 0
128 $ commit 29 "regular commit" 0
129 $ commit 30 "expand" 28 29
129 $ commit 30 "expand" 28 29
130 $ commit 31 "expand" 21 30
130 $ commit 31 "expand" 21 30
131 $ commit 32 "expand" 27 31
131 $ commit 32 "expand" 27 31
132 $ commit 33 "head" 18
132 $ commit 33 "head" 18
133 $ commit 34 "head" 32
133 $ commit 34 "head" 32
134
134
135
135
136 $ hg glog -q
136 $ hg glog -q
137 @ 34:fea3ac5810e0
137 @ 34:fea3ac5810e0
138 |
138 |
139 | o 33:68608f5145f9
139 | o 33:68608f5145f9
140 | |
140 | |
141 o | 32:d06dffa21a31
141 o | 32:d06dffa21a31
142 |\ \
142 |\ \
143 | o \ 31:621d83e11f67
143 | o \ 31:621d83e11f67
144 | |\ \
144 | |\ \
145 | | o \ 30:6e11cd4b648f
145 | | o \ 30:6e11cd4b648f
146 | | |\ \
146 | | |\ \
147 | | | o | 29:cd9bb2be7593
147 | | | o | 29:cd9bb2be7593
148 | | | | |
148 | | | | |
149 | | o | | 28:44ecd0b9ae99
149 | | o | | 28:44ecd0b9ae99
150 | | |\ \ \
150 | | |\ \ \
151 o | | | | | 27:886ed638191b
151 o | | | | | 27:886ed638191b
152 |/ / / / /
152 |/ / / / /
153 | | o---+ 26:7f25b6c2f0b9
153 | | o---+ 26:7f25b6c2f0b9
154 | | | | |
154 | | | | |
155 +---o | | 25:91da8ed57247
155 +---o | | 25:91da8ed57247
156 | | | | |
156 | | | | |
157 | | o | | 24:a9c19a3d96b7
157 | | o | | 24:a9c19a3d96b7
158 | | |\| |
158 | | |\| |
159 | | o | | 23:a01cddf0766d
159 | | o | | 23:a01cddf0766d
160 | |/| | |
160 | |/| | |
161 +---o---+ 22:e0d9cccacb5d
161 +---o---+ 22:e0d9cccacb5d
162 | | / /
162 | | / /
163 o | | | 21:d42a756af44d
163 o | | | 21:d42a756af44d
164 |\ \ \ \
164 |\ \ \ \
165 | o---+-+ 20:d30ed6450e32
165 | o---+-+ 20:d30ed6450e32
166 | / / /
166 | / / /
167 o | | | 19:31ddc2c1573b
167 o | | | 19:31ddc2c1573b
168 |\ \ \ \
168 |\ \ \ \
169 +---+---o 18:1aa84d96232a
169 +---+---o 18:1aa84d96232a
170 | | | |
170 | | | |
171 | o | | 17:44765d7c06e0
171 | o | | 17:44765d7c06e0
172 | |\ \ \
172 | |\ \ \
173 | | o---+ 16:3677d192927d
173 | | o---+ 16:3677d192927d
174 | | |/ /
174 | | |/ /
175 o | | | 15:1dda3f72782d
175 o | | | 15:1dda3f72782d
176 |\ \ \ \
176 |\ \ \ \
177 | o-----+ 14:8eac370358ef
177 | o-----+ 14:8eac370358ef
178 | |/ / /
178 | |/ / /
179 o | | | 13:22d8966a97e3
179 o | | | 13:22d8966a97e3
180 |\ \ \ \
180 |\ \ \ \
181 +---o | | 12:86b91144a6e9
181 +---o | | 12:86b91144a6e9
182 | | |/ /
182 | | |/ /
183 | o | | 11:832d76e6bdf2
183 | o | | 11:832d76e6bdf2
184 | |\ \ \
184 | |\ \ \
185 | | o---+ 10:74c64d036d72
185 | | o---+ 10:74c64d036d72
186 | |/ / /
186 | |/ / /
187 o | | | 9:7010c0af0a35
187 o | | | 9:7010c0af0a35
188 |\ \ \ \
188 |\ \ \ \
189 | o-----+ 8:7a0b11f71937
189 | o-----+ 8:7a0b11f71937
190 |/ / / /
190 |/ / / /
191 o | | | 7:b632bb1b1224
191 o | | | 7:b632bb1b1224
192 |\ \ \ \
192 |\ \ \ \
193 +---o | | 6:b105a072e251
193 +---o | | 6:b105a072e251
194 | |/ / /
194 | |/ / /
195 | o | | 5:4409d547b708
195 | o | | 5:4409d547b708
196 | |\ \ \
196 | |\ \ \
197 | | o | | 4:26a8bac39d9f
197 | | o | | 4:26a8bac39d9f
198 | |/|/ /
198 | |/|/ /
199 | o / / 3:27eef8ed80b4
199 | o / / 3:27eef8ed80b4
200 |/ / /
200 |/ / /
201 o / / 2:3d9a33b8d1e1
201 o / / 2:3d9a33b8d1e1
202 |/ /
202 |/ /
203 o / 1:6db2ef61d156
203 o / 1:6db2ef61d156
204 |/
204 |/
205 o 0:e6eb3150255d
205 o 0:e6eb3150255d
206
206
207
207
208 $ hg glog
208 $ hg glog
209 @ changeset: 34:fea3ac5810e0
209 @ changeset: 34:fea3ac5810e0
210 | tag: tip
210 | tag: tip
211 | parent: 32:d06dffa21a31
211 | parent: 32:d06dffa21a31
212 | user: test
212 | user: test
213 | date: Thu Jan 01 00:00:34 1970 +0000
213 | date: Thu Jan 01 00:00:34 1970 +0000
214 | summary: (34) head
214 | summary: (34) head
215 |
215 |
216 | o changeset: 33:68608f5145f9
216 | o changeset: 33:68608f5145f9
217 | | parent: 18:1aa84d96232a
217 | | parent: 18:1aa84d96232a
218 | | user: test
218 | | user: test
219 | | date: Thu Jan 01 00:00:33 1970 +0000
219 | | date: Thu Jan 01 00:00:33 1970 +0000
220 | | summary: (33) head
220 | | summary: (33) head
221 | |
221 | |
222 o | changeset: 32:d06dffa21a31
222 o | changeset: 32:d06dffa21a31
223 |\ \ parent: 27:886ed638191b
223 |\ \ parent: 27:886ed638191b
224 | | | parent: 31:621d83e11f67
224 | | | parent: 31:621d83e11f67
225 | | | user: test
225 | | | user: test
226 | | | date: Thu Jan 01 00:00:32 1970 +0000
226 | | | date: Thu Jan 01 00:00:32 1970 +0000
227 | | | summary: (32) expand
227 | | | summary: (32) expand
228 | | |
228 | | |
229 | o | changeset: 31:621d83e11f67
229 | o | changeset: 31:621d83e11f67
230 | |\ \ parent: 21:d42a756af44d
230 | |\ \ parent: 21:d42a756af44d
231 | | | | parent: 30:6e11cd4b648f
231 | | | | parent: 30:6e11cd4b648f
232 | | | | user: test
232 | | | | user: test
233 | | | | date: Thu Jan 01 00:00:31 1970 +0000
233 | | | | date: Thu Jan 01 00:00:31 1970 +0000
234 | | | | summary: (31) expand
234 | | | | summary: (31) expand
235 | | | |
235 | | | |
236 | | o | changeset: 30:6e11cd4b648f
236 | | o | changeset: 30:6e11cd4b648f
237 | | |\ \ parent: 28:44ecd0b9ae99
237 | | |\ \ parent: 28:44ecd0b9ae99
238 | | | | | parent: 29:cd9bb2be7593
238 | | | | | parent: 29:cd9bb2be7593
239 | | | | | user: test
239 | | | | | user: test
240 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
240 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
241 | | | | | summary: (30) expand
241 | | | | | summary: (30) expand
242 | | | | |
242 | | | | |
243 | | | o | changeset: 29:cd9bb2be7593
243 | | | o | changeset: 29:cd9bb2be7593
244 | | | | | parent: 0:e6eb3150255d
244 | | | | | parent: 0:e6eb3150255d
245 | | | | | user: test
245 | | | | | user: test
246 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
246 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
247 | | | | | summary: (29) regular commit
247 | | | | | summary: (29) regular commit
248 | | | | |
248 | | | | |
249 | | o | | changeset: 28:44ecd0b9ae99
249 | | o | | changeset: 28:44ecd0b9ae99
250 | | |\ \ \ parent: 1:6db2ef61d156
250 | | |\ \ \ parent: 1:6db2ef61d156
251 | | | | | | parent: 26:7f25b6c2f0b9
251 | | | | | | parent: 26:7f25b6c2f0b9
252 | | | | | | user: test
252 | | | | | | user: test
253 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
253 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
254 | | | | | | summary: (28) merge zero known
254 | | | | | | summary: (28) merge zero known
255 | | | | | |
255 | | | | | |
256 o | | | | | changeset: 27:886ed638191b
256 o | | | | | changeset: 27:886ed638191b
257 |/ / / / / parent: 21:d42a756af44d
257 |/ / / / / parent: 21:d42a756af44d
258 | | | | | user: test
258 | | | | | user: test
259 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
259 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
260 | | | | | summary: (27) collapse
260 | | | | | summary: (27) collapse
261 | | | | |
261 | | | | |
262 | | o---+ changeset: 26:7f25b6c2f0b9
262 | | o---+ changeset: 26:7f25b6c2f0b9
263 | | | | | parent: 18:1aa84d96232a
263 | | | | | parent: 18:1aa84d96232a
264 | | | | | parent: 25:91da8ed57247
264 | | | | | parent: 25:91da8ed57247
265 | | | | | user: test
265 | | | | | user: test
266 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
266 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
267 | | | | | summary: (26) merge one known; far right
267 | | | | | summary: (26) merge one known; far right
268 | | | | |
268 | | | | |
269 +---o | | changeset: 25:91da8ed57247
269 +---o | | changeset: 25:91da8ed57247
270 | | | | | parent: 21:d42a756af44d
270 | | | | | parent: 21:d42a756af44d
271 | | | | | parent: 24:a9c19a3d96b7
271 | | | | | parent: 24:a9c19a3d96b7
272 | | | | | user: test
272 | | | | | user: test
273 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
273 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
274 | | | | | summary: (25) merge one known; far left
274 | | | | | summary: (25) merge one known; far left
275 | | | | |
275 | | | | |
276 | | o | | changeset: 24:a9c19a3d96b7
276 | | o | | changeset: 24:a9c19a3d96b7
277 | | |\| | parent: 0:e6eb3150255d
277 | | |\| | parent: 0:e6eb3150255d
278 | | | | | parent: 23:a01cddf0766d
278 | | | | | parent: 23:a01cddf0766d
279 | | | | | user: test
279 | | | | | user: test
280 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
280 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
281 | | | | | summary: (24) merge one known; immediate right
281 | | | | | summary: (24) merge one known; immediate right
282 | | | | |
282 | | | | |
283 | | o | | changeset: 23:a01cddf0766d
283 | | o | | changeset: 23:a01cddf0766d
284 | |/| | | parent: 1:6db2ef61d156
284 | |/| | | parent: 1:6db2ef61d156
285 | | | | | parent: 22:e0d9cccacb5d
285 | | | | | parent: 22:e0d9cccacb5d
286 | | | | | user: test
286 | | | | | user: test
287 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
287 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
288 | | | | | summary: (23) merge one known; immediate left
288 | | | | | summary: (23) merge one known; immediate left
289 | | | | |
289 | | | | |
290 +---o---+ changeset: 22:e0d9cccacb5d
290 +---o---+ changeset: 22:e0d9cccacb5d
291 | | | | parent: 18:1aa84d96232a
291 | | | | parent: 18:1aa84d96232a
292 | | / / parent: 21:d42a756af44d
292 | | / / parent: 21:d42a756af44d
293 | | | | user: test
293 | | | | user: test
294 | | | | date: Thu Jan 01 00:00:22 1970 +0000
294 | | | | date: Thu Jan 01 00:00:22 1970 +0000
295 | | | | summary: (22) merge two known; one far left, one far right
295 | | | | summary: (22) merge two known; one far left, one far right
296 | | | |
296 | | | |
297 o | | | changeset: 21:d42a756af44d
297 o | | | changeset: 21:d42a756af44d
298 |\ \ \ \ parent: 19:31ddc2c1573b
298 |\ \ \ \ parent: 19:31ddc2c1573b
299 | | | | | parent: 20:d30ed6450e32
299 | | | | | parent: 20:d30ed6450e32
300 | | | | | user: test
300 | | | | | user: test
301 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
301 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
302 | | | | | summary: (21) expand
302 | | | | | summary: (21) expand
303 | | | | |
303 | | | | |
304 | o---+-+ changeset: 20:d30ed6450e32
304 | o---+-+ changeset: 20:d30ed6450e32
305 | | | | parent: 0:e6eb3150255d
305 | | | | parent: 0:e6eb3150255d
306 | / / / parent: 18:1aa84d96232a
306 | / / / parent: 18:1aa84d96232a
307 | | | | user: test
307 | | | | user: test
308 | | | | date: Thu Jan 01 00:00:20 1970 +0000
308 | | | | date: Thu Jan 01 00:00:20 1970 +0000
309 | | | | summary: (20) merge two known; two far right
309 | | | | summary: (20) merge two known; two far right
310 | | | |
310 | | | |
311 o | | | changeset: 19:31ddc2c1573b
311 o | | | changeset: 19:31ddc2c1573b
312 |\ \ \ \ parent: 15:1dda3f72782d
312 |\ \ \ \ parent: 15:1dda3f72782d
313 | | | | | parent: 17:44765d7c06e0
313 | | | | | parent: 17:44765d7c06e0
314 | | | | | user: test
314 | | | | | user: test
315 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
315 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
316 | | | | | summary: (19) expand
316 | | | | | summary: (19) expand
317 | | | | |
317 | | | | |
318 +---+---o changeset: 18:1aa84d96232a
318 +---+---o changeset: 18:1aa84d96232a
319 | | | | parent: 1:6db2ef61d156
319 | | | | parent: 1:6db2ef61d156
320 | | | | parent: 15:1dda3f72782d
320 | | | | parent: 15:1dda3f72782d
321 | | | | user: test
321 | | | | user: test
322 | | | | date: Thu Jan 01 00:00:18 1970 +0000
322 | | | | date: Thu Jan 01 00:00:18 1970 +0000
323 | | | | summary: (18) merge two known; two far left
323 | | | | summary: (18) merge two known; two far left
324 | | | |
324 | | | |
325 | o | | changeset: 17:44765d7c06e0
325 | o | | changeset: 17:44765d7c06e0
326 | |\ \ \ parent: 12:86b91144a6e9
326 | |\ \ \ parent: 12:86b91144a6e9
327 | | | | | parent: 16:3677d192927d
327 | | | | | parent: 16:3677d192927d
328 | | | | | user: test
328 | | | | | user: test
329 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
329 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
330 | | | | | summary: (17) expand
330 | | | | | summary: (17) expand
331 | | | | |
331 | | | | |
332 | | o---+ changeset: 16:3677d192927d
332 | | o---+ changeset: 16:3677d192927d
333 | | | | | parent: 0:e6eb3150255d
333 | | | | | parent: 0:e6eb3150255d
334 | | |/ / parent: 1:6db2ef61d156
334 | | |/ / parent: 1:6db2ef61d156
335 | | | | user: test
335 | | | | user: test
336 | | | | date: Thu Jan 01 00:00:16 1970 +0000
336 | | | | date: Thu Jan 01 00:00:16 1970 +0000
337 | | | | summary: (16) merge two known; one immediate right, one near right
337 | | | | summary: (16) merge two known; one immediate right, one near right
338 | | | |
338 | | | |
339 o | | | changeset: 15:1dda3f72782d
339 o | | | changeset: 15:1dda3f72782d
340 |\ \ \ \ parent: 13:22d8966a97e3
340 |\ \ \ \ parent: 13:22d8966a97e3
341 | | | | | parent: 14:8eac370358ef
341 | | | | | parent: 14:8eac370358ef
342 | | | | | user: test
342 | | | | | user: test
343 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
343 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
344 | | | | | summary: (15) expand
344 | | | | | summary: (15) expand
345 | | | | |
345 | | | | |
346 | o-----+ changeset: 14:8eac370358ef
346 | o-----+ changeset: 14:8eac370358ef
347 | | | | | parent: 0:e6eb3150255d
347 | | | | | parent: 0:e6eb3150255d
348 | |/ / / parent: 12:86b91144a6e9
348 | |/ / / parent: 12:86b91144a6e9
349 | | | | user: test
349 | | | | user: test
350 | | | | date: Thu Jan 01 00:00:14 1970 +0000
350 | | | | date: Thu Jan 01 00:00:14 1970 +0000
351 | | | | summary: (14) merge two known; one immediate right, one far right
351 | | | | summary: (14) merge two known; one immediate right, one far right
352 | | | |
352 | | | |
353 o | | | changeset: 13:22d8966a97e3
353 o | | | changeset: 13:22d8966a97e3
354 |\ \ \ \ parent: 9:7010c0af0a35
354 |\ \ \ \ parent: 9:7010c0af0a35
355 | | | | | parent: 11:832d76e6bdf2
355 | | | | | parent: 11:832d76e6bdf2
356 | | | | | user: test
356 | | | | | user: test
357 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
357 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
358 | | | | | summary: (13) expand
358 | | | | | summary: (13) expand
359 | | | | |
359 | | | | |
360 +---o | | changeset: 12:86b91144a6e9
360 +---o | | changeset: 12:86b91144a6e9
361 | | |/ / parent: 1:6db2ef61d156
361 | | |/ / parent: 1:6db2ef61d156
362 | | | | parent: 9:7010c0af0a35
362 | | | | parent: 9:7010c0af0a35
363 | | | | user: test
363 | | | | user: test
364 | | | | date: Thu Jan 01 00:00:12 1970 +0000
364 | | | | date: Thu Jan 01 00:00:12 1970 +0000
365 | | | | summary: (12) merge two known; one immediate right, one far left
365 | | | | summary: (12) merge two known; one immediate right, one far left
366 | | | |
366 | | | |
367 | o | | changeset: 11:832d76e6bdf2
367 | o | | changeset: 11:832d76e6bdf2
368 | |\ \ \ parent: 6:b105a072e251
368 | |\ \ \ parent: 6:b105a072e251
369 | | | | | parent: 10:74c64d036d72
369 | | | | | parent: 10:74c64d036d72
370 | | | | | user: test
370 | | | | | user: test
371 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
371 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
372 | | | | | summary: (11) expand
372 | | | | | summary: (11) expand
373 | | | | |
373 | | | | |
374 | | o---+ changeset: 10:74c64d036d72
374 | | o---+ changeset: 10:74c64d036d72
375 | | | | | parent: 0:e6eb3150255d
375 | | | | | parent: 0:e6eb3150255d
376 | |/ / / parent: 6:b105a072e251
376 | |/ / / parent: 6:b105a072e251
377 | | | | user: test
377 | | | | user: test
378 | | | | date: Thu Jan 01 00:00:10 1970 +0000
378 | | | | date: Thu Jan 01 00:00:10 1970 +0000
379 | | | | summary: (10) merge two known; one immediate left, one near right
379 | | | | summary: (10) merge two known; one immediate left, one near right
380 | | | |
380 | | | |
381 o | | | changeset: 9:7010c0af0a35
381 o | | | changeset: 9:7010c0af0a35
382 |\ \ \ \ parent: 7:b632bb1b1224
382 |\ \ \ \ parent: 7:b632bb1b1224
383 | | | | | parent: 8:7a0b11f71937
383 | | | | | parent: 8:7a0b11f71937
384 | | | | | user: test
384 | | | | | user: test
385 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
385 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
386 | | | | | summary: (9) expand
386 | | | | | summary: (9) expand
387 | | | | |
387 | | | | |
388 | o-----+ changeset: 8:7a0b11f71937
388 | o-----+ changeset: 8:7a0b11f71937
389 | | | | | parent: 0:e6eb3150255d
389 | | | | | parent: 0:e6eb3150255d
390 |/ / / / parent: 7:b632bb1b1224
390 |/ / / / parent: 7:b632bb1b1224
391 | | | | user: test
391 | | | | user: test
392 | | | | date: Thu Jan 01 00:00:08 1970 +0000
392 | | | | date: Thu Jan 01 00:00:08 1970 +0000
393 | | | | summary: (8) merge two known; one immediate left, one far right
393 | | | | summary: (8) merge two known; one immediate left, one far right
394 | | | |
394 | | | |
395 o | | | changeset: 7:b632bb1b1224
395 o | | | changeset: 7:b632bb1b1224
396 |\ \ \ \ parent: 2:3d9a33b8d1e1
396 |\ \ \ \ parent: 2:3d9a33b8d1e1
397 | | | | | parent: 5:4409d547b708
397 | | | | | parent: 5:4409d547b708
398 | | | | | user: test
398 | | | | | user: test
399 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
399 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
400 | | | | | summary: (7) expand
400 | | | | | summary: (7) expand
401 | | | | |
401 | | | | |
402 +---o | | changeset: 6:b105a072e251
402 +---o | | changeset: 6:b105a072e251
403 | |/ / / parent: 2:3d9a33b8d1e1
403 | |/ / / parent: 2:3d9a33b8d1e1
404 | | | | parent: 5:4409d547b708
404 | | | | parent: 5:4409d547b708
405 | | | | user: test
405 | | | | user: test
406 | | | | date: Thu Jan 01 00:00:06 1970 +0000
406 | | | | date: Thu Jan 01 00:00:06 1970 +0000
407 | | | | summary: (6) merge two known; one immediate left, one far left
407 | | | | summary: (6) merge two known; one immediate left, one far left
408 | | | |
408 | | | |
409 | o | | changeset: 5:4409d547b708
409 | o | | changeset: 5:4409d547b708
410 | |\ \ \ parent: 3:27eef8ed80b4
410 | |\ \ \ parent: 3:27eef8ed80b4
411 | | | | | parent: 4:26a8bac39d9f
411 | | | | | parent: 4:26a8bac39d9f
412 | | | | | user: test
412 | | | | | user: test
413 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
413 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
414 | | | | | summary: (5) expand
414 | | | | | summary: (5) expand
415 | | | | |
415 | | | | |
416 | | o | | changeset: 4:26a8bac39d9f
416 | | o | | changeset: 4:26a8bac39d9f
417 | |/|/ / parent: 1:6db2ef61d156
417 | |/|/ / parent: 1:6db2ef61d156
418 | | | | parent: 3:27eef8ed80b4
418 | | | | parent: 3:27eef8ed80b4
419 | | | | user: test
419 | | | | user: test
420 | | | | date: Thu Jan 01 00:00:04 1970 +0000
420 | | | | date: Thu Jan 01 00:00:04 1970 +0000
421 | | | | summary: (4) merge two known; one immediate left, one immediate right
421 | | | | summary: (4) merge two known; one immediate left, one immediate right
422 | | | |
422 | | | |
423 | o | | changeset: 3:27eef8ed80b4
423 | o | | changeset: 3:27eef8ed80b4
424 |/ / / user: test
424 |/ / / user: test
425 | | | date: Thu Jan 01 00:00:03 1970 +0000
425 | | | date: Thu Jan 01 00:00:03 1970 +0000
426 | | | summary: (3) collapse
426 | | | summary: (3) collapse
427 | | |
427 | | |
428 o | | changeset: 2:3d9a33b8d1e1
428 o | | changeset: 2:3d9a33b8d1e1
429 |/ / user: test
429 |/ / user: test
430 | | date: Thu Jan 01 00:00:02 1970 +0000
430 | | date: Thu Jan 01 00:00:02 1970 +0000
431 | | summary: (2) collapse
431 | | summary: (2) collapse
432 | |
432 | |
433 o | changeset: 1:6db2ef61d156
433 o | changeset: 1:6db2ef61d156
434 |/ user: test
434 |/ user: test
435 | date: Thu Jan 01 00:00:01 1970 +0000
435 | date: Thu Jan 01 00:00:01 1970 +0000
436 | summary: (1) collapse
436 | summary: (1) collapse
437 |
437 |
438 o changeset: 0:e6eb3150255d
438 o changeset: 0:e6eb3150255d
439 user: test
439 user: test
440 date: Thu Jan 01 00:00:00 1970 +0000
440 date: Thu Jan 01 00:00:00 1970 +0000
441 summary: (0) root
441 summary: (0) root
442
442
443
443
444 File glog:
444 File glog:
445 $ hg glog a
445 $ hg glog a
446 @ changeset: 34:fea3ac5810e0
446 @ changeset: 34:fea3ac5810e0
447 | tag: tip
447 | tag: tip
448 | parent: 32:d06dffa21a31
448 | parent: 32:d06dffa21a31
449 | user: test
449 | user: test
450 | date: Thu Jan 01 00:00:34 1970 +0000
450 | date: Thu Jan 01 00:00:34 1970 +0000
451 | summary: (34) head
451 | summary: (34) head
452 |
452 |
453 | o changeset: 33:68608f5145f9
453 | o changeset: 33:68608f5145f9
454 | | parent: 18:1aa84d96232a
454 | | parent: 18:1aa84d96232a
455 | | user: test
455 | | user: test
456 | | date: Thu Jan 01 00:00:33 1970 +0000
456 | | date: Thu Jan 01 00:00:33 1970 +0000
457 | | summary: (33) head
457 | | summary: (33) head
458 | |
458 | |
459 o | changeset: 32:d06dffa21a31
459 o | changeset: 32:d06dffa21a31
460 |\ \ parent: 27:886ed638191b
460 |\ \ parent: 27:886ed638191b
461 | | | parent: 31:621d83e11f67
461 | | | parent: 31:621d83e11f67
462 | | | user: test
462 | | | user: test
463 | | | date: Thu Jan 01 00:00:32 1970 +0000
463 | | | date: Thu Jan 01 00:00:32 1970 +0000
464 | | | summary: (32) expand
464 | | | summary: (32) expand
465 | | |
465 | | |
466 | o | changeset: 31:621d83e11f67
466 | o | changeset: 31:621d83e11f67
467 | | | parent: 21:d42a756af44d
467 | |\ \ parent: 21:d42a756af44d
468 | | | parent: 30:6e11cd4b648f
468 | | | | parent: 30:6e11cd4b648f
469 | | | user: test
470 | | | date: Thu Jan 01 00:00:31 1970 +0000
471 | | | summary: (31) expand
472 | | |
473 | o | changeset: 30:6e11cd4b648f
474 | |\ \ parent: 28:44ecd0b9ae99
475 | | | | parent: 29:cd9bb2be7593
476 | | | | user: test
477 | | | | date: Thu Jan 01 00:00:30 1970 +0000
478 | | | | summary: (30) expand
479 | | | |
480 | | o | changeset: 29:cd9bb2be7593
481 | | | | parent: 0:e6eb3150255d
482 | | | | user: test
483 | | | | date: Thu Jan 01 00:00:29 1970 +0000
484 | | | | summary: (29) regular commit
485 | | | |
486 | o | | changeset: 28:44ecd0b9ae99
487 | | | | parent: 1:6db2ef61d156
488 | | | | parent: 26:7f25b6c2f0b9
489 | | | | user: test
469 | | | | user: test
490 | | | | date: Thu Jan 01 00:00:28 1970 +0000
470 | | | | date: Thu Jan 01 00:00:31 1970 +0000
491 | | | | summary: (28) merge zero known
471 | | | | summary: (31) expand
492 | | | |
493 o | | | changeset: 27:886ed638191b
494 | | | | parent: 21:d42a756af44d
495 | | | | user: test
496 | | | | date: Thu Jan 01 00:00:27 1970 +0000
497 | | | | summary: (27) collapse
498 | | | |
499 | o | | changeset: 26:7f25b6c2f0b9
500 | | | | parent: 18:1aa84d96232a
501 | | | | parent: 25:91da8ed57247
502 | | | | user: test
503 | | | | date: Thu Jan 01 00:00:26 1970 +0000
504 | | | | summary: (26) merge one known; far right
505 | | | |
506 | o | | changeset: 25:91da8ed57247
507 | | | | parent: 21:d42a756af44d
508 | | | | parent: 24:a9c19a3d96b7
509 | | | | user: test
510 | | | | date: Thu Jan 01 00:00:25 1970 +0000
511 | | | | summary: (25) merge one known; far left
512 | | | |
513 | o | | changeset: 24:a9c19a3d96b7
514 | | | | parent: 0:e6eb3150255d
515 | | | | parent: 23:a01cddf0766d
516 | | | | user: test
517 | | | | date: Thu Jan 01 00:00:24 1970 +0000
518 | | | | summary: (24) merge one known; immediate right
519 | | | |
472 | | | |
520 | o | | changeset: 23:a01cddf0766d
473 | | o | changeset: 30:6e11cd4b648f
521 | | | | parent: 1:6db2ef61d156
474 | | |\ \ parent: 28:44ecd0b9ae99
522 | | | | parent: 22:e0d9cccacb5d
475 | | | | | parent: 29:cd9bb2be7593
523 | | | | user: test
476 | | | | | user: test
524 | | | | date: Thu Jan 01 00:00:23 1970 +0000
477 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
525 | | | | summary: (23) merge one known; immediate left
478 | | | | | summary: (30) expand
526 | | | |
479 | | | | |
527 | o | | changeset: 22:e0d9cccacb5d
480 | | | o | changeset: 29:cd9bb2be7593
528 |/ / / parent: 18:1aa84d96232a
481 | | | | | parent: 0:e6eb3150255d
529 | | | parent: 21:d42a756af44d
482 | | | | | user: test
530 | | | user: test
483 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
531 | | | date: Thu Jan 01 00:00:22 1970 +0000
484 | | | | | summary: (29) regular commit
532 | | | summary: (22) merge two known; one far left, one far right
485 | | | | |
533 | | |
486 | | o | | changeset: 28:44ecd0b9ae99
534 o | | changeset: 21:d42a756af44d
487 | | |\ \ \ parent: 1:6db2ef61d156
535 |\ \ \ parent: 19:31ddc2c1573b
488 | | | | | | parent: 26:7f25b6c2f0b9
536 | | | | parent: 20:d30ed6450e32
489 | | | | | | user: test
537 | | | | user: test
490 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
538 | | | | date: Thu Jan 01 00:00:21 1970 +0000
491 | | | | | | summary: (28) merge zero known
539 | | | | summary: (21) expand
492 | | | | | |
493 o | | | | | changeset: 27:886ed638191b
494 |/ / / / / parent: 21:d42a756af44d
495 | | | | | user: test
496 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
497 | | | | | summary: (27) collapse
498 | | | | |
499 | | o---+ changeset: 26:7f25b6c2f0b9
500 | | | | | parent: 18:1aa84d96232a
501 | | | | | parent: 25:91da8ed57247
502 | | | | | user: test
503 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
504 | | | | | summary: (26) merge one known; far right
505 | | | | |
506 +---o | | changeset: 25:91da8ed57247
507 | | | | | parent: 21:d42a756af44d
508 | | | | | parent: 24:a9c19a3d96b7
509 | | | | | user: test
510 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
511 | | | | | summary: (25) merge one known; far left
512 | | | | |
513 | | o | | changeset: 24:a9c19a3d96b7
514 | | |\| | parent: 0:e6eb3150255d
515 | | | | | parent: 23:a01cddf0766d
516 | | | | | user: test
517 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
518 | | | | | summary: (24) merge one known; immediate right
519 | | | | |
520 | | o | | changeset: 23:a01cddf0766d
521 | |/| | | parent: 1:6db2ef61d156
522 | | | | | parent: 22:e0d9cccacb5d
523 | | | | | user: test
524 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
525 | | | | | summary: (23) merge one known; immediate left
526 | | | | |
527 +---o---+ changeset: 22:e0d9cccacb5d
528 | | | | parent: 18:1aa84d96232a
529 | | / / parent: 21:d42a756af44d
530 | | | | user: test
531 | | | | date: Thu Jan 01 00:00:22 1970 +0000
532 | | | | summary: (22) merge two known; one far left, one far right
540 | | | |
533 | | | |
541 | o---+ changeset: 20:d30ed6450e32
534 o | | | changeset: 21:d42a756af44d
542 | | | parent: 0:e6eb3150255d
535 |\ \ \ \ parent: 19:31ddc2c1573b
543 | / / parent: 18:1aa84d96232a
536 | | | | | parent: 20:d30ed6450e32
544 | | | user: test
537 | | | | | user: test
545 | | | date: Thu Jan 01 00:00:20 1970 +0000
538 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
546 | | | summary: (20) merge two known; two far right
539 | | | | | summary: (21) expand
547 | | |
540 | | | | |
548 o | | changeset: 19:31ddc2c1573b
541 | o---+-+ changeset: 20:d30ed6450e32
549 |\ \ \ parent: 15:1dda3f72782d
542 | | | | parent: 0:e6eb3150255d
550 | | | | parent: 17:44765d7c06e0
543 | / / / parent: 18:1aa84d96232a
551 | | | | user: test
544 | | | | user: test
552 | | | | date: Thu Jan 01 00:00:19 1970 +0000
545 | | | | date: Thu Jan 01 00:00:20 1970 +0000
553 | | | | summary: (19) expand
546 | | | | summary: (20) merge two known; two far right
554 | | | |
547 | | | |
555 +-----o changeset: 18:1aa84d96232a
548 o | | | changeset: 19:31ddc2c1573b
556 | | | parent: 1:6db2ef61d156
549 |\ \ \ \ parent: 15:1dda3f72782d
557 | | | parent: 15:1dda3f72782d
550 | | | | | parent: 17:44765d7c06e0
558 | | | user: test
551 | | | | | user: test
559 | | | date: Thu Jan 01 00:00:18 1970 +0000
552 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
560 | | | summary: (18) merge two known; two far left
553 | | | | | summary: (19) expand
561 | | |
554 | | | | |
562 | o | changeset: 17:44765d7c06e0
555 +---+---o changeset: 18:1aa84d96232a
563 | |\ \ parent: 12:86b91144a6e9
556 | | | | parent: 1:6db2ef61d156
564 | | | | parent: 16:3677d192927d
557 | | | | parent: 15:1dda3f72782d
565 | | | | user: test
558 | | | | user: test
566 | | | | date: Thu Jan 01 00:00:17 1970 +0000
559 | | | | date: Thu Jan 01 00:00:18 1970 +0000
567 | | | | summary: (17) expand
560 | | | | summary: (18) merge two known; two far left
568 | | | |
561 | | | |
569 | | o | changeset: 16:3677d192927d
562 | o | | changeset: 17:44765d7c06e0
570 | | | | parent: 0:e6eb3150255d
563 | |\ \ \ parent: 12:86b91144a6e9
571 | | | | parent: 1:6db2ef61d156
564 | | | | | parent: 16:3677d192927d
572 | | | | user: test
565 | | | | | user: test
573 | | | | date: Thu Jan 01 00:00:16 1970 +0000
566 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
574 | | | | summary: (16) merge two known; one immediate right, one near right
567 | | | | | summary: (17) expand
568 | | | | |
569 | | o---+ changeset: 16:3677d192927d
570 | | | | | parent: 0:e6eb3150255d
571 | | |/ / parent: 1:6db2ef61d156
572 | | | | user: test
573 | | | | date: Thu Jan 01 00:00:16 1970 +0000
574 | | | | summary: (16) merge two known; one immediate right, one near right
575 | | | |
575 | | | |
576 o | | | changeset: 15:1dda3f72782d
576 o | | | changeset: 15:1dda3f72782d
577 |\ \ \ \ parent: 13:22d8966a97e3
577 |\ \ \ \ parent: 13:22d8966a97e3
578 | | | | | parent: 14:8eac370358ef
578 | | | | | parent: 14:8eac370358ef
579 | | | | | user: test
579 | | | | | user: test
580 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
580 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
581 | | | | | summary: (15) expand
581 | | | | | summary: (15) expand
582 | | | | |
582 | | | | |
583 | o | | | changeset: 14:8eac370358ef
583 | o-----+ changeset: 14:8eac370358ef
584 | |/ / / parent: 0:e6eb3150255d
584 | | | | | parent: 0:e6eb3150255d
585 | | | | parent: 12:86b91144a6e9
585 | |/ / / parent: 12:86b91144a6e9
586 | | | | user: test
586 | | | | user: test
587 | | | | date: Thu Jan 01 00:00:14 1970 +0000
587 | | | | date: Thu Jan 01 00:00:14 1970 +0000
588 | | | | summary: (14) merge two known; one immediate right, one far right
588 | | | | summary: (14) merge two known; one immediate right, one far right
589 | | | |
589 | | | |
590 o | | | changeset: 13:22d8966a97e3
590 o | | | changeset: 13:22d8966a97e3
591 |\ \ \ \ parent: 9:7010c0af0a35
591 |\ \ \ \ parent: 9:7010c0af0a35
592 | | | | | parent: 11:832d76e6bdf2
592 | | | | | parent: 11:832d76e6bdf2
593 | | | | | user: test
593 | | | | | user: test
594 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
594 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
595 | | | | | summary: (13) expand
595 | | | | | summary: (13) expand
596 | | | | |
596 | | | | |
597 +---o | | changeset: 12:86b91144a6e9
597 +---o | | changeset: 12:86b91144a6e9
598 | | / / parent: 1:6db2ef61d156
598 | | |/ / parent: 1:6db2ef61d156
599 | | | | parent: 9:7010c0af0a35
599 | | | | parent: 9:7010c0af0a35
600 | | | | user: test
600 | | | | user: test
601 | | | | date: Thu Jan 01 00:00:12 1970 +0000
601 | | | | date: Thu Jan 01 00:00:12 1970 +0000
602 | | | | summary: (12) merge two known; one immediate right, one far left
602 | | | | summary: (12) merge two known; one immediate right, one far left
603 | | | |
603 | | | |
604 | o | | changeset: 11:832d76e6bdf2
604 | o | | changeset: 11:832d76e6bdf2
605 | | | | parent: 6:b105a072e251
605 | |\ \ \ parent: 6:b105a072e251
606 | | | | parent: 10:74c64d036d72
606 | | | | | parent: 10:74c64d036d72
607 | | | | user: test
607 | | | | | user: test
608 | | | | date: Thu Jan 01 00:00:11 1970 +0000
608 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
609 | | | | summary: (11) expand
609 | | | | | summary: (11) expand
610 | | | |
610 | | | | |
611 | o | | changeset: 10:74c64d036d72
611 | | o---+ changeset: 10:74c64d036d72
612 | | | | parent: 0:e6eb3150255d
612 | | | | | parent: 0:e6eb3150255d
613 | | | | parent: 6:b105a072e251
613 | |/ / / parent: 6:b105a072e251
614 | | | | user: test
614 | | | | user: test
615 | | | | date: Thu Jan 01 00:00:10 1970 +0000
615 | | | | date: Thu Jan 01 00:00:10 1970 +0000
616 | | | | summary: (10) merge two known; one immediate left, one near right
616 | | | | summary: (10) merge two known; one immediate left, one near right
617 | | | |
617 | | | |
618 o | | | changeset: 9:7010c0af0a35
618 o | | | changeset: 9:7010c0af0a35
619 | | | | parent: 7:b632bb1b1224
619 |\ \ \ \ parent: 7:b632bb1b1224
620 | | | | parent: 8:7a0b11f71937
620 | | | | | parent: 8:7a0b11f71937
621 | | | | user: test
621 | | | | | user: test
622 | | | | date: Thu Jan 01 00:00:09 1970 +0000
622 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
623 | | | | summary: (9) expand
623 | | | | | summary: (9) expand
624 | | | |
624 | | | | |
625 o | | | changeset: 8:7a0b11f71937
625 | o-----+ changeset: 8:7a0b11f71937
626 | | | | parent: 0:e6eb3150255d
626 | | | | | parent: 0:e6eb3150255d
627 | | | | parent: 7:b632bb1b1224
627 |/ / / / parent: 7:b632bb1b1224
628 | | | | user: test
628 | | | | user: test
629 | | | | date: Thu Jan 01 00:00:08 1970 +0000
629 | | | | date: Thu Jan 01 00:00:08 1970 +0000
630 | | | | summary: (8) merge two known; one immediate left, one far right
630 | | | | summary: (8) merge two known; one immediate left, one far right
631 | | | |
631 | | | |
632 o | | | changeset: 7:b632bb1b1224
632 o | | | changeset: 7:b632bb1b1224
633 | | | | parent: 2:3d9a33b8d1e1
633 |\ \ \ \ parent: 2:3d9a33b8d1e1
634 | | | | parent: 5:4409d547b708
634 | | | | | parent: 5:4409d547b708
635 | | | | user: test
635 | | | | | user: test
636 | | | | date: Thu Jan 01 00:00:07 1970 +0000
636 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
637 | | | | summary: (7) expand
637 | | | | | summary: (7) expand
638 | | | | |
639 +---o | | changeset: 6:b105a072e251
640 | |/ / / parent: 2:3d9a33b8d1e1
641 | | | | parent: 5:4409d547b708
642 | | | | user: test
643 | | | | date: Thu Jan 01 00:00:06 1970 +0000
644 | | | | summary: (6) merge two known; one immediate left, one far left
638 | | | |
645 | | | |
639 | o | | changeset: 6:b105a072e251
646 | o | | changeset: 5:4409d547b708
640 |/ / / parent: 2:3d9a33b8d1e1
647 | |\ \ \ parent: 3:27eef8ed80b4
641 | | | parent: 5:4409d547b708
648 | | | | | parent: 4:26a8bac39d9f
642 | | | user: test
649 | | | | | user: test
643 | | | date: Thu Jan 01 00:00:06 1970 +0000
650 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
644 | | | summary: (6) merge two known; one immediate left, one far left
651 | | | | | summary: (5) expand
645 | | |
652 | | | | |
646 o | | changeset: 5:4409d547b708
653 | | o | | changeset: 4:26a8bac39d9f
647 | | | parent: 3:27eef8ed80b4
654 | |/|/ / parent: 1:6db2ef61d156
648 | | | parent: 4:26a8bac39d9f
655 | | | | parent: 3:27eef8ed80b4
649 | | | user: test
656 | | | | user: test
650 | | | date: Thu Jan 01 00:00:05 1970 +0000
657 | | | | date: Thu Jan 01 00:00:04 1970 +0000
651 | | | summary: (5) expand
658 | | | | summary: (4) merge two known; one immediate left, one immediate right
652 | | |
659 | | | |
653 o | | changeset: 4:26a8bac39d9f
660 | o | | changeset: 3:27eef8ed80b4
654 | | | parent: 1:6db2ef61d156
661 |/ / / user: test
655 | | | parent: 3:27eef8ed80b4
662 | | | date: Thu Jan 01 00:00:03 1970 +0000
656 | | | user: test
663 | | | summary: (3) collapse
657 | | | date: Thu Jan 01 00:00:04 1970 +0000
658 | | | summary: (4) merge two known; one immediate left, one immediate right
659 | | |
660 o | | changeset: 3:27eef8ed80b4
661 | | | user: test
662 | | | date: Thu Jan 01 00:00:03 1970 +0000
663 | | | summary: (3) collapse
664 | | |
664 | | |
665 o | | changeset: 2:3d9a33b8d1e1
665 o | | changeset: 2:3d9a33b8d1e1
666 |/ / user: test
666 |/ / user: test
667 | | date: Thu Jan 01 00:00:02 1970 +0000
667 | | date: Thu Jan 01 00:00:02 1970 +0000
668 | | summary: (2) collapse
668 | | summary: (2) collapse
669 | |
669 | |
670 o | changeset: 1:6db2ef61d156
670 o | changeset: 1:6db2ef61d156
671 |/ user: test
671 |/ user: test
672 | date: Thu Jan 01 00:00:01 1970 +0000
672 | date: Thu Jan 01 00:00:01 1970 +0000
673 | summary: (1) collapse
673 | summary: (1) collapse
674 |
674 |
675 o changeset: 0:e6eb3150255d
675 o changeset: 0:e6eb3150255d
676 user: test
676 user: test
677 date: Thu Jan 01 00:00:00 1970 +0000
677 date: Thu Jan 01 00:00:00 1970 +0000
678 summary: (0) root
678 summary: (0) root
679
679
680
680
681 Unused arguments:
681 Unused arguments:
682 $ hg glog -q foo bar
682 $ hg glog -q foo bar
683 hg glog: invalid arguments
683 hg glog: invalid arguments
684 hg glog [OPTION]... [FILE]
684 hg glog [OPTION]... [FILE]
685
685
686 show revision history alongside an ASCII revision graph
686 show revision history alongside an ASCII revision graph
687 [255]
687 [255]
688
688
689 Only one file is allowed:
689 Only one file is allowed:
690 $ hg log -G foo bar
690 $ hg log -G foo bar
691 abort: --graph option allows at most one file
691 abort: --graph option allows at most one file
692 [255]
692 [255]
693
693
694 Empty revision range - display nothing:
694 Empty revision range - display nothing:
695 $ hg glog -r 1..0
695 $ hg glog -r 1..0
696
696
697 From outer space:
697 From outer space:
698 $ cd ..
698 $ cd ..
699 $ hg glog -l1 repo
699 $ hg glog -l1 repo
700 @ changeset: 34:fea3ac5810e0
700 @ changeset: 34:fea3ac5810e0
701 | tag: tip
701 | tag: tip
702 | parent: 32:d06dffa21a31
702 | parent: 32:d06dffa21a31
703 | user: test
703 | user: test
704 | date: Thu Jan 01 00:00:34 1970 +0000
704 | date: Thu Jan 01 00:00:34 1970 +0000
705 | summary: (34) head
705 | summary: (34) head
706 |
706 |
707 $ hg glog -l1 repo/a
707 $ hg glog -l1 repo/a
708 @ changeset: 34:fea3ac5810e0
708 @ changeset: 34:fea3ac5810e0
709 | tag: tip
709 | tag: tip
710 | parent: 32:d06dffa21a31
710 | parent: 32:d06dffa21a31
711 | user: test
711 | user: test
712 | date: Thu Jan 01 00:00:34 1970 +0000
712 | date: Thu Jan 01 00:00:34 1970 +0000
713 | summary: (34) head
713 | summary: (34) head
714 |
714 |
715 $ hg glog -l1 repo/missing
715 $ hg glog -l1 repo/missing
716
716
717 File log with revs != cset revs:
717 File log with revs != cset revs:
718 $ hg init flog
718 $ hg init flog
719 $ cd flog
719 $ cd flog
720 $ echo one >one
720 $ echo one >one
721 $ hg add one
721 $ hg add one
722 $ hg commit -mone
722 $ hg commit -mone
723 $ echo two >two
723 $ echo two >two
724 $ hg add two
724 $ hg add two
725 $ hg commit -mtwo
725 $ hg commit -mtwo
726 $ echo more >two
726 $ echo more >two
727 $ hg commit -mmore
727 $ hg commit -mmore
728 $ hg glog two
728 $ hg glog two
729 @ changeset: 2:12c28321755b
729 @ changeset: 2:12c28321755b
730 | tag: tip
730 | tag: tip
731 | user: test
731 | user: test
732 | date: Thu Jan 01 00:00:00 1970 +0000
732 | date: Thu Jan 01 00:00:00 1970 +0000
733 | summary: more
733 | summary: more
734 |
734 |
735 o changeset: 1:5ac72c0599bf
735 o changeset: 1:5ac72c0599bf
736 user: test
736 | user: test
737 date: Thu Jan 01 00:00:00 1970 +0000
737 | date: Thu Jan 01 00:00:00 1970 +0000
738 summary: two
738 | summary: two
739
739 |
740
740
741 Issue1896: File log with explicit style
741 Issue1896: File log with explicit style
742 $ hg glog --style=default one
742 $ hg glog --style=default one
743 o changeset: 0:3d578b4a1f53
743 o changeset: 0:3d578b4a1f53
744 user: test
744 user: test
745 date: Thu Jan 01 00:00:00 1970 +0000
745 date: Thu Jan 01 00:00:00 1970 +0000
746 summary: one
746 summary: one
747
747
748 Issue2395: glog --style header and footer
748 Issue2395: glog --style header and footer
749 $ hg glog --style=xml one
749 $ hg glog --style=xml one
750 <?xml version="1.0"?>
750 <?xml version="1.0"?>
751 <log>
751 <log>
752 o <logentry revision="0" node="3d578b4a1f537d5fcf7301bfa9c0b97adfaa6fb1">
752 o <logentry revision="0" node="3d578b4a1f537d5fcf7301bfa9c0b97adfaa6fb1">
753 <author email="test">test</author>
753 <author email="test">test</author>
754 <date>1970-01-01T00:00:00+00:00</date>
754 <date>1970-01-01T00:00:00+00:00</date>
755 <msg xml:space="preserve">one</msg>
755 <msg xml:space="preserve">one</msg>
756 </logentry>
756 </logentry>
757 </log>
757 </log>
758
758
759 $ cd ..
759 $ cd ..
760
760
761 Incoming and outgoing:
761 Incoming and outgoing:
762
762
763 $ hg clone -U -r31 repo repo2
763 $ hg clone -U -r31 repo repo2
764 adding changesets
764 adding changesets
765 adding manifests
765 adding manifests
766 adding file changes
766 adding file changes
767 added 31 changesets with 31 changes to 1 files
767 added 31 changesets with 31 changes to 1 files
768 $ cd repo2
768 $ cd repo2
769
769
770 $ hg incoming --graph ../repo
770 $ hg incoming --graph ../repo
771 comparing with ../repo
771 comparing with ../repo
772 searching for changes
772 searching for changes
773 o changeset: 34:fea3ac5810e0
773 o changeset: 34:fea3ac5810e0
774 | tag: tip
774 | tag: tip
775 | parent: 32:d06dffa21a31
775 | parent: 32:d06dffa21a31
776 | user: test
776 | user: test
777 | date: Thu Jan 01 00:00:34 1970 +0000
777 | date: Thu Jan 01 00:00:34 1970 +0000
778 | summary: (34) head
778 | summary: (34) head
779 |
779 |
780 | o changeset: 33:68608f5145f9
780 | o changeset: 33:68608f5145f9
781 | parent: 18:1aa84d96232a
781 | parent: 18:1aa84d96232a
782 | user: test
782 | user: test
783 | date: Thu Jan 01 00:00:33 1970 +0000
783 | date: Thu Jan 01 00:00:33 1970 +0000
784 | summary: (33) head
784 | summary: (33) head
785 |
785 |
786 o changeset: 32:d06dffa21a31
786 o changeset: 32:d06dffa21a31
787 | parent: 27:886ed638191b
787 | parent: 27:886ed638191b
788 | parent: 31:621d83e11f67
788 | parent: 31:621d83e11f67
789 | user: test
789 | user: test
790 | date: Thu Jan 01 00:00:32 1970 +0000
790 | date: Thu Jan 01 00:00:32 1970 +0000
791 | summary: (32) expand
791 | summary: (32) expand
792 |
792 |
793 o changeset: 27:886ed638191b
793 o changeset: 27:886ed638191b
794 parent: 21:d42a756af44d
794 parent: 21:d42a756af44d
795 user: test
795 user: test
796 date: Thu Jan 01 00:00:27 1970 +0000
796 date: Thu Jan 01 00:00:27 1970 +0000
797 summary: (27) collapse
797 summary: (27) collapse
798
798
799 $ cd ..
799 $ cd ..
800
800
801 $ hg -R repo outgoing --graph repo2
801 $ hg -R repo outgoing --graph repo2
802 comparing with repo2
802 comparing with repo2
803 searching for changes
803 searching for changes
804 @ changeset: 34:fea3ac5810e0
804 @ changeset: 34:fea3ac5810e0
805 | tag: tip
805 | tag: tip
806 | parent: 32:d06dffa21a31
806 | parent: 32:d06dffa21a31
807 | user: test
807 | user: test
808 | date: Thu Jan 01 00:00:34 1970 +0000
808 | date: Thu Jan 01 00:00:34 1970 +0000
809 | summary: (34) head
809 | summary: (34) head
810 |
810 |
811 | o changeset: 33:68608f5145f9
811 | o changeset: 33:68608f5145f9
812 | parent: 18:1aa84d96232a
812 | parent: 18:1aa84d96232a
813 | user: test
813 | user: test
814 | date: Thu Jan 01 00:00:33 1970 +0000
814 | date: Thu Jan 01 00:00:33 1970 +0000
815 | summary: (33) head
815 | summary: (33) head
816 |
816 |
817 o changeset: 32:d06dffa21a31
817 o changeset: 32:d06dffa21a31
818 | parent: 27:886ed638191b
818 | parent: 27:886ed638191b
819 | parent: 31:621d83e11f67
819 | parent: 31:621d83e11f67
820 | user: test
820 | user: test
821 | date: Thu Jan 01 00:00:32 1970 +0000
821 | date: Thu Jan 01 00:00:32 1970 +0000
822 | summary: (32) expand
822 | summary: (32) expand
823 |
823 |
824 o changeset: 27:886ed638191b
824 o changeset: 27:886ed638191b
825 parent: 21:d42a756af44d
825 parent: 21:d42a756af44d
826 user: test
826 user: test
827 date: Thu Jan 01 00:00:27 1970 +0000
827 date: Thu Jan 01 00:00:27 1970 +0000
828 summary: (27) collapse
828 summary: (27) collapse
829
829
830
830
831 File + limit with revs != cset revs:
831 File + limit with revs != cset revs:
832 $ cd repo
832 $ cd repo
833 $ touch b
833 $ touch b
834 $ hg ci -Aqm0
834 $ hg ci -Aqm0
835 $ hg glog -l2 a
835 $ hg glog -l2 a
836 o changeset: 34:fea3ac5810e0
836 o changeset: 34:fea3ac5810e0
837 | parent: 32:d06dffa21a31
837 | parent: 32:d06dffa21a31
838 | user: test
838 | user: test
839 | date: Thu Jan 01 00:00:34 1970 +0000
839 | date: Thu Jan 01 00:00:34 1970 +0000
840 | summary: (34) head
840 | summary: (34) head
841 |
841 |
842 | o changeset: 33:68608f5145f9
842 | o changeset: 33:68608f5145f9
843 | | parent: 18:1aa84d96232a
843 | | parent: 18:1aa84d96232a
844 | | user: test
844 | | user: test
845 | | date: Thu Jan 01 00:00:33 1970 +0000
845 | | date: Thu Jan 01 00:00:33 1970 +0000
846 | | summary: (33) head
846 | | summary: (33) head
847 | |
847 | |
848
848
849 File + limit + -ra:b, (b - a) < limit:
849 File + limit + -ra:b, (b - a) < limit:
850 $ hg glog -l3000 -r32:tip a
850 $ hg glog -l3000 -r32:tip a
851 o changeset: 34:fea3ac5810e0
851 o changeset: 34:fea3ac5810e0
852 | parent: 32:d06dffa21a31
852 | parent: 32:d06dffa21a31
853 | user: test
853 | user: test
854 | date: Thu Jan 01 00:00:34 1970 +0000
854 | date: Thu Jan 01 00:00:34 1970 +0000
855 | summary: (34) head
855 | summary: (34) head
856 |
856 |
857 | o changeset: 33:68608f5145f9
857 | o changeset: 33:68608f5145f9
858 | | parent: 18:1aa84d96232a
858 | | parent: 18:1aa84d96232a
859 | | user: test
859 | | user: test
860 | | date: Thu Jan 01 00:00:33 1970 +0000
860 | | date: Thu Jan 01 00:00:33 1970 +0000
861 | | summary: (33) head
861 | | summary: (33) head
862 | |
862 | |
863 o | changeset: 32:d06dffa21a31
863 o | changeset: 32:d06dffa21a31
864 |\ \ parent: 27:886ed638191b
864 |\ \ parent: 27:886ed638191b
865 | | | parent: 31:621d83e11f67
865 | | | parent: 31:621d83e11f67
866 | | | user: test
866 | | | user: test
867 | | | date: Thu Jan 01 00:00:32 1970 +0000
867 | | | date: Thu Jan 01 00:00:32 1970 +0000
868 | | | summary: (32) expand
868 | | | summary: (32) expand
869 | | |
869 | | |
870
870
871 File + limit + -ra:b, b < tip:
871 File + limit + -ra:b, b < tip:
872 $ hg glog -l1 -r32:34 a
872 $ hg glog -l1 -r32:34 a
873 o changeset: 34:fea3ac5810e0
873 o changeset: 34:fea3ac5810e0
874 | parent: 32:d06dffa21a31
874 | parent: 32:d06dffa21a31
875 | user: test
875 | user: test
876 | date: Thu Jan 01 00:00:34 1970 +0000
876 | date: Thu Jan 01 00:00:34 1970 +0000
877 | summary: (34) head
877 | summary: (34) head
878 |
878 |
879
879
880 File + limit + -ra:b, b < tip, (b - a) < limit:
880 File + limit + -ra:b, b < tip, (b - a) < limit:
881 $ hg glog -l10 -r33:34 a
881 $ hg glog -l10 -r33:34 a
882 o changeset: 34:fea3ac5810e0
882 o changeset: 34:fea3ac5810e0
883 | parent: 32:d06dffa21a31
883 | parent: 32:d06dffa21a31
884 | user: test
884 | user: test
885 | date: Thu Jan 01 00:00:34 1970 +0000
885 | date: Thu Jan 01 00:00:34 1970 +0000
886 | summary: (34) head
886 | summary: (34) head
887 |
887 |
888 | o changeset: 33:68608f5145f9
888 | o changeset: 33:68608f5145f9
889 | | parent: 18:1aa84d96232a
889 | | parent: 18:1aa84d96232a
890 | | user: test
890 | | user: test
891 | | date: Thu Jan 01 00:00:33 1970 +0000
891 | | date: Thu Jan 01 00:00:33 1970 +0000
892 | | summary: (33) head
892 | | summary: (33) head
893 | |
893 | |
894
894
895 Do not crash or produce strange graphs if history is buggy
895 Do not crash or produce strange graphs if history is buggy
896
896
897 $ commit 36 "buggy merge: identical parents" 35 35
897 $ commit 36 "buggy merge: identical parents" 35 35
898 $ hg glog -l5
898 $ hg glog -l5
899 @ changeset: 36:95fa8febd08a
899 @ changeset: 36:95fa8febd08a
900 | tag: tip
900 | tag: tip
901 | parent: 35:9159c3644c5e
901 | parent: 35:9159c3644c5e
902 | parent: 35:9159c3644c5e
902 | parent: 35:9159c3644c5e
903 | user: test
903 | user: test
904 | date: Thu Jan 01 00:00:36 1970 +0000
904 | date: Thu Jan 01 00:00:36 1970 +0000
905 | summary: (36) buggy merge: identical parents
905 | summary: (36) buggy merge: identical parents
906 |
906 |
907 o changeset: 35:9159c3644c5e
907 o changeset: 35:9159c3644c5e
908 | user: test
908 | user: test
909 | date: Thu Jan 01 00:00:00 1970 +0000
909 | date: Thu Jan 01 00:00:00 1970 +0000
910 | summary: 0
910 | summary: 0
911 |
911 |
912 o changeset: 34:fea3ac5810e0
912 o changeset: 34:fea3ac5810e0
913 | parent: 32:d06dffa21a31
913 | parent: 32:d06dffa21a31
914 | user: test
914 | user: test
915 | date: Thu Jan 01 00:00:34 1970 +0000
915 | date: Thu Jan 01 00:00:34 1970 +0000
916 | summary: (34) head
916 | summary: (34) head
917 |
917 |
918 | o changeset: 33:68608f5145f9
918 | o changeset: 33:68608f5145f9
919 | | parent: 18:1aa84d96232a
919 | | parent: 18:1aa84d96232a
920 | | user: test
920 | | user: test
921 | | date: Thu Jan 01 00:00:33 1970 +0000
921 | | date: Thu Jan 01 00:00:33 1970 +0000
922 | | summary: (33) head
922 | | summary: (33) head
923 | |
923 | |
924 o | changeset: 32:d06dffa21a31
924 o | changeset: 32:d06dffa21a31
925 |\ \ parent: 27:886ed638191b
925 |\ \ parent: 27:886ed638191b
926 | | | parent: 31:621d83e11f67
926 | | | parent: 31:621d83e11f67
927 | | | user: test
927 | | | user: test
928 | | | date: Thu Jan 01 00:00:32 1970 +0000
928 | | | date: Thu Jan 01 00:00:32 1970 +0000
929 | | | summary: (32) expand
929 | | | summary: (32) expand
930 | | |
930 | | |
General Comments 0
You need to be logged in to leave comments. Login now