comparison mercurial/merge.py @ 3118:5644a05a608c

merge: simplify exec flag handling
author Matt Mackall <mpm@selenic.com>
date Sun, 17 Sep 2006 20:38:02 -0500
parents 7a635ef25132
children b1de36a4b4df
comparison
equal deleted inserted replaced
3117:7a635ef25132 3118:5644a05a608c
7 7
8 from node import * 8 from node import *
9 from i18n import gettext as _ 9 from i18n import gettext as _
10 from demandload import * 10 from demandload import *
11 demandload(globals(), "errno util os tempfile") 11 demandload(globals(), "errno util os tempfile")
12
13 def fmerge(f, local, other, ancestor):
14 """merge executable flags"""
15 a, b, c = ancestor.execf(f), local.execf(f), other.execf(f)
16 return ((a^b) | (a^c)) ^ a
17 12
18 def merge3(repo, fn, my, other, p1, p2): 13 def merge3(repo, fn, my, other, p1, p2):
19 """perform a 3-way merge in the working directory""" 14 """perform a 3-way merge in the working directory"""
20 15
21 def temp(prefix, node): 16 def temp(prefix, node):
102 def manifestmerge(ui, m1, m2, ma, overwrite, backwards, partial): 97 def manifestmerge(ui, m1, m2, ma, overwrite, backwards, partial):
103 """ 98 """
104 Merge manifest m1 with m2 using ancestor ma and generate merge action list 99 Merge manifest m1 with m2 using ancestor ma and generate merge action list
105 """ 100 """
106 101
102 def fmerge(f):
103 """merge executable flags"""
104 a, b, c = ma.execf(f), m1.execf(f), m2.execf(f)
105 return ((a^b) | (a^c)) ^ a
106
107 action = [] 107 action = []
108 108
109 # Filter manifests 109 # Filter manifests
110 if partial: 110 if partial:
111 for f in m1.keys(): 111 for f in m1.keys():
120 if n != m2[f]: 120 if n != m2[f]:
121 a = ma.get(f, nullid) 121 a = ma.get(f, nullid)
122 # are both different from the ancestor? 122 # are both different from the ancestor?
123 if not overwrite and n != a and m2[f] != a: 123 if not overwrite and n != a and m2[f] != a:
124 ui.debug(_(" %s versions differ, resolve\n") % f) 124 ui.debug(_(" %s versions differ, resolve\n") % f)
125 action.append((f, "m", fmerge(f, m1, m2, ma), n[:20], m2[f])) 125 action.append((f, "m", fmerge(f), n[:20], m2[f]))
126 # are we clobbering? 126 # are we clobbering?
127 # is remote's version newer? 127 # is remote's version newer?
128 # or are we going back in time and clean? 128 # or are we going back in time and clean?
129 elif overwrite or m2[f] != a or (backwards and not n[20:]): 129 elif overwrite or m2[f] != a or (backwards and not n[20:]):
130 ui.debug(_(" remote %s is newer, get\n") % f) 130 ui.debug(_(" remote %s is newer, get\n") % f)
131 action.append((f, "g", m2.execf(f), m2[f])) 131 action.append((f, "g", m2.execf(f), m2[f]))
132 # local is newer, not overwrite, check mode bits 132 # local is newer, not overwrite, check mode bits
133 elif m1.execf(f) != m2.execf(f): 133 elif fmerge(f) != m1.execf(f):
134 mode = fmerge(f, m1, m2, ma) 134 ui.debug(_(" updating permissions for %s\n") % f)
135 if mode != m1.execf(f): 135 action.append((f, "e", m2.execf(f)))
136 ui.debug(_(" updating permissions for %s\n") % f)
137 action.append((f, "e", m2.execf(f)))
138 136
139 # contents same, check mode bits 137 # contents same, check mode bits
140 elif m1.execf(f) != m2.execf(f): 138 elif m1.execf(f) != m2.execf(f):
141 if overwrite: 139 if overwrite or fmerge(f) != m1.execf(f)
142 ui.debug(_(" updating permissions for %s\n") % f) 140 ui.debug(_(" updating permissions for %s\n") % f)
143 action.append((f, "e", m2.execf(f))) 141 action.append((f, "e", m2.execf(f)))
144 else:
145 mode = fmerge(f, m1, m2, ma)
146 if mode != m1.execf(f):
147 ui.debug(_(" updating permissions for %s\n") % f)
148 action.append((f, "e", m2.execf(f)))
149 del m2[f] 142 del m2[f]
150 elif f in ma: 143 elif f in ma:
151 if n != ma[f] and not overwrite: 144 if n != ma[f] and not overwrite:
152 r = ui.prompt( 145 r = ui.prompt(
153 (_(" local changed %s which remote deleted\n") % f) + 146 (_(" local changed %s which remote deleted\n") % f) +