##// END OF EJS Templates
graphlog: don't truncate template value at last \n...
Mads Kiilerich -
r17120:01d847e0 default
parent child Browse files
Show More
@@ -1,592 +1,594 b''
1 1 # ASCII graph log extension for Mercurial
2 2 #
3 3 # Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 '''command to view revision graphs from a shell
9 9
10 10 This extension adds a --graph option to the incoming, outgoing and log
11 11 commands. When this options is given, an ASCII representation of the
12 12 revision graph is also shown.
13 13 '''
14 14
15 15 from mercurial.cmdutil import show_changeset
16 16 from mercurial.i18n import _
17 17 from mercurial.node import nullrev
18 18 from mercurial import cmdutil, commands, extensions, scmutil
19 19 from mercurial import hg, util, graphmod, templatekw, revset
20 20
21 21 cmdtable = {}
22 22 command = cmdutil.command(cmdtable)
23 23 testedwith = 'internal'
24 24
25 25 ASCIIDATA = 'ASC'
26 26
27 27 def asciiedges(type, char, lines, seen, rev, parents):
28 28 """adds edge info to changelog DAG walk suitable for ascii()"""
29 29 if rev not in seen:
30 30 seen.append(rev)
31 31 nodeidx = seen.index(rev)
32 32
33 33 knownparents = []
34 34 newparents = []
35 35 for parent in parents:
36 36 if parent in seen:
37 37 knownparents.append(parent)
38 38 else:
39 39 newparents.append(parent)
40 40
41 41 ncols = len(seen)
42 42 nextseen = seen[:]
43 43 nextseen[nodeidx:nodeidx + 1] = newparents
44 44 edges = [(nodeidx, nextseen.index(p)) for p in knownparents]
45 45
46 46 while len(newparents) > 2:
47 47 # ascii() only knows how to add or remove a single column between two
48 48 # calls. Nodes with more than two parents break this constraint so we
49 49 # introduce intermediate expansion lines to grow the active node list
50 50 # slowly.
51 51 edges.append((nodeidx, nodeidx))
52 52 edges.append((nodeidx, nodeidx + 1))
53 53 nmorecols = 1
54 54 yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
55 55 char = '\\'
56 56 lines = []
57 57 nodeidx += 1
58 58 ncols += 1
59 59 edges = []
60 60 del newparents[0]
61 61
62 62 if len(newparents) > 0:
63 63 edges.append((nodeidx, nodeidx))
64 64 if len(newparents) > 1:
65 65 edges.append((nodeidx, nodeidx + 1))
66 66 nmorecols = len(nextseen) - ncols
67 67 seen[:] = nextseen
68 68 yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
69 69
70 70 def fix_long_right_edges(edges):
71 71 for (i, (start, end)) in enumerate(edges):
72 72 if end > start:
73 73 edges[i] = (start, end + 1)
74 74
75 75 def get_nodeline_edges_tail(
76 76 node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
77 77 if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
78 78 # Still going in the same non-vertical direction.
79 79 if n_columns_diff == -1:
80 80 start = max(node_index + 1, p_node_index)
81 81 tail = ["|", " "] * (start - node_index - 1)
82 82 tail.extend(["/", " "] * (n_columns - start))
83 83 return tail
84 84 else:
85 85 return ["\\", " "] * (n_columns - node_index - 1)
86 86 else:
87 87 return ["|", " "] * (n_columns - node_index - 1)
88 88
89 89 def draw_edges(edges, nodeline, interline):
90 90 for (start, end) in edges:
91 91 if start == end + 1:
92 92 interline[2 * end + 1] = "/"
93 93 elif start == end - 1:
94 94 interline[2 * start + 1] = "\\"
95 95 elif start == end:
96 96 interline[2 * start] = "|"
97 97 else:
98 98 if 2 * end >= len(nodeline):
99 99 continue
100 100 nodeline[2 * end] = "+"
101 101 if start > end:
102 102 (start, end) = (end, start)
103 103 for i in range(2 * start + 1, 2 * end):
104 104 if nodeline[i] != "+":
105 105 nodeline[i] = "-"
106 106
107 107 def get_padding_line(ni, n_columns, edges):
108 108 line = []
109 109 line.extend(["|", " "] * ni)
110 110 if (ni, ni - 1) in edges or (ni, ni) in edges:
111 111 # (ni, ni - 1) (ni, ni)
112 112 # | | | | | | | |
113 113 # +---o | | o---+
114 114 # | | c | | c | |
115 115 # | |/ / | |/ /
116 116 # | | | | | |
117 117 c = "|"
118 118 else:
119 119 c = " "
120 120 line.extend([c, " "])
121 121 line.extend(["|", " "] * (n_columns - ni - 1))
122 122 return line
123 123
124 124 def asciistate():
125 125 """returns the initial value for the "state" argument to ascii()"""
126 126 return [0, 0]
127 127
128 128 def ascii(ui, state, type, char, text, coldata):
129 129 """prints an ASCII graph of the DAG
130 130
131 131 takes the following arguments (one call per node in the graph):
132 132
133 133 - ui to write to
134 134 - Somewhere to keep the needed state in (init to asciistate())
135 135 - Column of the current node in the set of ongoing edges.
136 136 - Type indicator of node data == ASCIIDATA.
137 137 - Payload: (char, lines):
138 138 - Character to use as node's symbol.
139 139 - List of lines to display as the node's text.
140 140 - Edges; a list of (col, next_col) indicating the edges between
141 141 the current node and its parents.
142 142 - Number of columns (ongoing edges) in the current revision.
143 143 - The difference between the number of columns (ongoing edges)
144 144 in the next revision and the number of columns (ongoing edges)
145 145 in the current revision. That is: -1 means one column removed;
146 146 0 means no columns added or removed; 1 means one column added.
147 147 """
148 148
149 149 idx, edges, ncols, coldiff = coldata
150 150 assert -2 < coldiff < 2
151 151 if coldiff == -1:
152 152 # Transform
153 153 #
154 154 # | | | | | |
155 155 # o | | into o---+
156 156 # |X / |/ /
157 157 # | | | |
158 158 fix_long_right_edges(edges)
159 159
160 160 # add_padding_line says whether to rewrite
161 161 #
162 162 # | | | | | | | |
163 163 # | o---+ into | o---+
164 164 # | / / | | | # <--- padding line
165 165 # o | | | / /
166 166 # o | |
167 167 add_padding_line = (len(text) > 2 and coldiff == -1 and
168 168 [x for (x, y) in edges if x + 1 < y])
169 169
170 170 # fix_nodeline_tail says whether to rewrite
171 171 #
172 172 # | | o | | | | o | |
173 173 # | | |/ / | | |/ /
174 174 # | o | | into | o / / # <--- fixed nodeline tail
175 175 # | |/ / | |/ /
176 176 # o | | o | |
177 177 fix_nodeline_tail = len(text) <= 2 and not add_padding_line
178 178
179 179 # nodeline is the line containing the node character (typically o)
180 180 nodeline = ["|", " "] * idx
181 181 nodeline.extend([char, " "])
182 182
183 183 nodeline.extend(
184 184 get_nodeline_edges_tail(idx, state[1], ncols, coldiff,
185 185 state[0], fix_nodeline_tail))
186 186
187 187 # shift_interline is the line containing the non-vertical
188 188 # edges between this entry and the next
189 189 shift_interline = ["|", " "] * idx
190 190 if coldiff == -1:
191 191 n_spaces = 1
192 192 edge_ch = "/"
193 193 elif coldiff == 0:
194 194 n_spaces = 2
195 195 edge_ch = "|"
196 196 else:
197 197 n_spaces = 3
198 198 edge_ch = "\\"
199 199 shift_interline.extend(n_spaces * [" "])
200 200 shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
201 201
202 202 # draw edges from the current node to its parents
203 203 draw_edges(edges, nodeline, shift_interline)
204 204
205 205 # lines is the list of all graph lines to print
206 206 lines = [nodeline]
207 207 if add_padding_line:
208 208 lines.append(get_padding_line(idx, ncols, edges))
209 209 lines.append(shift_interline)
210 210
211 211 # make sure that there are as many graph lines as there are
212 212 # log strings
213 213 while len(text) < len(lines):
214 214 text.append("")
215 215 if len(lines) < len(text):
216 216 extra_interline = ["|", " "] * (ncols + coldiff)
217 217 while len(lines) < len(text):
218 218 lines.append(extra_interline)
219 219
220 220 # print lines
221 221 indentation_level = max(ncols, ncols + coldiff)
222 222 for (line, logstr) in zip(lines, text):
223 223 ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr)
224 224 ui.write(ln.rstrip() + '\n')
225 225
226 226 # ... and start over
227 227 state[0] = coldiff
228 228 state[1] = idx
229 229
230 230 def get_revs(repo, rev_opt):
231 231 if rev_opt:
232 232 revs = scmutil.revrange(repo, rev_opt)
233 233 if len(revs) == 0:
234 234 return (nullrev, nullrev)
235 235 return (max(revs), min(revs))
236 236 else:
237 237 return (len(repo) - 1, 0)
238 238
239 239 def check_unsupported_flags(pats, opts):
240 240 for op in ["newest_first"]:
241 241 if op in opts and opts[op]:
242 242 raise util.Abort(_("-G/--graph option is incompatible with --%s")
243 243 % op.replace("_", "-"))
244 244
245 245 def _makefilematcher(repo, pats, followfirst):
246 246 # When displaying a revision with --patch --follow FILE, we have
247 247 # to know which file of the revision must be diffed. With
248 248 # --follow, we want the names of the ancestors of FILE in the
249 249 # revision, stored in "fcache". "fcache" is populated by
250 250 # reproducing the graph traversal already done by --follow revset
251 251 # and relating linkrevs to file names (which is not "correct" but
252 252 # good enough).
253 253 fcache = {}
254 254 fcacheready = [False]
255 255 pctx = repo['.']
256 256 wctx = repo[None]
257 257
258 258 def populate():
259 259 for fn in pats:
260 260 for i in ((pctx[fn],), pctx[fn].ancestors(followfirst=followfirst)):
261 261 for c in i:
262 262 fcache.setdefault(c.linkrev(), set()).add(c.path())
263 263
264 264 def filematcher(rev):
265 265 if not fcacheready[0]:
266 266 # Lazy initialization
267 267 fcacheready[0] = True
268 268 populate()
269 269 return scmutil.match(wctx, fcache.get(rev, []), default='path')
270 270
271 271 return filematcher
272 272
273 273 def _makelogrevset(repo, pats, opts, revs):
274 274 """Return (expr, filematcher) where expr is a revset string built
275 275 from log options and file patterns or None. If --stat or --patch
276 276 are not passed filematcher is None. Otherwise it is a callable
277 277 taking a revision number and returning a match objects filtering
278 278 the files to be detailed when displaying the revision.
279 279 """
280 280 opt2revset = {
281 281 'no_merges': ('not merge()', None),
282 282 'only_merges': ('merge()', None),
283 283 '_ancestors': ('ancestors(%(val)s)', None),
284 284 '_fancestors': ('_firstancestors(%(val)s)', None),
285 285 '_descendants': ('descendants(%(val)s)', None),
286 286 '_fdescendants': ('_firstdescendants(%(val)s)', None),
287 287 '_matchfiles': ('_matchfiles(%(val)s)', None),
288 288 'date': ('date(%(val)r)', None),
289 289 'branch': ('branch(%(val)r)', ' or '),
290 290 '_patslog': ('filelog(%(val)r)', ' or '),
291 291 '_patsfollow': ('follow(%(val)r)', ' or '),
292 292 '_patsfollowfirst': ('_followfirst(%(val)r)', ' or '),
293 293 'keyword': ('keyword(%(val)r)', ' or '),
294 294 'prune': ('not (%(val)r or ancestors(%(val)r))', ' and '),
295 295 'user': ('user(%(val)r)', ' or '),
296 296 }
297 297
298 298 opts = dict(opts)
299 299 # follow or not follow?
300 300 follow = opts.get('follow') or opts.get('follow_first')
301 301 followfirst = opts.get('follow_first') and 1 or 0
302 302 # --follow with FILE behaviour depends on revs...
303 303 startrev = revs[0]
304 304 followdescendants = (len(revs) > 1 and revs[0] < revs[1]) and 1 or 0
305 305
306 306 # branch and only_branch are really aliases and must be handled at
307 307 # the same time
308 308 opts['branch'] = opts.get('branch', []) + opts.get('only_branch', [])
309 309 opts['branch'] = [repo.lookupbranch(b) for b in opts['branch']]
310 310 # pats/include/exclude are passed to match.match() directly in
311 311 # _matchfile() revset but walkchangerevs() builds its matcher with
312 312 # scmutil.match(). The difference is input pats are globbed on
313 313 # platforms without shell expansion (windows).
314 314 pctx = repo[None]
315 315 match, pats = scmutil.matchandpats(pctx, pats, opts)
316 316 slowpath = match.anypats() or (match.files() and opts.get('removed'))
317 317 if not slowpath:
318 318 for f in match.files():
319 319 if follow and f not in pctx:
320 320 raise util.Abort(_('cannot follow file not in parent '
321 321 'revision: "%s"') % f)
322 322 filelog = repo.file(f)
323 323 if not len(filelog):
324 324 # A zero count may be a directory or deleted file, so
325 325 # try to find matching entries on the slow path.
326 326 if follow:
327 327 raise util.Abort(
328 328 _('cannot follow nonexistent file: "%s"') % f)
329 329 slowpath = True
330 330 if slowpath:
331 331 # See cmdutil.walkchangerevs() slow path.
332 332 #
333 333 if follow:
334 334 raise util.Abort(_('can only follow copies/renames for explicit '
335 335 'filenames'))
336 336 # pats/include/exclude cannot be represented as separate
337 337 # revset expressions as their filtering logic applies at file
338 338 # level. For instance "-I a -X a" matches a revision touching
339 339 # "a" and "b" while "file(a) and not file(b)" does
340 340 # not. Besides, filesets are evaluated against the working
341 341 # directory.
342 342 matchargs = ['r:', 'd:relpath']
343 343 for p in pats:
344 344 matchargs.append('p:' + p)
345 345 for p in opts.get('include', []):
346 346 matchargs.append('i:' + p)
347 347 for p in opts.get('exclude', []):
348 348 matchargs.append('x:' + p)
349 349 matchargs = ','.join(('%r' % p) for p in matchargs)
350 350 opts['_matchfiles'] = matchargs
351 351 else:
352 352 if follow:
353 353 fpats = ('_patsfollow', '_patsfollowfirst')
354 354 fnopats = (('_ancestors', '_fancestors'),
355 355 ('_descendants', '_fdescendants'))
356 356 if pats:
357 357 # follow() revset inteprets its file argument as a
358 358 # manifest entry, so use match.files(), not pats.
359 359 opts[fpats[followfirst]] = list(match.files())
360 360 else:
361 361 opts[fnopats[followdescendants][followfirst]] = str(startrev)
362 362 else:
363 363 opts['_patslog'] = list(pats)
364 364
365 365 filematcher = None
366 366 if opts.get('patch') or opts.get('stat'):
367 367 if follow:
368 368 filematcher = _makefilematcher(repo, pats, followfirst)
369 369 else:
370 370 filematcher = lambda rev: match
371 371
372 372 expr = []
373 373 for op, val in opts.iteritems():
374 374 if not val:
375 375 continue
376 376 if op not in opt2revset:
377 377 continue
378 378 revop, andor = opt2revset[op]
379 379 if '%(val)' not in revop:
380 380 expr.append(revop)
381 381 else:
382 382 if not isinstance(val, list):
383 383 e = revop % {'val': val}
384 384 else:
385 385 e = '(' + andor.join((revop % {'val': v}) for v in val) + ')'
386 386 expr.append(e)
387 387
388 388 if expr:
389 389 expr = '(' + ' and '.join(expr) + ')'
390 390 else:
391 391 expr = None
392 392 return expr, filematcher
393 393
394 394 def getlogrevs(repo, pats, opts):
395 395 """Return (revs, expr, filematcher) where revs is an iterable of
396 396 revision numbers, expr is a revset string built from log options
397 397 and file patterns or None, and used to filter 'revs'. If --stat or
398 398 --patch are not passed filematcher is None. Otherwise it is a
399 399 callable taking a revision number and returning a match objects
400 400 filtering the files to be detailed when displaying the revision.
401 401 """
402 402 def increasingrevs(repo, revs, matcher):
403 403 # The sorted input rev sequence is chopped in sub-sequences
404 404 # which are sorted in ascending order and passed to the
405 405 # matcher. The filtered revs are sorted again as they were in
406 406 # the original sub-sequence. This achieve several things:
407 407 #
408 408 # - getlogrevs() now returns a generator which behaviour is
409 409 # adapted to log need. First results come fast, last ones
410 410 # are batched for performances.
411 411 #
412 412 # - revset matchers often operate faster on revision in
413 413 # changelog order, because most filters deal with the
414 414 # changelog.
415 415 #
416 416 # - revset matchers can reorder revisions. "A or B" typically
417 417 # returns returns the revision matching A then the revision
418 418 # matching B. We want to hide this internal implementation
419 419 # detail from the caller, and sorting the filtered revision
420 420 # again achieves this.
421 421 for i, window in cmdutil.increasingwindows(0, len(revs), windowsize=1):
422 422 orevs = revs[i:i + window]
423 423 nrevs = set(matcher(repo, sorted(orevs)))
424 424 for rev in orevs:
425 425 if rev in nrevs:
426 426 yield rev
427 427
428 428 if not len(repo):
429 429 return iter([]), None, None
430 430 # Default --rev value depends on --follow but --follow behaviour
431 431 # depends on revisions resolved from --rev...
432 432 follow = opts.get('follow') or opts.get('follow_first')
433 433 if opts.get('rev'):
434 434 revs = scmutil.revrange(repo, opts['rev'])
435 435 else:
436 436 if follow and len(repo) > 0:
437 437 revs = scmutil.revrange(repo, ['.:0'])
438 438 else:
439 439 revs = range(len(repo) - 1, -1, -1)
440 440 if not revs:
441 441 return iter([]), None, None
442 442 expr, filematcher = _makelogrevset(repo, pats, opts, revs)
443 443 if expr:
444 444 matcher = revset.match(repo.ui, expr)
445 445 revs = increasingrevs(repo, revs, matcher)
446 446 if not opts.get('hidden'):
447 447 # --hidden is still experimental and not worth a dedicated revset
448 448 # yet. Fortunately, filtering revision number is fast.
449 449 revs = (r for r in revs if r not in repo.changelog.hiddenrevs)
450 450 else:
451 451 revs = iter(revs)
452 452 return revs, expr, filematcher
453 453
454 454 def generate(ui, dag, displayer, showparents, edgefn, getrenamed=None,
455 455 filematcher=None):
456 456 seen, state = [], asciistate()
457 457 for rev, type, ctx, parents in dag:
458 458 char = 'o'
459 459 if ctx.node() in showparents:
460 460 char = '@'
461 461 elif ctx.obsolete():
462 462 char = 'x'
463 463 copies = None
464 464 if getrenamed and ctx.rev():
465 465 copies = []
466 466 for fn in ctx.files():
467 467 rename = getrenamed(fn, ctx.rev())
468 468 if rename:
469 469 copies.append((fn, rename[0]))
470 470 revmatchfn = None
471 471 if filematcher is not None:
472 472 revmatchfn = filematcher(ctx.rev())
473 473 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
474 lines = displayer.hunk.pop(rev).split('\n')[:-1]
474 lines = displayer.hunk.pop(rev).split('\n')
475 if not lines[-1]:
476 del lines[-1]
475 477 displayer.flush(rev)
476 478 edges = edgefn(type, char, lines, seen, rev, parents)
477 479 for type, char, lines, coldata in edges:
478 480 ascii(ui, state, type, char, lines, coldata)
479 481 displayer.close()
480 482
481 483 @command('glog',
482 484 [('f', 'follow', None,
483 485 _('follow changeset history, or file history across copies and renames')),
484 486 ('', 'follow-first', None,
485 487 _('only follow the first parent of merge changesets (DEPRECATED)')),
486 488 ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
487 489 ('C', 'copies', None, _('show copied files')),
488 490 ('k', 'keyword', [],
489 491 _('do case-insensitive search for a given text'), _('TEXT')),
490 492 ('r', 'rev', [], _('show the specified revision or range'), _('REV')),
491 493 ('', 'removed', None, _('include revisions where files were removed')),
492 494 ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
493 495 ('u', 'user', [], _('revisions committed by user'), _('USER')),
494 496 ('', 'only-branch', [],
495 497 _('show only changesets within the given named branch (DEPRECATED)'),
496 498 _('BRANCH')),
497 499 ('b', 'branch', [],
498 500 _('show changesets within the given named branch'), _('BRANCH')),
499 501 ('P', 'prune', [],
500 502 _('do not display revision or any of its ancestors'), _('REV')),
501 503 ('', 'hidden', False, _('show hidden changesets (DEPRECATED)')),
502 504 ] + commands.logopts + commands.walkopts,
503 505 _('[OPTION]... [FILE]'))
504 506 def graphlog(ui, repo, *pats, **opts):
505 507 """show revision history alongside an ASCII revision graph
506 508
507 509 Print a revision history alongside a revision graph drawn with
508 510 ASCII characters.
509 511
510 512 Nodes printed as an @ character are parents of the working
511 513 directory.
512 514 """
513 515
514 516 revs, expr, filematcher = getlogrevs(repo, pats, opts)
515 517 revs = sorted(revs, reverse=1)
516 518 limit = cmdutil.loglimit(opts)
517 519 if limit is not None:
518 520 revs = revs[:limit]
519 521 revdag = graphmod.dagwalker(repo, revs)
520 522
521 523 getrenamed = None
522 524 if opts.get('copies'):
523 525 endrev = None
524 526 if opts.get('rev'):
525 527 endrev = max(scmutil.revrange(repo, opts.get('rev'))) + 1
526 528 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
527 529 displayer = show_changeset(ui, repo, opts, buffered=True)
528 530 showparents = [ctx.node() for ctx in repo[None].parents()]
529 531 generate(ui, revdag, displayer, showparents, asciiedges, getrenamed,
530 532 filematcher)
531 533
532 534 def graphrevs(repo, nodes, opts):
533 535 limit = cmdutil.loglimit(opts)
534 536 nodes.reverse()
535 537 if limit is not None:
536 538 nodes = nodes[:limit]
537 539 return graphmod.nodes(repo, nodes)
538 540
539 541 def goutgoing(ui, repo, dest=None, **opts):
540 542 """show the outgoing changesets alongside an ASCII revision graph
541 543
542 544 Print the outgoing changesets alongside a revision graph drawn with
543 545 ASCII characters.
544 546
545 547 Nodes printed as an @ character are parents of the working
546 548 directory.
547 549 """
548 550
549 551 check_unsupported_flags([], opts)
550 552 o = hg._outgoing(ui, repo, dest, opts)
551 553 if o is None:
552 554 return
553 555
554 556 revdag = graphrevs(repo, o, opts)
555 557 displayer = show_changeset(ui, repo, opts, buffered=True)
556 558 showparents = [ctx.node() for ctx in repo[None].parents()]
557 559 generate(ui, revdag, displayer, showparents, asciiedges)
558 560
559 561 def gincoming(ui, repo, source="default", **opts):
560 562 """show the incoming changesets alongside an ASCII revision graph
561 563
562 564 Print the incoming changesets alongside a revision graph drawn with
563 565 ASCII characters.
564 566
565 567 Nodes printed as an @ character are parents of the working
566 568 directory.
567 569 """
568 570 def subreporecurse():
569 571 return 1
570 572
571 573 check_unsupported_flags([], opts)
572 574 def display(other, chlist, displayer):
573 575 revdag = graphrevs(other, chlist, opts)
574 576 showparents = [ctx.node() for ctx in repo[None].parents()]
575 577 generate(ui, revdag, displayer, showparents, asciiedges)
576 578
577 579 hg._incoming(display, subreporecurse, ui, repo, source, opts, buffered=True)
578 580
579 581 def uisetup(ui):
580 582 '''Initialize the extension.'''
581 583 _wrapcmd('log', commands.table, graphlog)
582 584 _wrapcmd('incoming', commands.table, gincoming)
583 585 _wrapcmd('outgoing', commands.table, goutgoing)
584 586
585 587 def _wrapcmd(cmd, table, wrapfn):
586 588 '''wrap the command'''
587 589 def graph(orig, *args, **kwargs):
588 590 if kwargs['graph']:
589 591 return wrapfn(*args, **kwargs)
590 592 return orig(*args, **kwargs)
591 593 entry = extensions.wrapcommand(table, cmd, graph)
592 594 entry[1].append(('G', 'graph', None, _("show the revision DAG")))
@@ -1,2063 +1,2089 b''
1 1 @ (34) head
2 2 |
3 3 | o (33) head
4 4 | |
5 5 o | (32) expand
6 6 |\ \
7 7 | o \ (31) expand
8 8 | |\ \
9 9 | | o \ (30) expand
10 10 | | |\ \
11 11 | | | o | (29) regular commit
12 12 | | | | |
13 13 | | o | | (28) merge zero known
14 14 | | |\ \ \
15 15 o | | | | | (27) collapse
16 16 |/ / / / /
17 17 | | o---+ (26) merge one known; far right
18 18 | | | | |
19 19 +---o | | (25) merge one known; far left
20 20 | | | | |
21 21 | | o | | (24) merge one known; immediate right
22 22 | | |\| |
23 23 | | o | | (23) merge one known; immediate left
24 24 | |/| | |
25 25 +---o---+ (22) merge two known; one far left, one far right
26 26 | | / /
27 27 o | | | (21) expand
28 28 |\ \ \ \
29 29 | o---+-+ (20) merge two known; two far right
30 30 | / / /
31 31 o | | | (19) expand
32 32 |\ \ \ \
33 33 +---+---o (18) merge two known; two far left
34 34 | | | |
35 35 | o | | (17) expand
36 36 | |\ \ \
37 37 | | o---+ (16) merge two known; one immediate right, one near right
38 38 | | |/ /
39 39 o | | | (15) expand
40 40 |\ \ \ \
41 41 | o-----+ (14) merge two known; one immediate right, one far right
42 42 | |/ / /
43 43 o | | | (13) expand
44 44 |\ \ \ \
45 45 +---o | | (12) merge two known; one immediate right, one far left
46 46 | | |/ /
47 47 | o | | (11) expand
48 48 | |\ \ \
49 49 | | o---+ (10) merge two known; one immediate left, one near right
50 50 | |/ / /
51 51 o | | | (9) expand
52 52 |\ \ \ \
53 53 | o-----+ (8) merge two known; one immediate left, one far right
54 54 |/ / / /
55 55 o | | | (7) expand
56 56 |\ \ \ \
57 57 +---o | | (6) merge two known; one immediate left, one far left
58 58 | |/ / /
59 59 | o | | (5) expand
60 60 | |\ \ \
61 61 | | o | | (4) merge two known; one immediate left, one immediate right
62 62 | |/|/ /
63 63 | o / / (3) collapse
64 64 |/ / /
65 65 o / / (2) collapse
66 66 |/ /
67 67 o / (1) collapse
68 68 |/
69 69 o (0) root
70 70
71 71
72 72 $ commit()
73 73 > {
74 74 > rev=$1
75 75 > msg=$2
76 76 > shift 2
77 77 > if [ "$#" -gt 0 ]; then
78 78 > hg debugsetparents "$@"
79 79 > fi
80 80 > echo $rev > a
81 81 > hg commit -Aqd "$rev 0" -m "($rev) $msg"
82 82 > }
83 83
84 84 $ cat > printrevset.py <<EOF
85 85 > from mercurial import extensions, revset, commands
86 86 > from hgext import graphlog
87 87 >
88 88 > def uisetup(ui):
89 89 > def printrevset(orig, ui, repo, *pats, **opts):
90 90 > if opts.get('print_revset'):
91 91 > expr = graphlog.getlogrevs(repo, pats, opts)[1]
92 92 > if expr:
93 93 > tree = revset.parse(expr)[0]
94 94 > else:
95 95 > tree = []
96 96 > ui.write('%r\n' % (opts.get('rev', []),))
97 97 > ui.write(revset.prettyformat(tree) + '\n')
98 98 > return 0
99 99 > return orig(ui, repo, *pats, **opts)
100 100 > entry = extensions.wrapcommand(commands.table, 'log', printrevset)
101 101 > entry[1].append(('', 'print-revset', False,
102 102 > 'print generated revset and exit (DEPRECATED)'))
103 103 > EOF
104 104
105 105 $ echo "[extensions]" >> $HGRCPATH
106 106 $ echo "graphlog=" >> $HGRCPATH
107 107 $ echo "printrevset=`pwd`/printrevset.py" >> $HGRCPATH
108 108
109 109 $ hg init repo
110 110 $ cd repo
111 111
112 112 Empty repo:
113 113
114 114 $ hg glog
115 115
116 116
117 117 Building DAG:
118 118
119 119 $ commit 0 "root"
120 120 $ commit 1 "collapse" 0
121 121 $ commit 2 "collapse" 1
122 122 $ commit 3 "collapse" 2
123 123 $ commit 4 "merge two known; one immediate left, one immediate right" 1 3
124 124 $ commit 5 "expand" 3 4
125 125 $ commit 6 "merge two known; one immediate left, one far left" 2 5
126 126 $ commit 7 "expand" 2 5
127 127 $ commit 8 "merge two known; one immediate left, one far right" 0 7
128 128 $ commit 9 "expand" 7 8
129 129 $ commit 10 "merge two known; one immediate left, one near right" 0 6
130 130 $ commit 11 "expand" 6 10
131 131 $ commit 12 "merge two known; one immediate right, one far left" 1 9
132 132 $ commit 13 "expand" 9 11
133 133 $ commit 14 "merge two known; one immediate right, one far right" 0 12
134 134 $ commit 15 "expand" 13 14
135 135 $ commit 16 "merge two known; one immediate right, one near right" 0 1
136 136 $ commit 17 "expand" 12 16
137 137 $ commit 18 "merge two known; two far left" 1 15
138 138 $ commit 19 "expand" 15 17
139 139 $ commit 20 "merge two known; two far right" 0 18
140 140 $ commit 21 "expand" 19 20
141 141 $ commit 22 "merge two known; one far left, one far right" 18 21
142 142 $ commit 23 "merge one known; immediate left" 1 22
143 143 $ commit 24 "merge one known; immediate right" 0 23
144 144 $ commit 25 "merge one known; far left" 21 24
145 145 $ commit 26 "merge one known; far right" 18 25
146 146 $ commit 27 "collapse" 21
147 147 $ commit 28 "merge zero known" 1 26
148 148 $ commit 29 "regular commit" 0
149 149 $ commit 30 "expand" 28 29
150 150 $ commit 31 "expand" 21 30
151 151 $ commit 32 "expand" 27 31
152 152 $ commit 33 "head" 18
153 153 $ commit 34 "head" 32
154 154
155 155
156 156 $ hg glog -q
157 157 @ 34:fea3ac5810e0
158 158 |
159 159 | o 33:68608f5145f9
160 160 | |
161 161 o | 32:d06dffa21a31
162 162 |\ \
163 163 | o \ 31:621d83e11f67
164 164 | |\ \
165 165 | | o \ 30:6e11cd4b648f
166 166 | | |\ \
167 167 | | | o | 29:cd9bb2be7593
168 168 | | | | |
169 169 | | o | | 28:44ecd0b9ae99
170 170 | | |\ \ \
171 171 o | | | | | 27:886ed638191b
172 172 |/ / / / /
173 173 | | o---+ 26:7f25b6c2f0b9
174 174 | | | | |
175 175 +---o | | 25:91da8ed57247
176 176 | | | | |
177 177 | | o | | 24:a9c19a3d96b7
178 178 | | |\| |
179 179 | | o | | 23:a01cddf0766d
180 180 | |/| | |
181 181 +---o---+ 22:e0d9cccacb5d
182 182 | | / /
183 183 o | | | 21:d42a756af44d
184 184 |\ \ \ \
185 185 | o---+-+ 20:d30ed6450e32
186 186 | / / /
187 187 o | | | 19:31ddc2c1573b
188 188 |\ \ \ \
189 189 +---+---o 18:1aa84d96232a
190 190 | | | |
191 191 | o | | 17:44765d7c06e0
192 192 | |\ \ \
193 193 | | o---+ 16:3677d192927d
194 194 | | |/ /
195 195 o | | | 15:1dda3f72782d
196 196 |\ \ \ \
197 197 | o-----+ 14:8eac370358ef
198 198 | |/ / /
199 199 o | | | 13:22d8966a97e3
200 200 |\ \ \ \
201 201 +---o | | 12:86b91144a6e9
202 202 | | |/ /
203 203 | o | | 11:832d76e6bdf2
204 204 | |\ \ \
205 205 | | o---+ 10:74c64d036d72
206 206 | |/ / /
207 207 o | | | 9:7010c0af0a35
208 208 |\ \ \ \
209 209 | o-----+ 8:7a0b11f71937
210 210 |/ / / /
211 211 o | | | 7:b632bb1b1224
212 212 |\ \ \ \
213 213 +---o | | 6:b105a072e251
214 214 | |/ / /
215 215 | o | | 5:4409d547b708
216 216 | |\ \ \
217 217 | | o | | 4:26a8bac39d9f
218 218 | |/|/ /
219 219 | o / / 3:27eef8ed80b4
220 220 |/ / /
221 221 o / / 2:3d9a33b8d1e1
222 222 |/ /
223 223 o / 1:6db2ef61d156
224 224 |/
225 225 o 0:e6eb3150255d
226 226
227 227
228 228 $ hg glog
229 229 @ changeset: 34:fea3ac5810e0
230 230 | tag: tip
231 231 | parent: 32:d06dffa21a31
232 232 | user: test
233 233 | date: Thu Jan 01 00:00:34 1970 +0000
234 234 | summary: (34) head
235 235 |
236 236 | o changeset: 33:68608f5145f9
237 237 | | parent: 18:1aa84d96232a
238 238 | | user: test
239 239 | | date: Thu Jan 01 00:00:33 1970 +0000
240 240 | | summary: (33) head
241 241 | |
242 242 o | changeset: 32:d06dffa21a31
243 243 |\ \ parent: 27:886ed638191b
244 244 | | | parent: 31:621d83e11f67
245 245 | | | user: test
246 246 | | | date: Thu Jan 01 00:00:32 1970 +0000
247 247 | | | summary: (32) expand
248 248 | | |
249 249 | o | changeset: 31:621d83e11f67
250 250 | |\ \ parent: 21:d42a756af44d
251 251 | | | | parent: 30:6e11cd4b648f
252 252 | | | | user: test
253 253 | | | | date: Thu Jan 01 00:00:31 1970 +0000
254 254 | | | | summary: (31) expand
255 255 | | | |
256 256 | | o | changeset: 30:6e11cd4b648f
257 257 | | |\ \ parent: 28:44ecd0b9ae99
258 258 | | | | | parent: 29:cd9bb2be7593
259 259 | | | | | user: test
260 260 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
261 261 | | | | | summary: (30) expand
262 262 | | | | |
263 263 | | | o | changeset: 29:cd9bb2be7593
264 264 | | | | | parent: 0:e6eb3150255d
265 265 | | | | | user: test
266 266 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
267 267 | | | | | summary: (29) regular commit
268 268 | | | | |
269 269 | | o | | changeset: 28:44ecd0b9ae99
270 270 | | |\ \ \ parent: 1:6db2ef61d156
271 271 | | | | | | parent: 26:7f25b6c2f0b9
272 272 | | | | | | user: test
273 273 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
274 274 | | | | | | summary: (28) merge zero known
275 275 | | | | | |
276 276 o | | | | | changeset: 27:886ed638191b
277 277 |/ / / / / parent: 21:d42a756af44d
278 278 | | | | | user: test
279 279 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
280 280 | | | | | summary: (27) collapse
281 281 | | | | |
282 282 | | o---+ changeset: 26:7f25b6c2f0b9
283 283 | | | | | parent: 18:1aa84d96232a
284 284 | | | | | parent: 25:91da8ed57247
285 285 | | | | | user: test
286 286 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
287 287 | | | | | summary: (26) merge one known; far right
288 288 | | | | |
289 289 +---o | | changeset: 25:91da8ed57247
290 290 | | | | | parent: 21:d42a756af44d
291 291 | | | | | parent: 24:a9c19a3d96b7
292 292 | | | | | user: test
293 293 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
294 294 | | | | | summary: (25) merge one known; far left
295 295 | | | | |
296 296 | | o | | changeset: 24:a9c19a3d96b7
297 297 | | |\| | parent: 0:e6eb3150255d
298 298 | | | | | parent: 23:a01cddf0766d
299 299 | | | | | user: test
300 300 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
301 301 | | | | | summary: (24) merge one known; immediate right
302 302 | | | | |
303 303 | | o | | changeset: 23:a01cddf0766d
304 304 | |/| | | parent: 1:6db2ef61d156
305 305 | | | | | parent: 22:e0d9cccacb5d
306 306 | | | | | user: test
307 307 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
308 308 | | | | | summary: (23) merge one known; immediate left
309 309 | | | | |
310 310 +---o---+ changeset: 22:e0d9cccacb5d
311 311 | | | | parent: 18:1aa84d96232a
312 312 | | / / parent: 21:d42a756af44d
313 313 | | | | user: test
314 314 | | | | date: Thu Jan 01 00:00:22 1970 +0000
315 315 | | | | summary: (22) merge two known; one far left, one far right
316 316 | | | |
317 317 o | | | changeset: 21:d42a756af44d
318 318 |\ \ \ \ parent: 19:31ddc2c1573b
319 319 | | | | | parent: 20:d30ed6450e32
320 320 | | | | | user: test
321 321 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
322 322 | | | | | summary: (21) expand
323 323 | | | | |
324 324 | o---+-+ changeset: 20:d30ed6450e32
325 325 | | | | parent: 0:e6eb3150255d
326 326 | / / / parent: 18:1aa84d96232a
327 327 | | | | user: test
328 328 | | | | date: Thu Jan 01 00:00:20 1970 +0000
329 329 | | | | summary: (20) merge two known; two far right
330 330 | | | |
331 331 o | | | changeset: 19:31ddc2c1573b
332 332 |\ \ \ \ parent: 15:1dda3f72782d
333 333 | | | | | parent: 17:44765d7c06e0
334 334 | | | | | user: test
335 335 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
336 336 | | | | | summary: (19) expand
337 337 | | | | |
338 338 +---+---o changeset: 18:1aa84d96232a
339 339 | | | | parent: 1:6db2ef61d156
340 340 | | | | parent: 15:1dda3f72782d
341 341 | | | | user: test
342 342 | | | | date: Thu Jan 01 00:00:18 1970 +0000
343 343 | | | | summary: (18) merge two known; two far left
344 344 | | | |
345 345 | o | | changeset: 17:44765d7c06e0
346 346 | |\ \ \ parent: 12:86b91144a6e9
347 347 | | | | | parent: 16:3677d192927d
348 348 | | | | | user: test
349 349 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
350 350 | | | | | summary: (17) expand
351 351 | | | | |
352 352 | | o---+ changeset: 16:3677d192927d
353 353 | | | | | parent: 0:e6eb3150255d
354 354 | | |/ / parent: 1:6db2ef61d156
355 355 | | | | user: test
356 356 | | | | date: Thu Jan 01 00:00:16 1970 +0000
357 357 | | | | summary: (16) merge two known; one immediate right, one near right
358 358 | | | |
359 359 o | | | changeset: 15:1dda3f72782d
360 360 |\ \ \ \ parent: 13:22d8966a97e3
361 361 | | | | | parent: 14:8eac370358ef
362 362 | | | | | user: test
363 363 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
364 364 | | | | | summary: (15) expand
365 365 | | | | |
366 366 | o-----+ changeset: 14:8eac370358ef
367 367 | | | | | parent: 0:e6eb3150255d
368 368 | |/ / / parent: 12:86b91144a6e9
369 369 | | | | user: test
370 370 | | | | date: Thu Jan 01 00:00:14 1970 +0000
371 371 | | | | summary: (14) merge two known; one immediate right, one far right
372 372 | | | |
373 373 o | | | changeset: 13:22d8966a97e3
374 374 |\ \ \ \ parent: 9:7010c0af0a35
375 375 | | | | | parent: 11:832d76e6bdf2
376 376 | | | | | user: test
377 377 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
378 378 | | | | | summary: (13) expand
379 379 | | | | |
380 380 +---o | | changeset: 12:86b91144a6e9
381 381 | | |/ / parent: 1:6db2ef61d156
382 382 | | | | parent: 9:7010c0af0a35
383 383 | | | | user: test
384 384 | | | | date: Thu Jan 01 00:00:12 1970 +0000
385 385 | | | | summary: (12) merge two known; one immediate right, one far left
386 386 | | | |
387 387 | o | | changeset: 11:832d76e6bdf2
388 388 | |\ \ \ parent: 6:b105a072e251
389 389 | | | | | parent: 10:74c64d036d72
390 390 | | | | | user: test
391 391 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
392 392 | | | | | summary: (11) expand
393 393 | | | | |
394 394 | | o---+ changeset: 10:74c64d036d72
395 395 | | | | | parent: 0:e6eb3150255d
396 396 | |/ / / parent: 6:b105a072e251
397 397 | | | | user: test
398 398 | | | | date: Thu Jan 01 00:00:10 1970 +0000
399 399 | | | | summary: (10) merge two known; one immediate left, one near right
400 400 | | | |
401 401 o | | | changeset: 9:7010c0af0a35
402 402 |\ \ \ \ parent: 7:b632bb1b1224
403 403 | | | | | parent: 8:7a0b11f71937
404 404 | | | | | user: test
405 405 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
406 406 | | | | | summary: (9) expand
407 407 | | | | |
408 408 | o-----+ changeset: 8:7a0b11f71937
409 409 | | | | | parent: 0:e6eb3150255d
410 410 |/ / / / parent: 7:b632bb1b1224
411 411 | | | | user: test
412 412 | | | | date: Thu Jan 01 00:00:08 1970 +0000
413 413 | | | | summary: (8) merge two known; one immediate left, one far right
414 414 | | | |
415 415 o | | | changeset: 7:b632bb1b1224
416 416 |\ \ \ \ parent: 2:3d9a33b8d1e1
417 417 | | | | | parent: 5:4409d547b708
418 418 | | | | | user: test
419 419 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
420 420 | | | | | summary: (7) expand
421 421 | | | | |
422 422 +---o | | changeset: 6:b105a072e251
423 423 | |/ / / parent: 2:3d9a33b8d1e1
424 424 | | | | parent: 5:4409d547b708
425 425 | | | | user: test
426 426 | | | | date: Thu Jan 01 00:00:06 1970 +0000
427 427 | | | | summary: (6) merge two known; one immediate left, one far left
428 428 | | | |
429 429 | o | | changeset: 5:4409d547b708
430 430 | |\ \ \ parent: 3:27eef8ed80b4
431 431 | | | | | parent: 4:26a8bac39d9f
432 432 | | | | | user: test
433 433 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
434 434 | | | | | summary: (5) expand
435 435 | | | | |
436 436 | | o | | changeset: 4:26a8bac39d9f
437 437 | |/|/ / parent: 1:6db2ef61d156
438 438 | | | | parent: 3:27eef8ed80b4
439 439 | | | | user: test
440 440 | | | | date: Thu Jan 01 00:00:04 1970 +0000
441 441 | | | | summary: (4) merge two known; one immediate left, one immediate right
442 442 | | | |
443 443 | o | | changeset: 3:27eef8ed80b4
444 444 |/ / / user: test
445 445 | | | date: Thu Jan 01 00:00:03 1970 +0000
446 446 | | | summary: (3) collapse
447 447 | | |
448 448 o | | changeset: 2:3d9a33b8d1e1
449 449 |/ / user: test
450 450 | | date: Thu Jan 01 00:00:02 1970 +0000
451 451 | | summary: (2) collapse
452 452 | |
453 453 o | changeset: 1:6db2ef61d156
454 454 |/ user: test
455 455 | date: Thu Jan 01 00:00:01 1970 +0000
456 456 | summary: (1) collapse
457 457 |
458 458 o changeset: 0:e6eb3150255d
459 459 user: test
460 460 date: Thu Jan 01 00:00:00 1970 +0000
461 461 summary: (0) root
462 462
463 463
464 464 File glog:
465 465 $ hg glog a
466 466 @ changeset: 34:fea3ac5810e0
467 467 | tag: tip
468 468 | parent: 32:d06dffa21a31
469 469 | user: test
470 470 | date: Thu Jan 01 00:00:34 1970 +0000
471 471 | summary: (34) head
472 472 |
473 473 | o changeset: 33:68608f5145f9
474 474 | | parent: 18:1aa84d96232a
475 475 | | user: test
476 476 | | date: Thu Jan 01 00:00:33 1970 +0000
477 477 | | summary: (33) head
478 478 | |
479 479 o | changeset: 32:d06dffa21a31
480 480 |\ \ parent: 27:886ed638191b
481 481 | | | parent: 31:621d83e11f67
482 482 | | | user: test
483 483 | | | date: Thu Jan 01 00:00:32 1970 +0000
484 484 | | | summary: (32) expand
485 485 | | |
486 486 | o | changeset: 31:621d83e11f67
487 487 | |\ \ parent: 21:d42a756af44d
488 488 | | | | parent: 30:6e11cd4b648f
489 489 | | | | user: test
490 490 | | | | date: Thu Jan 01 00:00:31 1970 +0000
491 491 | | | | summary: (31) expand
492 492 | | | |
493 493 | | o | changeset: 30:6e11cd4b648f
494 494 | | |\ \ parent: 28:44ecd0b9ae99
495 495 | | | | | parent: 29:cd9bb2be7593
496 496 | | | | | user: test
497 497 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
498 498 | | | | | summary: (30) expand
499 499 | | | | |
500 500 | | | o | changeset: 29:cd9bb2be7593
501 501 | | | | | parent: 0:e6eb3150255d
502 502 | | | | | user: test
503 503 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
504 504 | | | | | summary: (29) regular commit
505 505 | | | | |
506 506 | | o | | changeset: 28:44ecd0b9ae99
507 507 | | |\ \ \ parent: 1:6db2ef61d156
508 508 | | | | | | parent: 26:7f25b6c2f0b9
509 509 | | | | | | user: test
510 510 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
511 511 | | | | | | summary: (28) merge zero known
512 512 | | | | | |
513 513 o | | | | | changeset: 27:886ed638191b
514 514 |/ / / / / parent: 21:d42a756af44d
515 515 | | | | | user: test
516 516 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
517 517 | | | | | summary: (27) collapse
518 518 | | | | |
519 519 | | o---+ changeset: 26:7f25b6c2f0b9
520 520 | | | | | parent: 18:1aa84d96232a
521 521 | | | | | parent: 25:91da8ed57247
522 522 | | | | | user: test
523 523 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
524 524 | | | | | summary: (26) merge one known; far right
525 525 | | | | |
526 526 +---o | | changeset: 25:91da8ed57247
527 527 | | | | | parent: 21:d42a756af44d
528 528 | | | | | parent: 24:a9c19a3d96b7
529 529 | | | | | user: test
530 530 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
531 531 | | | | | summary: (25) merge one known; far left
532 532 | | | | |
533 533 | | o | | changeset: 24:a9c19a3d96b7
534 534 | | |\| | parent: 0:e6eb3150255d
535 535 | | | | | parent: 23:a01cddf0766d
536 536 | | | | | user: test
537 537 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
538 538 | | | | | summary: (24) merge one known; immediate right
539 539 | | | | |
540 540 | | o | | changeset: 23:a01cddf0766d
541 541 | |/| | | parent: 1:6db2ef61d156
542 542 | | | | | parent: 22:e0d9cccacb5d
543 543 | | | | | user: test
544 544 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
545 545 | | | | | summary: (23) merge one known; immediate left
546 546 | | | | |
547 547 +---o---+ changeset: 22:e0d9cccacb5d
548 548 | | | | parent: 18:1aa84d96232a
549 549 | | / / parent: 21:d42a756af44d
550 550 | | | | user: test
551 551 | | | | date: Thu Jan 01 00:00:22 1970 +0000
552 552 | | | | summary: (22) merge two known; one far left, one far right
553 553 | | | |
554 554 o | | | changeset: 21:d42a756af44d
555 555 |\ \ \ \ parent: 19:31ddc2c1573b
556 556 | | | | | parent: 20:d30ed6450e32
557 557 | | | | | user: test
558 558 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
559 559 | | | | | summary: (21) expand
560 560 | | | | |
561 561 | o---+-+ changeset: 20:d30ed6450e32
562 562 | | | | parent: 0:e6eb3150255d
563 563 | / / / parent: 18:1aa84d96232a
564 564 | | | | user: test
565 565 | | | | date: Thu Jan 01 00:00:20 1970 +0000
566 566 | | | | summary: (20) merge two known; two far right
567 567 | | | |
568 568 o | | | changeset: 19:31ddc2c1573b
569 569 |\ \ \ \ parent: 15:1dda3f72782d
570 570 | | | | | parent: 17:44765d7c06e0
571 571 | | | | | user: test
572 572 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
573 573 | | | | | summary: (19) expand
574 574 | | | | |
575 575 +---+---o changeset: 18:1aa84d96232a
576 576 | | | | parent: 1:6db2ef61d156
577 577 | | | | parent: 15:1dda3f72782d
578 578 | | | | user: test
579 579 | | | | date: Thu Jan 01 00:00:18 1970 +0000
580 580 | | | | summary: (18) merge two known; two far left
581 581 | | | |
582 582 | o | | changeset: 17:44765d7c06e0
583 583 | |\ \ \ parent: 12:86b91144a6e9
584 584 | | | | | parent: 16:3677d192927d
585 585 | | | | | user: test
586 586 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
587 587 | | | | | summary: (17) expand
588 588 | | | | |
589 589 | | o---+ changeset: 16:3677d192927d
590 590 | | | | | parent: 0:e6eb3150255d
591 591 | | |/ / parent: 1:6db2ef61d156
592 592 | | | | user: test
593 593 | | | | date: Thu Jan 01 00:00:16 1970 +0000
594 594 | | | | summary: (16) merge two known; one immediate right, one near right
595 595 | | | |
596 596 o | | | changeset: 15:1dda3f72782d
597 597 |\ \ \ \ parent: 13:22d8966a97e3
598 598 | | | | | parent: 14:8eac370358ef
599 599 | | | | | user: test
600 600 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
601 601 | | | | | summary: (15) expand
602 602 | | | | |
603 603 | o-----+ changeset: 14:8eac370358ef
604 604 | | | | | parent: 0:e6eb3150255d
605 605 | |/ / / parent: 12:86b91144a6e9
606 606 | | | | user: test
607 607 | | | | date: Thu Jan 01 00:00:14 1970 +0000
608 608 | | | | summary: (14) merge two known; one immediate right, one far right
609 609 | | | |
610 610 o | | | changeset: 13:22d8966a97e3
611 611 |\ \ \ \ parent: 9:7010c0af0a35
612 612 | | | | | parent: 11:832d76e6bdf2
613 613 | | | | | user: test
614 614 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
615 615 | | | | | summary: (13) expand
616 616 | | | | |
617 617 +---o | | changeset: 12:86b91144a6e9
618 618 | | |/ / parent: 1:6db2ef61d156
619 619 | | | | parent: 9:7010c0af0a35
620 620 | | | | user: test
621 621 | | | | date: Thu Jan 01 00:00:12 1970 +0000
622 622 | | | | summary: (12) merge two known; one immediate right, one far left
623 623 | | | |
624 624 | o | | changeset: 11:832d76e6bdf2
625 625 | |\ \ \ parent: 6:b105a072e251
626 626 | | | | | parent: 10:74c64d036d72
627 627 | | | | | user: test
628 628 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
629 629 | | | | | summary: (11) expand
630 630 | | | | |
631 631 | | o---+ changeset: 10:74c64d036d72
632 632 | | | | | parent: 0:e6eb3150255d
633 633 | |/ / / parent: 6:b105a072e251
634 634 | | | | user: test
635 635 | | | | date: Thu Jan 01 00:00:10 1970 +0000
636 636 | | | | summary: (10) merge two known; one immediate left, one near right
637 637 | | | |
638 638 o | | | changeset: 9:7010c0af0a35
639 639 |\ \ \ \ parent: 7:b632bb1b1224
640 640 | | | | | parent: 8:7a0b11f71937
641 641 | | | | | user: test
642 642 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
643 643 | | | | | summary: (9) expand
644 644 | | | | |
645 645 | o-----+ changeset: 8:7a0b11f71937
646 646 | | | | | parent: 0:e6eb3150255d
647 647 |/ / / / parent: 7:b632bb1b1224
648 648 | | | | user: test
649 649 | | | | date: Thu Jan 01 00:00:08 1970 +0000
650 650 | | | | summary: (8) merge two known; one immediate left, one far right
651 651 | | | |
652 652 o | | | changeset: 7:b632bb1b1224
653 653 |\ \ \ \ parent: 2:3d9a33b8d1e1
654 654 | | | | | parent: 5:4409d547b708
655 655 | | | | | user: test
656 656 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
657 657 | | | | | summary: (7) expand
658 658 | | | | |
659 659 +---o | | changeset: 6:b105a072e251
660 660 | |/ / / parent: 2:3d9a33b8d1e1
661 661 | | | | parent: 5:4409d547b708
662 662 | | | | user: test
663 663 | | | | date: Thu Jan 01 00:00:06 1970 +0000
664 664 | | | | summary: (6) merge two known; one immediate left, one far left
665 665 | | | |
666 666 | o | | changeset: 5:4409d547b708
667 667 | |\ \ \ parent: 3:27eef8ed80b4
668 668 | | | | | parent: 4:26a8bac39d9f
669 669 | | | | | user: test
670 670 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
671 671 | | | | | summary: (5) expand
672 672 | | | | |
673 673 | | o | | changeset: 4:26a8bac39d9f
674 674 | |/|/ / parent: 1:6db2ef61d156
675 675 | | | | parent: 3:27eef8ed80b4
676 676 | | | | user: test
677 677 | | | | date: Thu Jan 01 00:00:04 1970 +0000
678 678 | | | | summary: (4) merge two known; one immediate left, one immediate right
679 679 | | | |
680 680 | o | | changeset: 3:27eef8ed80b4
681 681 |/ / / user: test
682 682 | | | date: Thu Jan 01 00:00:03 1970 +0000
683 683 | | | summary: (3) collapse
684 684 | | |
685 685 o | | changeset: 2:3d9a33b8d1e1
686 686 |/ / user: test
687 687 | | date: Thu Jan 01 00:00:02 1970 +0000
688 688 | | summary: (2) collapse
689 689 | |
690 690 o | changeset: 1:6db2ef61d156
691 691 |/ user: test
692 692 | date: Thu Jan 01 00:00:01 1970 +0000
693 693 | summary: (1) collapse
694 694 |
695 695 o changeset: 0:e6eb3150255d
696 696 user: test
697 697 date: Thu Jan 01 00:00:00 1970 +0000
698 698 summary: (0) root
699 699
700 700
701 701 File glog per revset:
702 702
703 703 $ hg glog -r 'file("a")'
704 704 @ changeset: 34:fea3ac5810e0
705 705 | tag: tip
706 706 | parent: 32:d06dffa21a31
707 707 | user: test
708 708 | date: Thu Jan 01 00:00:34 1970 +0000
709 709 | summary: (34) head
710 710 |
711 711 | o changeset: 33:68608f5145f9
712 712 | | parent: 18:1aa84d96232a
713 713 | | user: test
714 714 | | date: Thu Jan 01 00:00:33 1970 +0000
715 715 | | summary: (33) head
716 716 | |
717 717 o | changeset: 32:d06dffa21a31
718 718 |\ \ parent: 27:886ed638191b
719 719 | | | parent: 31:621d83e11f67
720 720 | | | user: test
721 721 | | | date: Thu Jan 01 00:00:32 1970 +0000
722 722 | | | summary: (32) expand
723 723 | | |
724 724 | o | changeset: 31:621d83e11f67
725 725 | |\ \ parent: 21:d42a756af44d
726 726 | | | | parent: 30:6e11cd4b648f
727 727 | | | | user: test
728 728 | | | | date: Thu Jan 01 00:00:31 1970 +0000
729 729 | | | | summary: (31) expand
730 730 | | | |
731 731 | | o | changeset: 30:6e11cd4b648f
732 732 | | |\ \ parent: 28:44ecd0b9ae99
733 733 | | | | | parent: 29:cd9bb2be7593
734 734 | | | | | user: test
735 735 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
736 736 | | | | | summary: (30) expand
737 737 | | | | |
738 738 | | | o | changeset: 29:cd9bb2be7593
739 739 | | | | | parent: 0:e6eb3150255d
740 740 | | | | | user: test
741 741 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
742 742 | | | | | summary: (29) regular commit
743 743 | | | | |
744 744 | | o | | changeset: 28:44ecd0b9ae99
745 745 | | |\ \ \ parent: 1:6db2ef61d156
746 746 | | | | | | parent: 26:7f25b6c2f0b9
747 747 | | | | | | user: test
748 748 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
749 749 | | | | | | summary: (28) merge zero known
750 750 | | | | | |
751 751 o | | | | | changeset: 27:886ed638191b
752 752 |/ / / / / parent: 21:d42a756af44d
753 753 | | | | | user: test
754 754 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
755 755 | | | | | summary: (27) collapse
756 756 | | | | |
757 757 | | o---+ changeset: 26:7f25b6c2f0b9
758 758 | | | | | parent: 18:1aa84d96232a
759 759 | | | | | parent: 25:91da8ed57247
760 760 | | | | | user: test
761 761 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
762 762 | | | | | summary: (26) merge one known; far right
763 763 | | | | |
764 764 +---o | | changeset: 25:91da8ed57247
765 765 | | | | | parent: 21:d42a756af44d
766 766 | | | | | parent: 24:a9c19a3d96b7
767 767 | | | | | user: test
768 768 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
769 769 | | | | | summary: (25) merge one known; far left
770 770 | | | | |
771 771 | | o | | changeset: 24:a9c19a3d96b7
772 772 | | |\| | parent: 0:e6eb3150255d
773 773 | | | | | parent: 23:a01cddf0766d
774 774 | | | | | user: test
775 775 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
776 776 | | | | | summary: (24) merge one known; immediate right
777 777 | | | | |
778 778 | | o | | changeset: 23:a01cddf0766d
779 779 | |/| | | parent: 1:6db2ef61d156
780 780 | | | | | parent: 22:e0d9cccacb5d
781 781 | | | | | user: test
782 782 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
783 783 | | | | | summary: (23) merge one known; immediate left
784 784 | | | | |
785 785 +---o---+ changeset: 22:e0d9cccacb5d
786 786 | | | | parent: 18:1aa84d96232a
787 787 | | / / parent: 21:d42a756af44d
788 788 | | | | user: test
789 789 | | | | date: Thu Jan 01 00:00:22 1970 +0000
790 790 | | | | summary: (22) merge two known; one far left, one far right
791 791 | | | |
792 792 o | | | changeset: 21:d42a756af44d
793 793 |\ \ \ \ parent: 19:31ddc2c1573b
794 794 | | | | | parent: 20:d30ed6450e32
795 795 | | | | | user: test
796 796 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
797 797 | | | | | summary: (21) expand
798 798 | | | | |
799 799 | o---+-+ changeset: 20:d30ed6450e32
800 800 | | | | parent: 0:e6eb3150255d
801 801 | / / / parent: 18:1aa84d96232a
802 802 | | | | user: test
803 803 | | | | date: Thu Jan 01 00:00:20 1970 +0000
804 804 | | | | summary: (20) merge two known; two far right
805 805 | | | |
806 806 o | | | changeset: 19:31ddc2c1573b
807 807 |\ \ \ \ parent: 15:1dda3f72782d
808 808 | | | | | parent: 17:44765d7c06e0
809 809 | | | | | user: test
810 810 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
811 811 | | | | | summary: (19) expand
812 812 | | | | |
813 813 +---+---o changeset: 18:1aa84d96232a
814 814 | | | | parent: 1:6db2ef61d156
815 815 | | | | parent: 15:1dda3f72782d
816 816 | | | | user: test
817 817 | | | | date: Thu Jan 01 00:00:18 1970 +0000
818 818 | | | | summary: (18) merge two known; two far left
819 819 | | | |
820 820 | o | | changeset: 17:44765d7c06e0
821 821 | |\ \ \ parent: 12:86b91144a6e9
822 822 | | | | | parent: 16:3677d192927d
823 823 | | | | | user: test
824 824 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
825 825 | | | | | summary: (17) expand
826 826 | | | | |
827 827 | | o---+ changeset: 16:3677d192927d
828 828 | | | | | parent: 0:e6eb3150255d
829 829 | | |/ / parent: 1:6db2ef61d156
830 830 | | | | user: test
831 831 | | | | date: Thu Jan 01 00:00:16 1970 +0000
832 832 | | | | summary: (16) merge two known; one immediate right, one near right
833 833 | | | |
834 834 o | | | changeset: 15:1dda3f72782d
835 835 |\ \ \ \ parent: 13:22d8966a97e3
836 836 | | | | | parent: 14:8eac370358ef
837 837 | | | | | user: test
838 838 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
839 839 | | | | | summary: (15) expand
840 840 | | | | |
841 841 | o-----+ changeset: 14:8eac370358ef
842 842 | | | | | parent: 0:e6eb3150255d
843 843 | |/ / / parent: 12:86b91144a6e9
844 844 | | | | user: test
845 845 | | | | date: Thu Jan 01 00:00:14 1970 +0000
846 846 | | | | summary: (14) merge two known; one immediate right, one far right
847 847 | | | |
848 848 o | | | changeset: 13:22d8966a97e3
849 849 |\ \ \ \ parent: 9:7010c0af0a35
850 850 | | | | | parent: 11:832d76e6bdf2
851 851 | | | | | user: test
852 852 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
853 853 | | | | | summary: (13) expand
854 854 | | | | |
855 855 +---o | | changeset: 12:86b91144a6e9
856 856 | | |/ / parent: 1:6db2ef61d156
857 857 | | | | parent: 9:7010c0af0a35
858 858 | | | | user: test
859 859 | | | | date: Thu Jan 01 00:00:12 1970 +0000
860 860 | | | | summary: (12) merge two known; one immediate right, one far left
861 861 | | | |
862 862 | o | | changeset: 11:832d76e6bdf2
863 863 | |\ \ \ parent: 6:b105a072e251
864 864 | | | | | parent: 10:74c64d036d72
865 865 | | | | | user: test
866 866 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
867 867 | | | | | summary: (11) expand
868 868 | | | | |
869 869 | | o---+ changeset: 10:74c64d036d72
870 870 | | | | | parent: 0:e6eb3150255d
871 871 | |/ / / parent: 6:b105a072e251
872 872 | | | | user: test
873 873 | | | | date: Thu Jan 01 00:00:10 1970 +0000
874 874 | | | | summary: (10) merge two known; one immediate left, one near right
875 875 | | | |
876 876 o | | | changeset: 9:7010c0af0a35
877 877 |\ \ \ \ parent: 7:b632bb1b1224
878 878 | | | | | parent: 8:7a0b11f71937
879 879 | | | | | user: test
880 880 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
881 881 | | | | | summary: (9) expand
882 882 | | | | |
883 883 | o-----+ changeset: 8:7a0b11f71937
884 884 | | | | | parent: 0:e6eb3150255d
885 885 |/ / / / parent: 7:b632bb1b1224
886 886 | | | | user: test
887 887 | | | | date: Thu Jan 01 00:00:08 1970 +0000
888 888 | | | | summary: (8) merge two known; one immediate left, one far right
889 889 | | | |
890 890 o | | | changeset: 7:b632bb1b1224
891 891 |\ \ \ \ parent: 2:3d9a33b8d1e1
892 892 | | | | | parent: 5:4409d547b708
893 893 | | | | | user: test
894 894 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
895 895 | | | | | summary: (7) expand
896 896 | | | | |
897 897 +---o | | changeset: 6:b105a072e251
898 898 | |/ / / parent: 2:3d9a33b8d1e1
899 899 | | | | parent: 5:4409d547b708
900 900 | | | | user: test
901 901 | | | | date: Thu Jan 01 00:00:06 1970 +0000
902 902 | | | | summary: (6) merge two known; one immediate left, one far left
903 903 | | | |
904 904 | o | | changeset: 5:4409d547b708
905 905 | |\ \ \ parent: 3:27eef8ed80b4
906 906 | | | | | parent: 4:26a8bac39d9f
907 907 | | | | | user: test
908 908 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
909 909 | | | | | summary: (5) expand
910 910 | | | | |
911 911 | | o | | changeset: 4:26a8bac39d9f
912 912 | |/|/ / parent: 1:6db2ef61d156
913 913 | | | | parent: 3:27eef8ed80b4
914 914 | | | | user: test
915 915 | | | | date: Thu Jan 01 00:00:04 1970 +0000
916 916 | | | | summary: (4) merge two known; one immediate left, one immediate right
917 917 | | | |
918 918 | o | | changeset: 3:27eef8ed80b4
919 919 |/ / / user: test
920 920 | | | date: Thu Jan 01 00:00:03 1970 +0000
921 921 | | | summary: (3) collapse
922 922 | | |
923 923 o | | changeset: 2:3d9a33b8d1e1
924 924 |/ / user: test
925 925 | | date: Thu Jan 01 00:00:02 1970 +0000
926 926 | | summary: (2) collapse
927 927 | |
928 928 o | changeset: 1:6db2ef61d156
929 929 |/ user: test
930 930 | date: Thu Jan 01 00:00:01 1970 +0000
931 931 | summary: (1) collapse
932 932 |
933 933 o changeset: 0:e6eb3150255d
934 934 user: test
935 935 date: Thu Jan 01 00:00:00 1970 +0000
936 936 summary: (0) root
937 937
938 938
939 939
940 940 File glog per revset (only merges):
941 941
942 942 $ hg log -G -r 'file("a")' -m
943 943 o changeset: 32:d06dffa21a31
944 944 |\ parent: 27:886ed638191b
945 945 | | parent: 31:621d83e11f67
946 946 | | user: test
947 947 | | date: Thu Jan 01 00:00:32 1970 +0000
948 948 | | summary: (32) expand
949 949 | |
950 950 o | changeset: 31:621d83e11f67
951 951 |\| parent: 21:d42a756af44d
952 952 | | parent: 30:6e11cd4b648f
953 953 | | user: test
954 954 | | date: Thu Jan 01 00:00:31 1970 +0000
955 955 | | summary: (31) expand
956 956 | |
957 957 o | changeset: 30:6e11cd4b648f
958 958 |\ \ parent: 28:44ecd0b9ae99
959 959 | | | parent: 29:cd9bb2be7593
960 960 | | | user: test
961 961 | | | date: Thu Jan 01 00:00:30 1970 +0000
962 962 | | | summary: (30) expand
963 963 | | |
964 964 o | | changeset: 28:44ecd0b9ae99
965 965 |\ \ \ parent: 1:6db2ef61d156
966 966 | | | | parent: 26:7f25b6c2f0b9
967 967 | | | | user: test
968 968 | | | | date: Thu Jan 01 00:00:28 1970 +0000
969 969 | | | | summary: (28) merge zero known
970 970 | | | |
971 971 o | | | changeset: 26:7f25b6c2f0b9
972 972 |\ \ \ \ parent: 18:1aa84d96232a
973 973 | | | | | parent: 25:91da8ed57247
974 974 | | | | | user: test
975 975 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
976 976 | | | | | summary: (26) merge one known; far right
977 977 | | | | |
978 978 | o-----+ changeset: 25:91da8ed57247
979 979 | | | | | parent: 21:d42a756af44d
980 980 | | | | | parent: 24:a9c19a3d96b7
981 981 | | | | | user: test
982 982 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
983 983 | | | | | summary: (25) merge one known; far left
984 984 | | | | |
985 985 | o | | | changeset: 24:a9c19a3d96b7
986 986 | |\ \ \ \ parent: 0:e6eb3150255d
987 987 | | | | | | parent: 23:a01cddf0766d
988 988 | | | | | | user: test
989 989 | | | | | | date: Thu Jan 01 00:00:24 1970 +0000
990 990 | | | | | | summary: (24) merge one known; immediate right
991 991 | | | | | |
992 992 | o---+ | | changeset: 23:a01cddf0766d
993 993 | | | | | | parent: 1:6db2ef61d156
994 994 | | | | | | parent: 22:e0d9cccacb5d
995 995 | | | | | | user: test
996 996 | | | | | | date: Thu Jan 01 00:00:23 1970 +0000
997 997 | | | | | | summary: (23) merge one known; immediate left
998 998 | | | | | |
999 999 | o-------+ changeset: 22:e0d9cccacb5d
1000 1000 | | | | | | parent: 18:1aa84d96232a
1001 1001 |/ / / / / parent: 21:d42a756af44d
1002 1002 | | | | | user: test
1003 1003 | | | | | date: Thu Jan 01 00:00:22 1970 +0000
1004 1004 | | | | | summary: (22) merge two known; one far left, one far right
1005 1005 | | | | |
1006 1006 | | | | o changeset: 21:d42a756af44d
1007 1007 | | | | |\ parent: 19:31ddc2c1573b
1008 1008 | | | | | | parent: 20:d30ed6450e32
1009 1009 | | | | | | user: test
1010 1010 | | | | | | date: Thu Jan 01 00:00:21 1970 +0000
1011 1011 | | | | | | summary: (21) expand
1012 1012 | | | | | |
1013 1013 +-+-------o changeset: 20:d30ed6450e32
1014 1014 | | | | | parent: 0:e6eb3150255d
1015 1015 | | | | | parent: 18:1aa84d96232a
1016 1016 | | | | | user: test
1017 1017 | | | | | date: Thu Jan 01 00:00:20 1970 +0000
1018 1018 | | | | | summary: (20) merge two known; two far right
1019 1019 | | | | |
1020 1020 | | | | o changeset: 19:31ddc2c1573b
1021 1021 | | | | |\ parent: 15:1dda3f72782d
1022 1022 | | | | | | parent: 17:44765d7c06e0
1023 1023 | | | | | | user: test
1024 1024 | | | | | | date: Thu Jan 01 00:00:19 1970 +0000
1025 1025 | | | | | | summary: (19) expand
1026 1026 | | | | | |
1027 1027 o---+---+ | changeset: 18:1aa84d96232a
1028 1028 | | | | | parent: 1:6db2ef61d156
1029 1029 / / / / / parent: 15:1dda3f72782d
1030 1030 | | | | | user: test
1031 1031 | | | | | date: Thu Jan 01 00:00:18 1970 +0000
1032 1032 | | | | | summary: (18) merge two known; two far left
1033 1033 | | | | |
1034 1034 | | | | o changeset: 17:44765d7c06e0
1035 1035 | | | | |\ parent: 12:86b91144a6e9
1036 1036 | | | | | | parent: 16:3677d192927d
1037 1037 | | | | | | user: test
1038 1038 | | | | | | date: Thu Jan 01 00:00:17 1970 +0000
1039 1039 | | | | | | summary: (17) expand
1040 1040 | | | | | |
1041 1041 +-+-------o changeset: 16:3677d192927d
1042 1042 | | | | | parent: 0:e6eb3150255d
1043 1043 | | | | | parent: 1:6db2ef61d156
1044 1044 | | | | | user: test
1045 1045 | | | | | date: Thu Jan 01 00:00:16 1970 +0000
1046 1046 | | | | | summary: (16) merge two known; one immediate right, one near right
1047 1047 | | | | |
1048 1048 | | | o | changeset: 15:1dda3f72782d
1049 1049 | | | |\ \ parent: 13:22d8966a97e3
1050 1050 | | | | | | parent: 14:8eac370358ef
1051 1051 | | | | | | user: test
1052 1052 | | | | | | date: Thu Jan 01 00:00:15 1970 +0000
1053 1053 | | | | | | summary: (15) expand
1054 1054 | | | | | |
1055 1055 +-------o | changeset: 14:8eac370358ef
1056 1056 | | | | |/ parent: 0:e6eb3150255d
1057 1057 | | | | | parent: 12:86b91144a6e9
1058 1058 | | | | | user: test
1059 1059 | | | | | date: Thu Jan 01 00:00:14 1970 +0000
1060 1060 | | | | | summary: (14) merge two known; one immediate right, one far right
1061 1061 | | | | |
1062 1062 | | | o | changeset: 13:22d8966a97e3
1063 1063 | | | |\ \ parent: 9:7010c0af0a35
1064 1064 | | | | | | parent: 11:832d76e6bdf2
1065 1065 | | | | | | user: test
1066 1066 | | | | | | date: Thu Jan 01 00:00:13 1970 +0000
1067 1067 | | | | | | summary: (13) expand
1068 1068 | | | | | |
1069 1069 | +---+---o changeset: 12:86b91144a6e9
1070 1070 | | | | | parent: 1:6db2ef61d156
1071 1071 | | | | | parent: 9:7010c0af0a35
1072 1072 | | | | | user: test
1073 1073 | | | | | date: Thu Jan 01 00:00:12 1970 +0000
1074 1074 | | | | | summary: (12) merge two known; one immediate right, one far left
1075 1075 | | | | |
1076 1076 | | | | o changeset: 11:832d76e6bdf2
1077 1077 | | | | |\ parent: 6:b105a072e251
1078 1078 | | | | | | parent: 10:74c64d036d72
1079 1079 | | | | | | user: test
1080 1080 | | | | | | date: Thu Jan 01 00:00:11 1970 +0000
1081 1081 | | | | | | summary: (11) expand
1082 1082 | | | | | |
1083 1083 +---------o changeset: 10:74c64d036d72
1084 1084 | | | | |/ parent: 0:e6eb3150255d
1085 1085 | | | | | parent: 6:b105a072e251
1086 1086 | | | | | user: test
1087 1087 | | | | | date: Thu Jan 01 00:00:10 1970 +0000
1088 1088 | | | | | summary: (10) merge two known; one immediate left, one near right
1089 1089 | | | | |
1090 1090 | | | o | changeset: 9:7010c0af0a35
1091 1091 | | | |\ \ parent: 7:b632bb1b1224
1092 1092 | | | | | | parent: 8:7a0b11f71937
1093 1093 | | | | | | user: test
1094 1094 | | | | | | date: Thu Jan 01 00:00:09 1970 +0000
1095 1095 | | | | | | summary: (9) expand
1096 1096 | | | | | |
1097 1097 +-------o | changeset: 8:7a0b11f71937
1098 1098 | | | |/ / parent: 0:e6eb3150255d
1099 1099 | | | | | parent: 7:b632bb1b1224
1100 1100 | | | | | user: test
1101 1101 | | | | | date: Thu Jan 01 00:00:08 1970 +0000
1102 1102 | | | | | summary: (8) merge two known; one immediate left, one far right
1103 1103 | | | | |
1104 1104 | | | o | changeset: 7:b632bb1b1224
1105 1105 | | | |\ \ parent: 2:3d9a33b8d1e1
1106 1106 | | | | | | parent: 5:4409d547b708
1107 1107 | | | | | | user: test
1108 1108 | | | | | | date: Thu Jan 01 00:00:07 1970 +0000
1109 1109 | | | | | | summary: (7) expand
1110 1110 | | | | | |
1111 1111 | | | +---o changeset: 6:b105a072e251
1112 1112 | | | | |/ parent: 2:3d9a33b8d1e1
1113 1113 | | | | | parent: 5:4409d547b708
1114 1114 | | | | | user: test
1115 1115 | | | | | date: Thu Jan 01 00:00:06 1970 +0000
1116 1116 | | | | | summary: (6) merge two known; one immediate left, one far left
1117 1117 | | | | |
1118 1118 | | | o | changeset: 5:4409d547b708
1119 1119 | | | |\ \ parent: 3:27eef8ed80b4
1120 1120 | | | | | | parent: 4:26a8bac39d9f
1121 1121 | | | | | | user: test
1122 1122 | | | | | | date: Thu Jan 01 00:00:05 1970 +0000
1123 1123 | | | | | | summary: (5) expand
1124 1124 | | | | | |
1125 1125 | +---o | | changeset: 4:26a8bac39d9f
1126 1126 | | | |/ / parent: 1:6db2ef61d156
1127 1127 | | | | | parent: 3:27eef8ed80b4
1128 1128 | | | | | user: test
1129 1129 | | | | | date: Thu Jan 01 00:00:04 1970 +0000
1130 1130 | | | | | summary: (4) merge two known; one immediate left, one immediate right
1131 1131 | | | | |
1132 1132
1133 1133
1134 1134 Empty revision range - display nothing:
1135 1135 $ hg glog -r 1..0
1136 1136
1137 1137 $ cd ..
1138 1138
1139 1139 #if no-outer-repo
1140 1140
1141 1141 From outer space:
1142 1142 $ hg glog -l1 repo
1143 1143 @ changeset: 34:fea3ac5810e0
1144 1144 | tag: tip
1145 1145 | parent: 32:d06dffa21a31
1146 1146 | user: test
1147 1147 | date: Thu Jan 01 00:00:34 1970 +0000
1148 1148 | summary: (34) head
1149 1149 |
1150 1150 $ hg glog -l1 repo/a
1151 1151 @ changeset: 34:fea3ac5810e0
1152 1152 | tag: tip
1153 1153 | parent: 32:d06dffa21a31
1154 1154 | user: test
1155 1155 | date: Thu Jan 01 00:00:34 1970 +0000
1156 1156 | summary: (34) head
1157 1157 |
1158 1158 $ hg glog -l1 repo/missing
1159 1159
1160 1160 #endif
1161 1161
1162 1162 File log with revs != cset revs:
1163 1163 $ hg init flog
1164 1164 $ cd flog
1165 1165 $ echo one >one
1166 1166 $ hg add one
1167 1167 $ hg commit -mone
1168 1168 $ echo two >two
1169 1169 $ hg add two
1170 1170 $ hg commit -mtwo
1171 1171 $ echo more >two
1172 1172 $ hg commit -mmore
1173 1173 $ hg glog two
1174 1174 @ changeset: 2:12c28321755b
1175 1175 | tag: tip
1176 1176 | user: test
1177 1177 | date: Thu Jan 01 00:00:00 1970 +0000
1178 1178 | summary: more
1179 1179 |
1180 1180 o changeset: 1:5ac72c0599bf
1181 1181 | user: test
1182 1182 | date: Thu Jan 01 00:00:00 1970 +0000
1183 1183 | summary: two
1184 1184 |
1185 1185
1186 1186 Issue1896: File log with explicit style
1187 1187 $ hg glog --style=default one
1188 1188 o changeset: 0:3d578b4a1f53
1189 1189 user: test
1190 1190 date: Thu Jan 01 00:00:00 1970 +0000
1191 1191 summary: one
1192 1192
1193 1193 Issue2395: glog --style header and footer
1194 1194 $ hg glog --style=xml one
1195 1195 <?xml version="1.0"?>
1196 1196 <log>
1197 1197 o <logentry revision="0" node="3d578b4a1f537d5fcf7301bfa9c0b97adfaa6fb1">
1198 1198 <author email="test">test</author>
1199 1199 <date>1970-01-01T00:00:00+00:00</date>
1200 1200 <msg xml:space="preserve">one</msg>
1201 1201 </logentry>
1202 1202 </log>
1203 1203
1204 1204 $ cd ..
1205 1205
1206 1206 Incoming and outgoing:
1207 1207
1208 1208 $ hg clone -U -r31 repo repo2
1209 1209 adding changesets
1210 1210 adding manifests
1211 1211 adding file changes
1212 1212 added 31 changesets with 31 changes to 1 files
1213 1213 $ cd repo2
1214 1214
1215 1215 $ hg incoming --graph ../repo
1216 1216 comparing with ../repo
1217 1217 searching for changes
1218 1218 o changeset: 34:fea3ac5810e0
1219 1219 | tag: tip
1220 1220 | parent: 32:d06dffa21a31
1221 1221 | user: test
1222 1222 | date: Thu Jan 01 00:00:34 1970 +0000
1223 1223 | summary: (34) head
1224 1224 |
1225 1225 | o changeset: 33:68608f5145f9
1226 1226 | parent: 18:1aa84d96232a
1227 1227 | user: test
1228 1228 | date: Thu Jan 01 00:00:33 1970 +0000
1229 1229 | summary: (33) head
1230 1230 |
1231 1231 o changeset: 32:d06dffa21a31
1232 1232 | parent: 27:886ed638191b
1233 1233 | parent: 31:621d83e11f67
1234 1234 | user: test
1235 1235 | date: Thu Jan 01 00:00:32 1970 +0000
1236 1236 | summary: (32) expand
1237 1237 |
1238 1238 o changeset: 27:886ed638191b
1239 1239 parent: 21:d42a756af44d
1240 1240 user: test
1241 1241 date: Thu Jan 01 00:00:27 1970 +0000
1242 1242 summary: (27) collapse
1243 1243
1244 1244 $ cd ..
1245 1245
1246 1246 $ hg -R repo outgoing --graph repo2
1247 1247 comparing with repo2
1248 1248 searching for changes
1249 1249 @ changeset: 34:fea3ac5810e0
1250 1250 | tag: tip
1251 1251 | parent: 32:d06dffa21a31
1252 1252 | user: test
1253 1253 | date: Thu Jan 01 00:00:34 1970 +0000
1254 1254 | summary: (34) head
1255 1255 |
1256 1256 | o changeset: 33:68608f5145f9
1257 1257 | parent: 18:1aa84d96232a
1258 1258 | user: test
1259 1259 | date: Thu Jan 01 00:00:33 1970 +0000
1260 1260 | summary: (33) head
1261 1261 |
1262 1262 o changeset: 32:d06dffa21a31
1263 1263 | parent: 27:886ed638191b
1264 1264 | parent: 31:621d83e11f67
1265 1265 | user: test
1266 1266 | date: Thu Jan 01 00:00:32 1970 +0000
1267 1267 | summary: (32) expand
1268 1268 |
1269 1269 o changeset: 27:886ed638191b
1270 1270 parent: 21:d42a756af44d
1271 1271 user: test
1272 1272 date: Thu Jan 01 00:00:27 1970 +0000
1273 1273 summary: (27) collapse
1274 1274
1275 1275
1276 1276 File + limit with revs != cset revs:
1277 1277 $ cd repo
1278 1278 $ touch b
1279 1279 $ hg ci -Aqm0
1280 1280 $ hg glog -l2 a
1281 1281 o changeset: 34:fea3ac5810e0
1282 1282 | parent: 32:d06dffa21a31
1283 1283 | user: test
1284 1284 | date: Thu Jan 01 00:00:34 1970 +0000
1285 1285 | summary: (34) head
1286 1286 |
1287 1287 | o changeset: 33:68608f5145f9
1288 1288 | | parent: 18:1aa84d96232a
1289 1289 | | user: test
1290 1290 | | date: Thu Jan 01 00:00:33 1970 +0000
1291 1291 | | summary: (33) head
1292 1292 | |
1293 1293
1294 1294 File + limit + -ra:b, (b - a) < limit:
1295 1295 $ hg glog -l3000 -r32:tip a
1296 1296 o changeset: 34:fea3ac5810e0
1297 1297 | parent: 32:d06dffa21a31
1298 1298 | user: test
1299 1299 | date: Thu Jan 01 00:00:34 1970 +0000
1300 1300 | summary: (34) head
1301 1301 |
1302 1302 | o changeset: 33:68608f5145f9
1303 1303 | | parent: 18:1aa84d96232a
1304 1304 | | user: test
1305 1305 | | date: Thu Jan 01 00:00:33 1970 +0000
1306 1306 | | summary: (33) head
1307 1307 | |
1308 1308 o | changeset: 32:d06dffa21a31
1309 1309 |\ \ parent: 27:886ed638191b
1310 1310 | | | parent: 31:621d83e11f67
1311 1311 | | | user: test
1312 1312 | | | date: Thu Jan 01 00:00:32 1970 +0000
1313 1313 | | | summary: (32) expand
1314 1314 | | |
1315 1315
1316 1316 Point out a common and an uncommon unshown parent
1317 1317
1318 1318 $ hg glog -r 'rev(8) or rev(9)'
1319 1319 o changeset: 9:7010c0af0a35
1320 1320 |\ parent: 7:b632bb1b1224
1321 1321 | | parent: 8:7a0b11f71937
1322 1322 | | user: test
1323 1323 | | date: Thu Jan 01 00:00:09 1970 +0000
1324 1324 | | summary: (9) expand
1325 1325 | |
1326 1326 o | changeset: 8:7a0b11f71937
1327 1327 |\| parent: 0:e6eb3150255d
1328 1328 | | parent: 7:b632bb1b1224
1329 1329 | | user: test
1330 1330 | | date: Thu Jan 01 00:00:08 1970 +0000
1331 1331 | | summary: (8) merge two known; one immediate left, one far right
1332 1332 | |
1333 1333
1334 1334 File + limit + -ra:b, b < tip:
1335 1335
1336 1336 $ hg glog -l1 -r32:34 a
1337 1337 o changeset: 34:fea3ac5810e0
1338 1338 | parent: 32:d06dffa21a31
1339 1339 | user: test
1340 1340 | date: Thu Jan 01 00:00:34 1970 +0000
1341 1341 | summary: (34) head
1342 1342 |
1343 1343
1344 1344 file(File) + limit + -ra:b, b < tip:
1345 1345
1346 1346 $ hg glog -l1 -r32:34 -r 'file("a")'
1347 1347 o changeset: 34:fea3ac5810e0
1348 1348 | parent: 32:d06dffa21a31
1349 1349 | user: test
1350 1350 | date: Thu Jan 01 00:00:34 1970 +0000
1351 1351 | summary: (34) head
1352 1352 |
1353 1353
1354 1354 limit(file(File) and a::b), b < tip:
1355 1355
1356 1356 $ hg glog -r 'limit(file("a") and 32::34, 1)'
1357 1357 o changeset: 32:d06dffa21a31
1358 1358 |\ parent: 27:886ed638191b
1359 1359 | | parent: 31:621d83e11f67
1360 1360 | | user: test
1361 1361 | | date: Thu Jan 01 00:00:32 1970 +0000
1362 1362 | | summary: (32) expand
1363 1363 | |
1364 1364
1365 1365 File + limit + -ra:b, b < tip:
1366 1366
1367 1367 $ hg glog -r 'limit(file("a") and 34::32, 1)'
1368 1368
1369 1369 File + limit + -ra:b, b < tip, (b - a) < limit:
1370 1370
1371 1371 $ hg glog -l10 -r33:34 a
1372 1372 o changeset: 34:fea3ac5810e0
1373 1373 | parent: 32:d06dffa21a31
1374 1374 | user: test
1375 1375 | date: Thu Jan 01 00:00:34 1970 +0000
1376 1376 | summary: (34) head
1377 1377 |
1378 1378 | o changeset: 33:68608f5145f9
1379 1379 | | parent: 18:1aa84d96232a
1380 1380 | | user: test
1381 1381 | | date: Thu Jan 01 00:00:33 1970 +0000
1382 1382 | | summary: (33) head
1383 1383 | |
1384 1384
1385 1385 Do not crash or produce strange graphs if history is buggy
1386 1386
1387 1387 $ hg branch branch
1388 1388 marked working directory as branch branch
1389 1389 (branches are permanent and global, did you want a bookmark?)
1390 1390 $ commit 36 "buggy merge: identical parents" 35 35
1391 1391 $ hg glog -l5
1392 1392 @ changeset: 36:08a19a744424
1393 1393 | branch: branch
1394 1394 | tag: tip
1395 1395 | parent: 35:9159c3644c5e
1396 1396 | parent: 35:9159c3644c5e
1397 1397 | user: test
1398 1398 | date: Thu Jan 01 00:00:36 1970 +0000
1399 1399 | summary: (36) buggy merge: identical parents
1400 1400 |
1401 1401 o changeset: 35:9159c3644c5e
1402 1402 | user: test
1403 1403 | date: Thu Jan 01 00:00:00 1970 +0000
1404 1404 | summary: 0
1405 1405 |
1406 1406 o changeset: 34:fea3ac5810e0
1407 1407 | parent: 32:d06dffa21a31
1408 1408 | user: test
1409 1409 | date: Thu Jan 01 00:00:34 1970 +0000
1410 1410 | summary: (34) head
1411 1411 |
1412 1412 | o changeset: 33:68608f5145f9
1413 1413 | | parent: 18:1aa84d96232a
1414 1414 | | user: test
1415 1415 | | date: Thu Jan 01 00:00:33 1970 +0000
1416 1416 | | summary: (33) head
1417 1417 | |
1418 1418 o | changeset: 32:d06dffa21a31
1419 1419 |\ \ parent: 27:886ed638191b
1420 1420 | | | parent: 31:621d83e11f67
1421 1421 | | | user: test
1422 1422 | | | date: Thu Jan 01 00:00:32 1970 +0000
1423 1423 | | | summary: (32) expand
1424 1424 | | |
1425 1425
1426 1426 Test log -G options
1427 1427
1428 1428 $ testlog() {
1429 1429 > hg log -G --print-revset "$@"
1430 1430 > hg log --template 'nodetag {rev}\n' "$@" | grep nodetag \
1431 1431 > | sed 's/.*nodetag/nodetag/' > log.nodes
1432 1432 > hg log -G --template 'nodetag {rev}\n' "$@" | grep nodetag \
1433 1433 > | sed 's/.*nodetag/nodetag/' > glog.nodes
1434 1434 > diff -u log.nodes glog.nodes | grep '^[-+@ ]' || :
1435 1435 > }
1436 1436
1437 1437 glog always reorders nodes which explains the difference with log
1438 1438
1439 1439 $ testlog -r 27 -r 25 -r 21 -r 34 -r 32 -r 31
1440 1440 ['27', '25', '21', '34', '32', '31']
1441 1441 []
1442 1442 --- log.nodes * (glob)
1443 1443 +++ glog.nodes * (glob)
1444 1444 @@ -1,6 +1,6 @@
1445 1445 -nodetag 27
1446 1446 -nodetag 25
1447 1447 -nodetag 21
1448 1448 nodetag 34
1449 1449 nodetag 32
1450 1450 nodetag 31
1451 1451 +nodetag 27
1452 1452 +nodetag 25
1453 1453 +nodetag 21
1454 1454 $ testlog -u test -u not-a-user
1455 1455 []
1456 1456 (group
1457 1457 (group
1458 1458 (or
1459 1459 (func
1460 1460 ('symbol', 'user')
1461 1461 ('string', 'test'))
1462 1462 (func
1463 1463 ('symbol', 'user')
1464 1464 ('string', 'not-a-user')))))
1465 1465 $ testlog -b not-a-branch
1466 1466 abort: unknown revision 'not-a-branch'!
1467 1467 abort: unknown revision 'not-a-branch'!
1468 1468 abort: unknown revision 'not-a-branch'!
1469 1469 $ testlog -b 35 -b 36 --only-branch branch
1470 1470 []
1471 1471 (group
1472 1472 (group
1473 1473 (or
1474 1474 (or
1475 1475 (func
1476 1476 ('symbol', 'branch')
1477 1477 ('string', 'default'))
1478 1478 (func
1479 1479 ('symbol', 'branch')
1480 1480 ('string', 'branch')))
1481 1481 (func
1482 1482 ('symbol', 'branch')
1483 1483 ('string', 'branch')))))
1484 1484 $ testlog -k expand -k merge
1485 1485 []
1486 1486 (group
1487 1487 (group
1488 1488 (or
1489 1489 (func
1490 1490 ('symbol', 'keyword')
1491 1491 ('string', 'expand'))
1492 1492 (func
1493 1493 ('symbol', 'keyword')
1494 1494 ('string', 'merge')))))
1495 1495 $ testlog --only-merges
1496 1496 []
1497 1497 (group
1498 1498 (func
1499 1499 ('symbol', 'merge')
1500 1500 None))
1501 1501 $ testlog --no-merges
1502 1502 []
1503 1503 (group
1504 1504 (not
1505 1505 (func
1506 1506 ('symbol', 'merge')
1507 1507 None)))
1508 1508 $ testlog --date '2 0 to 4 0'
1509 1509 []
1510 1510 (group
1511 1511 (func
1512 1512 ('symbol', 'date')
1513 1513 ('string', '2 0 to 4 0')))
1514 1514 $ hg log -G -d 'brace ) in a date'
1515 1515 abort: invalid date: 'brace ) in a date'
1516 1516 [255]
1517 1517 $ testlog --prune 31 --prune 32
1518 1518 []
1519 1519 (group
1520 1520 (group
1521 1521 (and
1522 1522 (not
1523 1523 (group
1524 1524 (or
1525 1525 ('string', '31')
1526 1526 (func
1527 1527 ('symbol', 'ancestors')
1528 1528 ('string', '31')))))
1529 1529 (not
1530 1530 (group
1531 1531 (or
1532 1532 ('string', '32')
1533 1533 (func
1534 1534 ('symbol', 'ancestors')
1535 1535 ('string', '32'))))))))
1536 1536
1537 1537 Dedicated repo for --follow and paths filtering. The g is crafted to
1538 1538 have 2 filelog topological heads in a linear changeset graph.
1539 1539
1540 1540 $ cd ..
1541 1541 $ hg init follow
1542 1542 $ cd follow
1543 1543 $ testlog --follow
1544 1544 []
1545 1545 []
1546 1546 $ echo a > a
1547 1547 $ echo aa > aa
1548 1548 $ echo f > f
1549 1549 $ hg ci -Am "add a" a aa f
1550 1550 $ hg cp a b
1551 1551 $ hg cp f g
1552 1552 $ hg ci -m "copy a b"
1553 1553 $ mkdir dir
1554 1554 $ hg mv b dir
1555 1555 $ echo g >> g
1556 1556 $ echo f >> f
1557 1557 $ hg ci -m "mv b dir/b"
1558 1558 $ hg mv a b
1559 1559 $ hg cp -f f g
1560 1560 $ echo a > d
1561 1561 $ hg add d
1562 1562 $ hg ci -m "mv a b; add d"
1563 1563 $ hg mv dir/b e
1564 1564 $ hg ci -m "mv dir/b e"
1565 1565 $ hg glog --template '({rev}) {desc|firstline}\n'
1566 1566 @ (4) mv dir/b e
1567 1567 |
1568 1568 o (3) mv a b; add d
1569 1569 |
1570 1570 o (2) mv b dir/b
1571 1571 |
1572 1572 o (1) copy a b
1573 1573 |
1574 1574 o (0) add a
1575 1575
1576 1576
1577 1577 $ testlog a
1578 1578 []
1579 1579 (group
1580 1580 (group
1581 1581 (func
1582 1582 ('symbol', 'filelog')
1583 1583 ('string', 'a'))))
1584 1584 $ testlog a b
1585 1585 []
1586 1586 (group
1587 1587 (group
1588 1588 (or
1589 1589 (func
1590 1590 ('symbol', 'filelog')
1591 1591 ('string', 'a'))
1592 1592 (func
1593 1593 ('symbol', 'filelog')
1594 1594 ('string', 'b')))))
1595 1595
1596 1596 Test falling back to slow path for non-existing files
1597 1597
1598 1598 $ testlog a c
1599 1599 []
1600 1600 (group
1601 1601 (func
1602 1602 ('symbol', '_matchfiles')
1603 1603 (list
1604 1604 (list
1605 1605 (list
1606 1606 ('string', 'r:')
1607 1607 ('string', 'd:relpath'))
1608 1608 ('string', 'p:a'))
1609 1609 ('string', 'p:c'))))
1610 1610
1611 1611 Test multiple --include/--exclude/paths
1612 1612
1613 1613 $ testlog --include a --include e --exclude b --exclude e a e
1614 1614 []
1615 1615 (group
1616 1616 (func
1617 1617 ('symbol', '_matchfiles')
1618 1618 (list
1619 1619 (list
1620 1620 (list
1621 1621 (list
1622 1622 (list
1623 1623 (list
1624 1624 (list
1625 1625 ('string', 'r:')
1626 1626 ('string', 'd:relpath'))
1627 1627 ('string', 'p:a'))
1628 1628 ('string', 'p:e'))
1629 1629 ('string', 'i:a'))
1630 1630 ('string', 'i:e'))
1631 1631 ('string', 'x:b'))
1632 1632 ('string', 'x:e'))))
1633 1633
1634 1634 Test glob expansion of pats
1635 1635
1636 1636 $ expandglobs=`python -c "import mercurial.util; \
1637 1637 > print mercurial.util.expandglobs and 'true' or 'false'"`
1638 1638 $ if [ $expandglobs = "true" ]; then
1639 1639 > testlog 'a*';
1640 1640 > else
1641 1641 > testlog a*;
1642 1642 > fi;
1643 1643 []
1644 1644 (group
1645 1645 (group
1646 1646 (func
1647 1647 ('symbol', 'filelog')
1648 1648 ('string', 'aa'))))
1649 1649
1650 1650 Test --follow on a directory
1651 1651
1652 1652 $ testlog -f dir
1653 1653 abort: cannot follow file not in parent revision: "dir"
1654 1654 abort: cannot follow file not in parent revision: "dir"
1655 1655 abort: cannot follow file not in parent revision: "dir"
1656 1656
1657 1657 Test --follow on file not in parent revision
1658 1658
1659 1659 $ testlog -f a
1660 1660 abort: cannot follow file not in parent revision: "a"
1661 1661 abort: cannot follow file not in parent revision: "a"
1662 1662 abort: cannot follow file not in parent revision: "a"
1663 1663
1664 1664 Test --follow and patterns
1665 1665
1666 1666 $ testlog -f 'glob:*'
1667 1667 abort: can only follow copies/renames for explicit filenames
1668 1668 abort: can only follow copies/renames for explicit filenames
1669 1669 abort: can only follow copies/renames for explicit filenames
1670 1670
1671 1671 Test --follow on a single rename
1672 1672
1673 1673 $ hg up -q 2
1674 1674 $ testlog -f a
1675 1675 []
1676 1676 (group
1677 1677 (group
1678 1678 (func
1679 1679 ('symbol', 'follow')
1680 1680 ('string', 'a'))))
1681 1681
1682 1682 Test --follow and multiple renames
1683 1683
1684 1684 $ hg up -q tip
1685 1685 $ testlog -f e
1686 1686 []
1687 1687 (group
1688 1688 (group
1689 1689 (func
1690 1690 ('symbol', 'follow')
1691 1691 ('string', 'e'))))
1692 1692
1693 1693 Test --follow and multiple filelog heads
1694 1694
1695 1695 $ hg up -q 2
1696 1696 $ testlog -f g
1697 1697 []
1698 1698 (group
1699 1699 (group
1700 1700 (func
1701 1701 ('symbol', 'follow')
1702 1702 ('string', 'g'))))
1703 1703 $ cat log.nodes
1704 1704 nodetag 2
1705 1705 nodetag 1
1706 1706 nodetag 0
1707 1707 $ hg up -q tip
1708 1708 $ testlog -f g
1709 1709 []
1710 1710 (group
1711 1711 (group
1712 1712 (func
1713 1713 ('symbol', 'follow')
1714 1714 ('string', 'g'))))
1715 1715 $ cat log.nodes
1716 1716 nodetag 3
1717 1717 nodetag 2
1718 1718 nodetag 0
1719 1719
1720 1720 Test --follow and multiple files
1721 1721
1722 1722 $ testlog -f g e
1723 1723 []
1724 1724 (group
1725 1725 (group
1726 1726 (or
1727 1727 (func
1728 1728 ('symbol', 'follow')
1729 1729 ('string', 'g'))
1730 1730 (func
1731 1731 ('symbol', 'follow')
1732 1732 ('string', 'e')))))
1733 1733 $ cat log.nodes
1734 1734 nodetag 4
1735 1735 nodetag 3
1736 1736 nodetag 2
1737 1737 nodetag 1
1738 1738 nodetag 0
1739 1739
1740 1740 Test --follow-first
1741 1741
1742 1742 $ hg up -q 3
1743 1743 $ echo ee > e
1744 1744 $ hg ci -Am "add another e" e
1745 1745 created new head
1746 1746 $ hg merge --tool internal:other 4
1747 1747 0 files updated, 1 files merged, 1 files removed, 0 files unresolved
1748 1748 (branch merge, don't forget to commit)
1749 1749 $ echo merge > e
1750 1750 $ hg ci -m "merge 5 and 4"
1751 1751 $ testlog --follow-first
1752 1752 []
1753 1753 (group
1754 1754 (func
1755 1755 ('symbol', '_firstancestors')
1756 1756 ('symbol', '6')))
1757 1757
1758 1758 Cannot compare with log --follow-first FILE as it never worked
1759 1759
1760 1760 $ hg log -G --print-revset --follow-first e
1761 1761 []
1762 1762 (group
1763 1763 (group
1764 1764 (func
1765 1765 ('symbol', '_followfirst')
1766 1766 ('string', 'e'))))
1767 1767 $ hg log -G --follow-first e --template '{rev} {desc|firstline}\n'
1768 1768 @ 6 merge 5 and 4
1769 1769 |\
1770 1770 o | 5 add another e
1771 1771 | |
1772 1772
1773 1773 Test --copies
1774 1774
1775 1775 $ hg log -G --copies --template "{rev} {desc|firstline} \
1776 1776 > copies: {file_copies_switch}\n"
1777 1777 @ 6 merge 5 and 4 copies:
1778 1778 |\
1779 1779 | o 5 add another e copies:
1780 1780 | |
1781 1781 o | 4 mv dir/b e copies: e (dir/b)
1782 1782 |/
1783 1783 o 3 mv a b; add d copies: b (a)g (f)
1784 1784 |
1785 1785 o 2 mv b dir/b copies: dir/b (b)
1786 1786 |
1787 1787 o 1 copy a b copies: b (a)g (f)
1788 1788 |
1789 1789 o 0 add a copies:
1790 1790
1791 1791 Test "set:..." and parent revision
1792 1792
1793 1793 $ hg up -q 4
1794 1794 $ testlog "set:copied()"
1795 1795 []
1796 1796 (group
1797 1797 (func
1798 1798 ('symbol', '_matchfiles')
1799 1799 (list
1800 1800 (list
1801 1801 ('string', 'r:')
1802 1802 ('string', 'd:relpath'))
1803 1803 ('string', 'p:set:copied()'))))
1804 1804 $ testlog --include "set:copied()"
1805 1805 []
1806 1806 (group
1807 1807 (func
1808 1808 ('symbol', '_matchfiles')
1809 1809 (list
1810 1810 (list
1811 1811 ('string', 'r:')
1812 1812 ('string', 'd:relpath'))
1813 1813 ('string', 'i:set:copied()'))))
1814 1814 $ testlog -r "sort(file('set:copied()'), -rev)"
1815 1815 ["sort(file('set:copied()'), -rev)"]
1816 1816 []
1817 1817
1818 1818 Test --removed
1819 1819
1820 1820 $ testlog --removed
1821 1821 []
1822 1822 []
1823 1823 $ testlog --removed a
1824 1824 []
1825 1825 (group
1826 1826 (func
1827 1827 ('symbol', '_matchfiles')
1828 1828 (list
1829 1829 (list
1830 1830 ('string', 'r:')
1831 1831 ('string', 'd:relpath'))
1832 1832 ('string', 'p:a'))))
1833 1833 $ testlog --removed --follow a
1834 1834 abort: can only follow copies/renames for explicit filenames
1835 1835 abort: can only follow copies/renames for explicit filenames
1836 1836 abort: can only follow copies/renames for explicit filenames
1837 1837
1838 1838 Test --patch and --stat with --follow and --follow-first
1839 1839
1840 1840 $ hg up -q 3
1841 1841 $ hg log -G --git --patch b
1842 1842 o changeset: 1:216d4c92cf98
1843 1843 | user: test
1844 1844 | date: Thu Jan 01 00:00:00 1970 +0000
1845 1845 | summary: copy a b
1846 1846 |
1847 1847 | diff --git a/a b/b
1848 1848 | copy from a
1849 1849 | copy to b
1850 1850 |
1851 1851
1852 1852 $ hg log -G --git --stat b
1853 1853 o changeset: 1:216d4c92cf98
1854 1854 | user: test
1855 1855 | date: Thu Jan 01 00:00:00 1970 +0000
1856 1856 | summary: copy a b
1857 1857 |
1858 1858 | a | 0
1859 1859 | 1 files changed, 0 insertions(+), 0 deletions(-)
1860 1860 |
1861 1861
1862 1862 $ hg log -G --git --patch --follow b
1863 1863 o changeset: 1:216d4c92cf98
1864 1864 | user: test
1865 1865 | date: Thu Jan 01 00:00:00 1970 +0000
1866 1866 | summary: copy a b
1867 1867 |
1868 1868 | diff --git a/a b/b
1869 1869 | copy from a
1870 1870 | copy to b
1871 1871 |
1872 1872 o changeset: 0:f8035bb17114
1873 1873 user: test
1874 1874 date: Thu Jan 01 00:00:00 1970 +0000
1875 1875 summary: add a
1876 1876
1877 1877 diff --git a/a b/a
1878 1878 new file mode 100644
1879 1879 --- /dev/null
1880 1880 +++ b/a
1881 1881 @@ -0,0 +1,1 @@
1882 1882 +a
1883 1883
1884 1884
1885 1885 $ hg log -G --git --stat --follow b
1886 1886 o changeset: 1:216d4c92cf98
1887 1887 | user: test
1888 1888 | date: Thu Jan 01 00:00:00 1970 +0000
1889 1889 | summary: copy a b
1890 1890 |
1891 1891 | a | 0
1892 1892 | 1 files changed, 0 insertions(+), 0 deletions(-)
1893 1893 |
1894 1894 o changeset: 0:f8035bb17114
1895 1895 user: test
1896 1896 date: Thu Jan 01 00:00:00 1970 +0000
1897 1897 summary: add a
1898 1898
1899 1899 a | 1 +
1900 1900 1 files changed, 1 insertions(+), 0 deletions(-)
1901 1901
1902 1902
1903 1903 $ hg up -q 6
1904 1904 $ hg log -G --git --patch --follow-first e
1905 1905 @ changeset: 6:fc281d8ff18d
1906 1906 |\ tag: tip
1907 1907 | | parent: 5:99b31f1c2782
1908 1908 | | parent: 4:17d952250a9d
1909 1909 | | user: test
1910 1910 | | date: Thu Jan 01 00:00:00 1970 +0000
1911 1911 | | summary: merge 5 and 4
1912 1912 | |
1913 1913 | | diff --git a/e b/e
1914 1914 | | --- a/e
1915 1915 | | +++ b/e
1916 1916 | | @@ -1,1 +1,1 @@
1917 1917 | | -ee
1918 1918 | | +merge
1919 1919 | |
1920 1920 o | changeset: 5:99b31f1c2782
1921 1921 | | parent: 3:5918b8d165d1
1922 1922 | | user: test
1923 1923 | | date: Thu Jan 01 00:00:00 1970 +0000
1924 1924 | | summary: add another e
1925 1925 | |
1926 1926 | | diff --git a/e b/e
1927 1927 | | new file mode 100644
1928 1928 | | --- /dev/null
1929 1929 | | +++ b/e
1930 1930 | | @@ -0,0 +1,1 @@
1931 1931 | | +ee
1932 1932 | |
1933 1933
1934 1934 Test old-style --rev
1935 1935
1936 1936 $ hg tag 'foo-bar'
1937 1937 $ testlog -r 'foo-bar'
1938 1938 ['foo-bar']
1939 1939 []
1940 1940
1941 1941 Test --follow and forward --rev
1942 1942
1943 1943 $ hg up -q 6
1944 1944 $ echo g > g
1945 1945 $ hg ci -Am 'add g' g
1946 1946 created new head
1947 1947 $ hg up -q 2
1948 1948 $ hg log -G --template "{rev} {desc|firstline}\n"
1949 1949 o 8 add g
1950 1950 |
1951 1951 | o 7 Added tag foo-bar for changeset fc281d8ff18d
1952 1952 |/
1953 1953 o 6 merge 5 and 4
1954 1954 |\
1955 1955 | o 5 add another e
1956 1956 | |
1957 1957 o | 4 mv dir/b e
1958 1958 |/
1959 1959 o 3 mv a b; add d
1960 1960 |
1961 1961 @ 2 mv b dir/b
1962 1962 |
1963 1963 o 1 copy a b
1964 1964 |
1965 1965 o 0 add a
1966 1966
1967 1967 $ testlog --follow -r6 -r8 -r5 -r7 -r4
1968 1968 ['6', '8', '5', '7', '4']
1969 1969 (group
1970 1970 (func
1971 1971 ('symbol', 'descendants')
1972 1972 ('symbol', '6')))
1973 1973 --- log.nodes * (glob)
1974 1974 +++ glog.nodes * (glob)
1975 1975 @@ -1,3 +1,3 @@
1976 1976 -nodetag 6
1977 1977 nodetag 8
1978 1978 nodetag 7
1979 1979 +nodetag 6
1980 1980
1981 1981 Test --follow-first and forward --rev
1982 1982
1983 1983 $ testlog --follow-first -r6 -r8 -r5 -r7 -r4
1984 1984 ['6', '8', '5', '7', '4']
1985 1985 (group
1986 1986 (func
1987 1987 ('symbol', '_firstdescendants')
1988 1988 ('symbol', '6')))
1989 1989 --- log.nodes * (glob)
1990 1990 +++ glog.nodes * (glob)
1991 1991 @@ -1,3 +1,3 @@
1992 1992 -nodetag 6
1993 1993 nodetag 8
1994 1994 nodetag 7
1995 1995 +nodetag 6
1996 1996
1997 1997 Test --follow and backward --rev
1998 1998
1999 1999 $ testlog --follow -r6 -r5 -r7 -r8 -r4
2000 2000 ['6', '5', '7', '8', '4']
2001 2001 (group
2002 2002 (func
2003 2003 ('symbol', 'ancestors')
2004 2004 ('symbol', '6')))
2005 2005
2006 2006 Test --follow-first and backward --rev
2007 2007
2008 2008 $ testlog --follow-first -r6 -r5 -r7 -r8 -r4
2009 2009 ['6', '5', '7', '8', '4']
2010 2010 (group
2011 2011 (func
2012 2012 ('symbol', '_firstancestors')
2013 2013 ('symbol', '6')))
2014 2014
2015 2015 Test subdir
2016 2016
2017 2017 $ hg up -q 3
2018 2018 $ cd dir
2019 2019 $ testlog .
2020 2020 []
2021 2021 (group
2022 2022 (func
2023 2023 ('symbol', '_matchfiles')
2024 2024 (list
2025 2025 (list
2026 2026 ('string', 'r:')
2027 2027 ('string', 'd:relpath'))
2028 2028 ('string', 'p:.'))))
2029 2029 $ testlog ../b
2030 2030 []
2031 2031 (group
2032 2032 (group
2033 2033 (func
2034 2034 ('symbol', 'filelog')
2035 2035 ('string', '../b'))))
2036 2036 $ testlog -f ../b
2037 2037 []
2038 2038 (group
2039 2039 (group
2040 2040 (func
2041 2041 ('symbol', 'follow')
2042 2042 ('string', 'b'))))
2043 2043 $ cd ..
2044 2044
2045 2045 Test --hidden
2046 2046
2047 2047 $ cat > $HGTMP/testhidden.py << EOF
2048 2048 > def reposetup(ui, repo):
2049 2049 > for line in repo.opener('hidden'):
2050 2050 > ctx = repo[line.strip()]
2051 2051 > repo.changelog.hiddenrevs.add(ctx.rev())
2052 2052 > EOF
2053 2053 $ echo '[extensions]' >> .hg/hgrc
2054 2054 $ echo "hidden=$HGTMP/testhidden.py" >> .hg/hgrc
2055 2055 $ hg id --debug -i -r 0 > .hg/hidden
2056 2056 $ testlog
2057 2057 []
2058 2058 []
2059 2059 $ testlog --hidden
2060 2060 []
2061 2061 []
2062 2062
2063 A template without trailing newline should do something sane
2064
2065 $ hg glog -r ::2 --template '{rev} {desc}'
2066 o 2 mv b dir/b
2067 |
2068 o 1 copy a b
2069 |
2070
2071 Extra newlines must be preserved
2072
2073 $ hg glog -r ::2 --template '\n{rev} {desc}\n\n'
2074 o
2075 | 2 mv b dir/b
2076 |
2077 o
2078 | 1 copy a b
2079 |
2080
2081 The almost-empty template should do something sane too ...
2082
2083 $ hg glog -r ::2 --template '\n'
2084 o
2085 |
2086 o
2087 |
2088
2063 2089 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now