Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/logcmdutil.py @ 36043:dd77e36eabb6
logcmdutil: create hunksfilter and filematcher even if no diff option given
It's okay since 5fe6f946f111, "log: allow matchfn to be non-null even if both
--patch/--stat are off."
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 21 Jan 2018 15:34:37 +0900 |
parents | d4c210ee894f |
children | 29b83c08afe0 |
comparison
equal
deleted
inserted
replaced
36042:d4c210ee894f | 36043:dd77e36eabb6 |
---|---|
790 "revs" are revisions obtained by processing "line-range" log options and | 790 "revs" are revisions obtained by processing "line-range" log options and |
791 walking block ancestors of each specified file/line-range. | 791 walking block ancestors of each specified file/line-range. |
792 | 792 |
793 "filematcher(ctx) -> match" is a factory function returning a match object | 793 "filematcher(ctx) -> match" is a factory function returning a match object |
794 for a given revision for file patterns specified in --line-range option. | 794 for a given revision for file patterns specified in --line-range option. |
795 If neither --stat nor --patch options are passed, "filematcher" is None. | |
796 | 795 |
797 "hunksfilter(ctx) -> filterfn(fctx, hunks)" is a factory function | 796 "hunksfilter(ctx) -> filterfn(fctx, hunks)" is a factory function |
798 returning a hunks filtering function. | 797 returning a hunks filtering function. |
799 If neither --stat nor --patch options are passed, "filterhunks" is None. | |
800 """ | 798 """ |
801 wctx = repo[None] | 799 wctx = repo[None] |
802 | 800 |
803 # Two-levels map of "rev -> file ctx -> [line range]". | 801 # Two-levels map of "rev -> file ctx -> [line range]". |
804 linerangesbyrev = {} | 802 linerangesbyrev = {} |
813 continue | 811 continue |
814 linerangesbyrev.setdefault( | 812 linerangesbyrev.setdefault( |
815 rev, {}).setdefault( | 813 rev, {}).setdefault( |
816 fctx.path(), []).append(linerange) | 814 fctx.path(), []).append(linerange) |
817 | 815 |
818 filematcher = None | 816 def nofilterhunksfn(fctx, hunks): |
819 hunksfilter = None | 817 return hunks |
820 if opts.get('patch') or opts.get('stat'): | 818 |
821 | 819 def hunksfilter(ctx): |
822 def nofilterhunksfn(fctx, hunks): | 820 fctxlineranges = linerangesbyrev.get(ctx.rev()) |
823 return hunks | 821 if fctxlineranges is None: |
824 | 822 return nofilterhunksfn |
825 def hunksfilter(ctx): | 823 |
826 fctxlineranges = linerangesbyrev.get(ctx.rev()) | 824 def filterfn(fctx, hunks): |
827 if fctxlineranges is None: | 825 lineranges = fctxlineranges.get(fctx.path()) |
828 return nofilterhunksfn | 826 if lineranges is not None: |
829 | 827 for hr, lines in hunks: |
830 def filterfn(fctx, hunks): | 828 if hr is None: # binary |
831 lineranges = fctxlineranges.get(fctx.path()) | 829 yield hr, lines |
832 if lineranges is not None: | 830 continue |
833 for hr, lines in hunks: | 831 if any(mdiff.hunkinrange(hr[2:], lr) |
834 if hr is None: # binary | 832 for lr in lineranges): |
835 yield hr, lines | 833 yield hr, lines |
836 continue | 834 else: |
837 if any(mdiff.hunkinrange(hr[2:], lr) | 835 for hunk in hunks: |
838 for lr in lineranges): | 836 yield hunk |
839 yield hr, lines | 837 |
840 else: | 838 return filterfn |
841 for hunk in hunks: | 839 |
842 yield hunk | 840 def filematcher(ctx): |
843 | 841 files = list(linerangesbyrev.get(ctx.rev(), [])) |
844 return filterfn | 842 return scmutil.matchfiles(repo, files) |
845 | |
846 def filematcher(ctx): | |
847 files = list(linerangesbyrev.get(ctx.rev(), [])) | |
848 return scmutil.matchfiles(repo, files) | |
849 | 843 |
850 revs = sorted(linerangesbyrev, reverse=True) | 844 revs = sorted(linerangesbyrev, reverse=True) |
851 | 845 |
852 return revs, filematcher, hunksfilter | 846 return revs, filematcher, hunksfilter |
853 | 847 |