1455 if stopiteration: |
1455 if stopiteration: |
1456 break |
1456 break |
1457 |
1457 |
1458 return iterate() |
1458 return iterate() |
1459 |
1459 |
1460 def _makegraphfilematcher(repo, pats, followfirst): |
1460 def _makelogfilematcher(repo, pats, followfirst): |
1461 # When displaying a revision with --patch --follow FILE, we have |
1461 # When displaying a revision with --patch --follow FILE, we have |
1462 # to know which file of the revision must be diffed. With |
1462 # to know which file of the revision must be diffed. With |
1463 # --follow, we want the names of the ancestors of FILE in the |
1463 # --follow, we want the names of the ancestors of FILE in the |
1464 # revision, stored in "fcache". "fcache" is populated by |
1464 # revision, stored in "fcache". "fcache" is populated by |
1465 # reproducing the graph traversal already done by --follow revset |
1465 # reproducing the graph traversal already done by --follow revset |
1483 populate() |
1483 populate() |
1484 return scmutil.match(wctx, fcache.get(rev, []), default='path') |
1484 return scmutil.match(wctx, fcache.get(rev, []), default='path') |
1485 |
1485 |
1486 return filematcher |
1486 return filematcher |
1487 |
1487 |
1488 def _makegraphlogrevset(repo, pats, opts, revs): |
1488 def _makelogrevset(repo, pats, opts, revs): |
1489 """Return (expr, filematcher) where expr is a revset string built |
1489 """Return (expr, filematcher) where expr is a revset string built |
1490 from log options and file patterns or None. If --stat or --patch |
1490 from log options and file patterns or None. If --stat or --patch |
1491 are not passed filematcher is None. Otherwise it is a callable |
1491 are not passed filematcher is None. Otherwise it is a callable |
1492 taking a revision number and returning a match objects filtering |
1492 taking a revision number and returning a match objects filtering |
1493 the files to be detailed when displaying the revision. |
1493 the files to be detailed when displaying the revision. |
1594 opts['_patslog'] = list(pats) |
1594 opts['_patslog'] = list(pats) |
1595 |
1595 |
1596 filematcher = None |
1596 filematcher = None |
1597 if opts.get('patch') or opts.get('stat'): |
1597 if opts.get('patch') or opts.get('stat'): |
1598 if follow: |
1598 if follow: |
1599 filematcher = _makegraphfilematcher(repo, pats, followfirst) |
1599 filematcher = _makelogfilematcher(repo, pats, followfirst) |
1600 else: |
1600 else: |
1601 filematcher = lambda rev: match |
1601 filematcher = lambda rev: match |
1602 |
1602 |
1603 expr = [] |
1603 expr = [] |
1604 for op, val in opts.iteritems(): |
1604 for op, val in opts.iteritems(): |
1637 # depends on revisions resolved from --rev... |
1637 # depends on revisions resolved from --rev... |
1638 follow = opts.get('follow') or opts.get('follow_first') |
1638 follow = opts.get('follow') or opts.get('follow_first') |
1639 possiblyunsorted = False # whether revs might need sorting |
1639 possiblyunsorted = False # whether revs might need sorting |
1640 if opts.get('rev'): |
1640 if opts.get('rev'): |
1641 revs = scmutil.revrange(repo, opts['rev']) |
1641 revs = scmutil.revrange(repo, opts['rev']) |
1642 # Don't sort here because _makegraphlogrevset might depend on the |
1642 # Don't sort here because _makelogrevset might depend on the |
1643 # order of revs |
1643 # order of revs |
1644 possiblyunsorted = True |
1644 possiblyunsorted = True |
1645 else: |
1645 else: |
1646 if follow and len(repo) > 0: |
1646 if follow and len(repo) > 0: |
1647 revs = repo.revs('reverse(:.)') |
1647 revs = repo.revs('reverse(:.)') |
1648 else: |
1648 else: |
1649 revs = revset.spanset(repo) |
1649 revs = revset.spanset(repo) |
1650 revs.reverse() |
1650 revs.reverse() |
1651 if not revs: |
1651 if not revs: |
1652 return revset.baseset(), None, None |
1652 return revset.baseset(), None, None |
1653 expr, filematcher = _makegraphlogrevset(repo, pats, opts, revs) |
1653 expr, filematcher = _makelogrevset(repo, pats, opts, revs) |
1654 if possiblyunsorted: |
1654 if possiblyunsorted: |
1655 revs.sort(reverse=True) |
1655 revs.sort(reverse=True) |
1656 if expr: |
1656 if expr: |
1657 # Revset matchers often operate faster on revisions in changelog |
1657 # Revset matchers often operate faster on revisions in changelog |
1658 # order, because most filters deal with the changelog. |
1658 # order, because most filters deal with the changelog. |