Show More
@@ -242,8 +242,40 b' def check_unsupported_flags(pats, opts):' | |||
|
242 | 242 | raise util.Abort(_("-G/--graph option is incompatible with --%s") |
|
243 | 243 | % op.replace("_", "-")) |
|
244 | 244 | |
|
245 | def makefilematcher(repo, pats, followfirst): | |
|
246 | # When displaying a revision with --patch --follow FILE, we have | |
|
247 | # to know which file of the revision must be diffed. With | |
|
248 | # --follow, we want the names of the ancestors of FILE in the | |
|
249 | # revision, stored in "fcache". "fcache" is populated by | |
|
250 | # reproducing the graph traversal already done by --follow revset | |
|
251 | # and relating linkrevs to file names (which is not "correct" but | |
|
252 | # good enough). | |
|
253 | fcache = {} | |
|
254 | fcacheready = [False] | |
|
255 | pctx = repo['.'] | |
|
256 | wctx = repo[None] | |
|
257 | ||
|
258 | def populate(): | |
|
259 | for fn in pats: | |
|
260 | for i in ((pctx[fn],), pctx[fn].ancestors(followfirst=followfirst)): | |
|
261 | for c in i: | |
|
262 | fcache.setdefault(c.linkrev(), set()).add(c.path()) | |
|
263 | ||
|
264 | def filematcher(rev): | |
|
265 | if not fcacheready[0]: | |
|
266 | # Lazy initialization | |
|
267 | fcacheready[0] = True | |
|
268 | populate() | |
|
269 | return scmutil.match(wctx, fcache.get(rev, []), default='path') | |
|
270 | ||
|
271 | return filematcher | |
|
272 | ||
|
245 | 273 | def revset(repo, pats, opts): |
|
246 | """Return revset str built of revisions, log options and file patterns. | |
|
274 | """Return (expr, filematcher) where expr is a revset string built | |
|
275 | of revisions, log options and file patterns. If --stat or --patch | |
|
276 | are not passed filematcher is None. Otherwise it a a callable | |
|
277 | taking a revision number and returning a match objects filtering | |
|
278 | the files to be detailed when displaying the revision. | |
|
247 | 279 | """ |
|
248 | 280 | opt2revset = { |
|
249 | 281 | 'follow': ('follow()', None), |
@@ -329,6 +361,13 b' def revset(repo, pats, opts):' | |||
|
329 | 361 | else: |
|
330 | 362 | opts['_patslog'] = list(pats) |
|
331 | 363 | |
|
364 | filematcher = None | |
|
365 | if opts.get('patch') or opts.get('stat'): | |
|
366 | if follow: | |
|
367 | filematcher = makefilematcher(repo, pats, followfirst) | |
|
368 | else: | |
|
369 | filematcher = lambda rev: match | |
|
370 | ||
|
332 | 371 | revset = [] |
|
333 | 372 | for op, val in opts.iteritems(): |
|
334 | 373 | if not val: |
@@ -349,9 +388,10 b' def revset(repo, pats, opts):' | |||
|
349 | 388 | revset = '(' + ' and '.join(revset) + ')' |
|
350 | 389 | else: |
|
351 | 390 | revset = 'all()' |
|
352 | return revset | |
|
391 | return revset, filematcher | |
|
353 | 392 | |
|
354 |
def generate(ui, dag, displayer, showparents, edgefn, getrenamed=None |
|
|
393 | def generate(ui, dag, displayer, showparents, edgefn, getrenamed=None, | |
|
394 | filematcher=None): | |
|
355 | 395 | seen, state = [], asciistate() |
|
356 | 396 | for rev, type, ctx, parents in dag: |
|
357 | 397 | char = ctx.node() in showparents and '@' or 'o' |
@@ -362,7 +402,10 b' def generate(ui, dag, displayer, showpar' | |||
|
362 | 402 | rename = getrenamed(fn, ctx.rev()) |
|
363 | 403 | if rename: |
|
364 | 404 | copies.append((fn, rename[0])) |
|
365 | displayer.show(ctx, copies=copies) | |
|
405 | revmatchfn = None | |
|
406 | if filematcher is not None: | |
|
407 | revmatchfn = filematcher(ctx.rev()) | |
|
408 | displayer.show(ctx, copies=copies, matchfn=revmatchfn) | |
|
366 | 409 | lines = displayer.hunk.pop(rev).split('\n')[:-1] |
|
367 | 410 | displayer.flush(rev) |
|
368 | 411 | edges = edgefn(type, char, lines, seen, rev, parents) |
@@ -389,7 +432,8 b' def graphlog(ui, repo, *pats, **opts):' | |||
|
389 | 432 | |
|
390 | 433 | check_unsupported_flags(pats, opts) |
|
391 | 434 | |
|
392 | revs = sorted(scmutil.revrange(repo, [revset(repo, pats, opts)]), reverse=1) | |
|
435 | expr, filematcher = revset(repo, pats, opts) | |
|
436 | revs = sorted(scmutil.revrange(repo, [expr]), reverse=1) | |
|
393 | 437 | limit = cmdutil.loglimit(opts) |
|
394 | 438 | if limit is not None: |
|
395 | 439 | revs = revs[:limit] |
@@ -403,7 +447,8 b' def graphlog(ui, repo, *pats, **opts):' | |||
|
403 | 447 | getrenamed = templatekw.getrenamedfn(repo, endrev=endrev) |
|
404 | 448 | displayer = show_changeset(ui, repo, opts, buffered=True) |
|
405 | 449 | showparents = [ctx.node() for ctx in repo[None].parents()] |
|
406 |
generate(ui, revdag, displayer, showparents, asciiedges, getrenamed |
|
|
450 | generate(ui, revdag, displayer, showparents, asciiedges, getrenamed, | |
|
451 | filematcher) | |
|
407 | 452 | |
|
408 | 453 | def graphrevs(repo, nodes, opts): |
|
409 | 454 | limit = cmdutil.loglimit(opts) |
@@ -90,7 +90,7 b' o (0) root' | |||
|
90 | 90 | > def uisetup(ui): |
|
91 | 91 | > def printrevset(orig, ui, repo, *pats, **opts): |
|
92 | 92 | > if opts.get('print_revset'): |
|
93 | > expr = graphlog.revset(repo, pats, opts) | |
|
93 | > expr = graphlog.revset(repo, pats, opts)[0] | |
|
94 | 94 | > tree = revset.parse(expr)[0] |
|
95 | 95 | > ui.write(tree, "\n") |
|
96 | 96 | > return 0 |
@@ -1655,3 +1655,99 b' Test --removed' | |||
|
1655 | 1655 | abort: can only follow copies/renames for explicit filenames |
|
1656 | 1656 | abort: can only follow copies/renames for explicit filenames |
|
1657 | 1657 | abort: can only follow copies/renames for explicit filenames |
|
1658 | ||
|
1659 | Test --patch and --stat with --follow and --follow-first | |
|
1660 | ||
|
1661 | $ hg up -q 3 | |
|
1662 | $ hg log -G --git --patch b | |
|
1663 | o changeset: 1:216d4c92cf98 | |
|
1664 | | user: test | |
|
1665 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1666 | | summary: copy a b | |
|
1667 | | | |
|
1668 | | diff --git a/a b/b | |
|
1669 | | copy from a | |
|
1670 | | copy to b | |
|
1671 | | | |
|
1672 | ||
|
1673 | $ hg log -G --git --stat b | |
|
1674 | o changeset: 1:216d4c92cf98 | |
|
1675 | | user: test | |
|
1676 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1677 | | summary: copy a b | |
|
1678 | | | |
|
1679 | | a | 0 | |
|
1680 | | 1 files changed, 0 insertions(+), 0 deletions(-) | |
|
1681 | | | |
|
1682 | ||
|
1683 | $ hg log -G --git --patch --follow b | |
|
1684 | o changeset: 1:216d4c92cf98 | |
|
1685 | | user: test | |
|
1686 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1687 | | summary: copy a b | |
|
1688 | | | |
|
1689 | | diff --git a/a b/b | |
|
1690 | | copy from a | |
|
1691 | | copy to b | |
|
1692 | | | |
|
1693 | o changeset: 0:f8035bb17114 | |
|
1694 | user: test | |
|
1695 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1696 | summary: add a | |
|
1697 | ||
|
1698 | diff --git a/a b/a | |
|
1699 | new file mode 100644 | |
|
1700 | --- /dev/null | |
|
1701 | +++ b/a | |
|
1702 | @@ -0,0 +1,1 @@ | |
|
1703 | +a | |
|
1704 | ||
|
1705 | ||
|
1706 | $ hg log -G --git --stat --follow b | |
|
1707 | o changeset: 1:216d4c92cf98 | |
|
1708 | | user: test | |
|
1709 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1710 | | summary: copy a b | |
|
1711 | | | |
|
1712 | | a | 0 | |
|
1713 | | 1 files changed, 0 insertions(+), 0 deletions(-) | |
|
1714 | | | |
|
1715 | o changeset: 0:f8035bb17114 | |
|
1716 | user: test | |
|
1717 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1718 | summary: add a | |
|
1719 | ||
|
1720 | a | 1 + | |
|
1721 | 1 files changed, 1 insertions(+), 0 deletions(-) | |
|
1722 | ||
|
1723 | ||
|
1724 | $ hg up -q 6 | |
|
1725 | $ hg log -G --git --patch --follow-first e | |
|
1726 | @ changeset: 6:fc281d8ff18d | |
|
1727 | |\ tag: tip | |
|
1728 | | | parent: 5:99b31f1c2782 | |
|
1729 | | | parent: 4:17d952250a9d | |
|
1730 | | | user: test | |
|
1731 | | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1732 | | | summary: merge 5 and 4 | |
|
1733 | | | | |
|
1734 | | | diff --git a/e b/e | |
|
1735 | | | --- a/e | |
|
1736 | | | +++ b/e | |
|
1737 | | | @@ -1,1 +1,1 @@ | |
|
1738 | | | -ee | |
|
1739 | | | +merge | |
|
1740 | | | | |
|
1741 | o | changeset: 5:99b31f1c2782 | |
|
1742 | | | parent: 3:5918b8d165d1 | |
|
1743 | | | user: test | |
|
1744 | | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1745 | | | summary: add another e | |
|
1746 | | | | |
|
1747 | | | diff --git a/e b/e | |
|
1748 | | | new file mode 100644 | |
|
1749 | | | --- /dev/null | |
|
1750 | | | +++ b/e | |
|
1751 | | | @@ -0,0 +1,1 @@ | |
|
1752 | | | +ee | |
|
1753 | | | |
General Comments 0
You need to be logged in to leave comments.
Login now