816 if '.hgsubstate' in m1: |
817 if '.hgsubstate' in m1: |
817 # check whether sub state is modified |
818 # check whether sub state is modified |
818 if any(wctx.sub(s).dirty() for s in wctx.substate): |
819 if any(wctx.sub(s).dirty() for s in wctx.substate): |
819 m1['.hgsubstate'] = modifiednodeid |
820 m1['.hgsubstate'] = modifiednodeid |
820 |
821 |
821 # Compare manifests |
822 diff = m1.diff(m2, match=matcher) |
822 if matcher is not None: |
823 |
823 m1 = m1.matches(matcher) |
824 if matcher is None: |
824 m2 = m2.matches(matcher) |
825 matcher = matchmod.always('', '') |
825 diff = m1.diff(m2) |
|
826 |
826 |
827 actions = {} |
827 actions = {} |
828 for f, ((n1, fl1), (n2, fl2)) in diff.iteritems(): |
828 for f, ((n1, fl1), (n2, fl2)) in diff.iteritems(): |
829 if n1 and n2: # file exists on both local and remote side |
829 if n1 and n2: # file exists on both local and remote side |
830 if f not in ma: |
830 if f not in ma: |
856 elif n1: # file exists only on local side |
856 elif n1: # file exists only on local side |
857 if f in copied: |
857 if f in copied: |
858 pass # we'll deal with it on m2 side |
858 pass # we'll deal with it on m2 side |
859 elif f in movewithdir: # directory rename, move local |
859 elif f in movewithdir: # directory rename, move local |
860 f2 = movewithdir[f] |
860 f2 = movewithdir[f] |
861 if f2 in m2: |
861 if matcher(f2) and f2 in m2: |
862 actions[f2] = ('m', (f, f2, None, True, pa.node()), |
862 actions[f2] = ('m', (f, f2, None, True, pa.node()), |
863 "remote directory rename, both created") |
863 "remote directory rename, both created") |
864 else: |
864 else: |
865 actions[f2] = ('dm', (f, fl1), |
865 actions[f2] = ('dm', (f, fl1), |
866 "remote directory rename - move from " + f) |
866 "remote directory rename - move from " + f) |
885 elif n2: # file exists only on remote side |
885 elif n2: # file exists only on remote side |
886 if f in copied: |
886 if f in copied: |
887 pass # we'll deal with it on m1 side |
887 pass # we'll deal with it on m1 side |
888 elif f in movewithdir: |
888 elif f in movewithdir: |
889 f2 = movewithdir[f] |
889 f2 = movewithdir[f] |
890 if f2 in m1: |
890 if matcher(f2) and f2 in m1: |
891 actions[f2] = ('m', (f2, f, None, False, pa.node()), |
891 actions[f2] = ('m', (f2, f, None, False, pa.node()), |
892 "local directory rename, both created") |
892 "local directory rename, both created") |
893 else: |
893 else: |
894 actions[f2] = ('dg', (f, fl2), |
894 actions[f2] = ('dg', (f, fl2), |
895 "local directory rename - get from " + f) |
895 "local directory rename - get from " + f) |
896 elif f in copy: |
896 elif f in copy: |
897 f2 = copy[f] |
897 f2 = copy[f] |
898 if f2 in m2: |
898 if matcher(f2) and f2 in m2: |
899 actions[f] = ('m', (f2, f, f2, False, pa.node()), |
899 actions[f] = ('m', (f2, f, f2, False, pa.node()), |
900 "remote copied from " + f2) |
900 "remote copied from " + f2) |
901 else: |
901 else: |
902 actions[f] = ('m', (f2, f, f2, True, pa.node()), |
902 actions[f] = ('m', (f2, f, f2, True, pa.node()), |
903 "remote moved from " + f2) |
903 "remote moved from " + f2) |
925 for d in dirmove: |
925 for d in dirmove: |
926 if f.startswith(d): |
926 if f.startswith(d): |
927 # new file added in a directory that was moved |
927 # new file added in a directory that was moved |
928 df = dirmove[d] + f[len(d):] |
928 df = dirmove[d] + f[len(d):] |
929 break |
929 break |
930 if df in m1: |
930 if matcher(df) and df in m1: |
931 actions[df] = ('m', (df, f, f, False, pa.node()), |
931 actions[df] = ('m', (df, f, f, False, pa.node()), |
932 "local directory rename - respect move from " + f) |
932 "local directory rename - respect move from " + f) |
933 elif acceptremote: |
933 elif acceptremote: |
934 actions[f] = ('c', (fl2,), "remote recreating") |
934 actions[f] = ('c', (fl2,), "remote recreating") |
935 else: |
935 else: |