Mercurial > public > mercurial-scm > hg
comparison mercurial/mergestate.py @ 52028:09a54892b7ee
mergestate: reduce the number of attribute lookups
This code is called a lot during updates, this is a very small but also very
easy thing to do.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Wed, 21 Aug 2024 09:48:14 +0200 |
parents | f4733654f144 |
children | 5cc8deb96b48 |
comparison
equal
deleted
inserted
replaced
52025:921b8ad3feae | 52028:09a54892b7ee |
---|---|
778 fctx.write(self._backups[localkey], flags) | 778 fctx.write(self._backups[localkey], flags) |
779 | 779 |
780 | 780 |
781 def recordupdates(repo, actions, branchmerge, getfiledata): | 781 def recordupdates(repo, actions, branchmerge, getfiledata): |
782 """record merge actions to the dirstate""" | 782 """record merge actions to the dirstate""" |
783 dirstate = repo.dirstate | |
784 update_file = dirstate.update_file | |
785 | |
783 # remove (must come first) | 786 # remove (must come first) |
784 for f, args, msg in actions.get(ACTION_REMOVE, []): | 787 for f, args, msg in actions.get(ACTION_REMOVE, []): |
785 if branchmerge: | 788 if branchmerge: |
786 repo.dirstate.update_file(f, p1_tracked=True, wc_tracked=False) | 789 update_file(f, p1_tracked=True, wc_tracked=False) |
787 else: | 790 else: |
788 repo.dirstate.update_file(f, p1_tracked=False, wc_tracked=False) | 791 update_file(f, p1_tracked=False, wc_tracked=False) |
789 | 792 |
790 # forget (must come first) | 793 # forget (must come first) |
791 for f, args, msg in actions.get(ACTION_FORGET, []): | 794 for f, args, msg in actions.get(ACTION_FORGET, []): |
792 repo.dirstate.update_file(f, p1_tracked=False, wc_tracked=False) | 795 update_file(f, p1_tracked=False, wc_tracked=False) |
793 | 796 |
794 # resolve path conflicts | 797 # resolve path conflicts |
795 for f, args, msg in actions.get(ACTION_PATH_CONFLICT_RESOLVE, []): | 798 for f, args, msg in actions.get(ACTION_PATH_CONFLICT_RESOLVE, []): |
796 (f0, origf0) = args | 799 (f0, origf0) = args |
797 repo.dirstate.update_file(f, p1_tracked=False, wc_tracked=True) | 800 update_file(f, p1_tracked=False, wc_tracked=True) |
798 repo.dirstate.copy(origf0, f) | 801 dirstate.copy(origf0, f) |
799 if f0 == origf0: | 802 if f0 == origf0: |
800 repo.dirstate.update_file(f0, p1_tracked=True, wc_tracked=False) | 803 update_file(f0, p1_tracked=True, wc_tracked=False) |
801 else: | 804 else: |
802 repo.dirstate.update_file(f0, p1_tracked=False, wc_tracked=False) | 805 update_file(f0, p1_tracked=False, wc_tracked=False) |
803 | 806 |
804 # re-add | 807 # re-add |
805 for f, args, msg in actions.get(ACTION_ADD, []): | 808 for f, args, msg in actions.get(ACTION_ADD, []): |
806 repo.dirstate.update_file(f, p1_tracked=False, wc_tracked=True) | 809 update_file(f, p1_tracked=False, wc_tracked=True) |
807 | 810 |
808 # re-add/mark as modified | 811 # re-add/mark as modified |
809 for f, args, msg in actions.get(ACTION_ADD_MODIFIED, []): | 812 for f, args, msg in actions.get(ACTION_ADD_MODIFIED, []): |
810 if branchmerge: | 813 if branchmerge: |
811 repo.dirstate.update_file( | 814 update_file( |
812 f, p1_tracked=True, wc_tracked=True, possibly_dirty=True | 815 f, p1_tracked=True, wc_tracked=True, possibly_dirty=True |
813 ) | 816 ) |
814 else: | 817 else: |
815 repo.dirstate.update_file(f, p1_tracked=False, wc_tracked=True) | 818 update_file(f, p1_tracked=False, wc_tracked=True) |
816 | 819 |
817 # exec change | 820 # exec change |
818 for f, args, msg in actions.get(ACTION_EXEC, []): | 821 for f, args, msg in actions.get(ACTION_EXEC, []): |
819 repo.dirstate.update_file( | 822 update_file(f, p1_tracked=True, wc_tracked=True, possibly_dirty=True) |
820 f, p1_tracked=True, wc_tracked=True, possibly_dirty=True | |
821 ) | |
822 | 823 |
823 # keep | 824 # keep |
824 for f, args, msg in actions.get(ACTION_KEEP, []): | 825 for f, args, msg in actions.get(ACTION_KEEP, []): |
825 pass | 826 pass |
826 | 827 |
834 | 835 |
835 # get | 836 # get |
836 for f, args, msg in actions.get(ACTION_GET, []): | 837 for f, args, msg in actions.get(ACTION_GET, []): |
837 if branchmerge: | 838 if branchmerge: |
838 # tracked in p1 can be True also but update_file should not care | 839 # tracked in p1 can be True also but update_file should not care |
839 old_entry = repo.dirstate.get_entry(f) | 840 old_entry = dirstate.get_entry(f) |
840 p1_tracked = old_entry.any_tracked and not old_entry.added | 841 p1_tracked = old_entry.any_tracked and not old_entry.added |
841 repo.dirstate.update_file( | 842 update_file( |
842 f, | 843 f, |
843 p1_tracked=p1_tracked, | 844 p1_tracked=p1_tracked, |
844 wc_tracked=True, | 845 wc_tracked=True, |
845 p2_info=True, | 846 p2_info=True, |
846 ) | 847 ) |
847 else: | 848 else: |
848 parentfiledata = getfiledata[f] if getfiledata else None | 849 parentfiledata = getfiledata[f] if getfiledata else None |
849 repo.dirstate.update_file( | 850 update_file( |
850 f, | 851 f, |
851 p1_tracked=True, | 852 p1_tracked=True, |
852 wc_tracked=True, | 853 wc_tracked=True, |
853 parentfiledata=parentfiledata, | 854 parentfiledata=parentfiledata, |
854 ) | 855 ) |
858 f1, f2, fa, move, anc = args | 859 f1, f2, fa, move, anc = args |
859 if branchmerge: | 860 if branchmerge: |
860 # We've done a branch merge, mark this file as merged | 861 # We've done a branch merge, mark this file as merged |
861 # so that we properly record the merger later | 862 # so that we properly record the merger later |
862 p1_tracked = f1 == f | 863 p1_tracked = f1 == f |
863 repo.dirstate.update_file( | 864 update_file( |
864 f, | 865 f, |
865 p1_tracked=p1_tracked, | 866 p1_tracked=p1_tracked, |
866 wc_tracked=True, | 867 wc_tracked=True, |
867 p2_info=True, | 868 p2_info=True, |
868 ) | 869 ) |
869 if f1 != f2: # copy/rename | 870 if f1 != f2: # copy/rename |
870 if move: | 871 if move: |
871 repo.dirstate.update_file( | 872 update_file(f1, p1_tracked=True, wc_tracked=False) |
872 f1, p1_tracked=True, wc_tracked=False | |
873 ) | |
874 if f1 != f: | 873 if f1 != f: |
875 repo.dirstate.copy(f1, f) | 874 dirstate.copy(f1, f) |
876 else: | 875 else: |
877 repo.dirstate.copy(f2, f) | 876 dirstate.copy(f2, f) |
878 else: | 877 else: |
879 # We've update-merged a locally modified file, so | 878 # We've update-merged a locally modified file, so |
880 # we set the dirstate to emulate a normal checkout | 879 # we set the dirstate to emulate a normal checkout |
881 # of that file some time in the past. Thus our | 880 # of that file some time in the past. Thus our |
882 # merge will appear as a normal local file | 881 # merge will appear as a normal local file |
883 # modification. | 882 # modification. |
884 if f2 == f: # file not locally copied/moved | 883 if f2 == f: # file not locally copied/moved |
885 repo.dirstate.update_file( | 884 update_file( |
886 f, p1_tracked=True, wc_tracked=True, possibly_dirty=True | 885 f, p1_tracked=True, wc_tracked=True, possibly_dirty=True |
887 ) | 886 ) |
888 if move: | 887 if move: |
889 repo.dirstate.update_file( | 888 update_file(f1, p1_tracked=False, wc_tracked=False) |
890 f1, p1_tracked=False, wc_tracked=False | |
891 ) | |
892 | 889 |
893 # directory rename, move local | 890 # directory rename, move local |
894 for f, args, msg in actions.get(ACTION_DIR_RENAME_MOVE_LOCAL, []): | 891 for f, args, msg in actions.get(ACTION_DIR_RENAME_MOVE_LOCAL, []): |
895 f0, flag = args | 892 f0, flag = args |
896 if branchmerge: | 893 if branchmerge: |
897 repo.dirstate.update_file(f, p1_tracked=False, wc_tracked=True) | 894 update_file(f, p1_tracked=False, wc_tracked=True) |
898 repo.dirstate.update_file(f0, p1_tracked=True, wc_tracked=False) | 895 update_file(f0, p1_tracked=True, wc_tracked=False) |
899 repo.dirstate.copy(f0, f) | 896 dirstate.copy(f0, f) |
900 else: | 897 else: |
901 repo.dirstate.update_file(f, p1_tracked=True, wc_tracked=True) | 898 update_file(f, p1_tracked=True, wc_tracked=True) |
902 repo.dirstate.update_file(f0, p1_tracked=False, wc_tracked=False) | 899 update_file(f0, p1_tracked=False, wc_tracked=False) |
903 | 900 |
904 # directory rename, get | 901 # directory rename, get |
905 for f, args, msg in actions.get(ACTION_LOCAL_DIR_RENAME_GET, []): | 902 for f, args, msg in actions.get(ACTION_LOCAL_DIR_RENAME_GET, []): |
906 f0, flag = args | 903 f0, flag = args |
907 if branchmerge: | 904 if branchmerge: |
908 repo.dirstate.update_file(f, p1_tracked=False, wc_tracked=True) | 905 update_file(f, p1_tracked=False, wc_tracked=True) |
909 repo.dirstate.copy(f0, f) | 906 dirstate.copy(f0, f) |
910 else: | 907 else: |
911 repo.dirstate.update_file(f, p1_tracked=True, wc_tracked=True) | 908 update_file(f, p1_tracked=True, wc_tracked=True) |