Show More
@@ -771,24 +771,89 b' def filelog(repo, subset, x):' | |||
|
771 | 771 | The pattern without explicit kind like ``glob:`` is expected to be |
|
772 | 772 | relative to the current directory and match against a file exactly |
|
773 | 773 | for efficiency. |
|
774 | ||
|
775 | If some linkrev points to revisions filtered by the current repoview, we'll | |
|
776 | work around it to return a non-filtered value. | |
|
774 | 777 | """ |
|
775 | 778 | |
|
776 | 779 | # i18n: "filelog" is a keyword |
|
777 | 780 | pat = getstring(x, _("filelog requires a pattern")) |
|
778 | 781 | s = set() |
|
782 | cl = repo.changelog | |
|
779 | 783 | |
|
780 | 784 | if not matchmod.patkind(pat): |
|
781 | 785 | f = pathutil.canonpath(repo.root, repo.getcwd(), pat) |
|
782 |
fl = |
|
|
783 | for fr in fl: | |
|
784 | s.add(fl.linkrev(fr)) | |
|
786 | files = [f] | |
|
785 | 787 | else: |
|
786 | 788 | m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=repo[None]) |
|
787 |
for f in repo[None] |
|
|
788 | if m(f): | |
|
789 | fl = repo.file(f) | |
|
790 | for fr in fl: | |
|
791 | s.add(fl.linkrev(fr)) | |
|
789 | files = (f for f in repo[None] if m(f)) | |
|
790 | ||
|
791 | for f in files: | |
|
792 | backrevref = {} # final value for: changerev -> filerev | |
|
793 | lowestchild = {} # lowest known filerev child of a filerev | |
|
794 | delayed = [] # filerev with filtered linkrev, for post-processing | |
|
795 | fl = repo.file(f) | |
|
796 | for fr in list(fl): | |
|
797 | lkr = rev = fl.linkrev(fr) | |
|
798 | if rev not in cl: | |
|
799 | # changerev pointed in linkrev is filtered | |
|
800 | # record it for post processing. | |
|
801 | delayed.append((fr, rev)) | |
|
802 | continue | |
|
803 | for p in fl.parentrevs(fr): | |
|
804 | if 0 <= p and p not in lowestchild: | |
|
805 | lowestchild[p] = fr | |
|
806 | backrevref[fr] = rev | |
|
807 | s.add(rev) | |
|
808 | ||
|
809 | # Post-processing of all filerevs we skipped because they were | |
|
810 | # filtered. If such filerevs have known and unfiltered children, this | |
|
811 | # means they have an unfiltered appearance out there. We'll use linkrev | |
|
812 | # adjustment to find one of these appearances. The lowest known child | |
|
813 | # will be used as a starting point because it is the best upper-bound we | |
|
814 | # have. | |
|
815 | # | |
|
816 | # This approach will fail when an unfiltered but linkrev-shadowed | |
|
817 | # appearance exists in a head changeset without unfiltered filerev | |
|
818 | # children anywhere. | |
|
819 | while delayed: | |
|
820 | # must be a descending iteration. To slowly fill lowest child | |
|
821 | # information that is of potential use by the next item. | |
|
822 | fr, rev = delayed.pop() | |
|
823 | lkr = rev | |
|
824 | ||
|
825 | child = lowestchild.get(fr) | |
|
826 | ||
|
827 | if child is None: | |
|
828 | # XXX content could be linkrev-shadowed in a head, but lets | |
|
829 | # ignore this case for now. | |
|
830 | continue | |
|
831 | else: | |
|
832 | # the lowest known child is a good upper bound | |
|
833 | childcrev = backrevref[child] | |
|
834 | # XXX this does not guarantee returning the lowest | |
|
835 | # introduction of this revision, but this gives a | |
|
836 | # result which is a good start and will fit in most | |
|
837 | # cases. We probably need to fix the multiple | |
|
838 | # introductions case properly (report each | |
|
839 | # introduction, even for identical file revisions) | |
|
840 | # once and for all at some point anyway. | |
|
841 | for p in repo[childcrev][f].parents(): | |
|
842 | if p.filerev() == fr: | |
|
843 | rev = p.rev() | |
|
844 | break | |
|
845 | if rev == lkr: # no shadowed entry found | |
|
846 | # XXX This should never happen unless some manifest points | |
|
847 | # to biggish file revisions (like a revision that uses a | |
|
848 | # parent that never appears in the manifest ancestors) | |
|
849 | continue | |
|
850 | ||
|
851 | # Fill the data for the next iteration. | |
|
852 | for p in fl.parentrevs(fr): | |
|
853 | if 0 <= p and p not in lowestchild: | |
|
854 | lowestchild[p] = fr | |
|
855 | backrevref[fr] = rev | |
|
856 | s.add(rev) | |
|
792 | 857 | |
|
793 | 858 | return subset & s |
|
794 | 859 |
@@ -1673,4 +1673,56 b' hg log -f from the grafted changeset' | |||
|
1673 | 1673 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
1674 | 1674 | summary: content1 |
|
1675 | 1675 | |
|
1676 | ||
|
1677 | Test that we use the first non-hidden changeset in that case. | |
|
1678 | ||
|
1679 | (hide the changeset) | |
|
1680 | ||
|
1681 | $ hg log -T '{node}\n' -r 1 | |
|
1682 | 2294ae80ad8447bc78383182eeac50cb049df623 | |
|
1683 | $ hg debugobsolete 2294ae80ad8447bc78383182eeac50cb049df623 | |
|
1684 | $ hg log -G | |
|
1685 | o changeset: 4:50b9b36e9c5d | |
|
1686 | | tag: tip | |
|
1687 | | user: test | |
|
1688 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1689 | | summary: content3 | |
|
1690 | | | |
|
1691 | @ changeset: 3:15b2327059e5 | |
|
1692 | | user: test | |
|
1693 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1694 | | summary: content2 | |
|
1695 | | | |
|
1696 | o changeset: 2:2029acd1168c | |
|
1697 | | parent: 0:ae0a3c9f9e95 | |
|
1698 | | user: test | |
|
1699 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1700 | | summary: unrelated | |
|
1701 | | | |
|
1702 | o changeset: 0:ae0a3c9f9e95 | |
|
1703 | user: test | |
|
1704 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1705 | summary: content1 | |
|
1706 | ||
|
1707 | ||
|
1708 | Check that log on the file does not drop the file revision. | |
|
1709 | ||
|
1710 | $ hg log -G a | |
|
1711 | o changeset: 4:50b9b36e9c5d | |
|
1712 | | tag: tip | |
|
1713 | | user: test | |
|
1714 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1715 | | summary: content3 | |
|
1716 | | | |
|
1717 | @ changeset: 3:15b2327059e5 | |
|
1718 | | user: test | |
|
1719 | | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1720 | | summary: content2 | |
|
1721 | | | |
|
1722 | o changeset: 0:ae0a3c9f9e95 | |
|
1723 | user: test | |
|
1724 | date: Thu Jan 01 00:00:00 1970 +0000 | |
|
1725 | summary: content1 | |
|
1726 | ||
|
1727 | ||
|
1676 | 1728 | $ cd .. |
General Comments 0
You need to be logged in to leave comments.
Login now