comparison mercurial/merge.py @ 2849:19b3bc840182

Merge: save away mode bit so that we don't need manifest later
author Matt Mackall <mpm@selenic.com>
date Wed, 09 Aug 2006 17:11:01 -0500
parents e78cad1f6b1f
children b11c014dcbd9
comparison
equal deleted inserted replaced
2848:e78cad1f6b1f 2849:19b3bc840182
155 repo.ui.debug(_(" %s versions differ, resolve\n") % f) 155 repo.ui.debug(_(" %s versions differ, resolve\n") % f)
156 # merge executable bits 156 # merge executable bits
157 # "if we changed or they changed, change in merge" 157 # "if we changed or they changed, change in merge"
158 a, b, c = mfa.execf(f), mfw.execf(f), mf2.execf(f) 158 a, b, c = mfa.execf(f), mfw.execf(f), mf2.execf(f)
159 mode = ((a^b) | (a^c)) ^ a 159 mode = ((a^b) | (a^c)) ^ a
160 merge[f] = (m1.get(f, nullid), m2[f], mode) 160 merge[f] = (mode, m1.get(f, nullid), m2[f])
161 s = 1 161 s = 1
162 # are we clobbering? 162 # are we clobbering?
163 # is remote's version newer? 163 # is remote's version newer?
164 # or are we going back in time? 164 # or are we going back in time?
165 elif overwrite or m2[f] != a or (p2 == pa and mw[f] == m1[f]): 165 elif overwrite or m2[f] != a or (p2 == pa and mw[f] == m1[f]):
166 repo.ui.debug(_(" remote %s is newer, get\n") % f) 166 repo.ui.debug(_(" remote %s is newer, get\n") % f)
167 get[f] = m2[f] 167 get[f] = (m2.execf(f), m2[f])
168 s = 1 168 s = 1
169 elif f in umap or f in added: 169 elif f in umap or f in added:
170 # this unknown file is the same as the checkout 170 # this unknown file is the same as the checkout
171 # we need to reset the dirstate if the file was added 171 # we need to reset the dirstate if the file was added
172 get[f] = m2[f] 172 get[f] = (m2.execf(f), m2[f])
173 173
174 if not s and mfw.execf(f) != mf2.execf(f): 174 if not s and mfw.execf(f) != mf2.execf(f):
175 if overwrite: 175 if overwrite:
176 repo.ui.debug(_(" updating permissions for %s\n") % f) 176 repo.ui.debug(_(" updating permissions for %s\n") % f)
177 util.set_exec(repo.wjoin(f), mf2.execf(f)) 177 util.set_exec(repo.wjoin(f), mf2.execf(f))
219 if not overwrite and (linear_path or branchmerge): 219 if not overwrite and (linear_path or branchmerge):
220 r = repo.ui.prompt( 220 r = repo.ui.prompt(
221 (_("remote changed %s which local deleted\n") % f) + 221 (_("remote changed %s which local deleted\n") % f) +
222 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) 222 _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
223 if r == _("k"): 223 if r == _("k"):
224 get[f] = n 224 get[f] = (m2.execf(f), n)
225 elif f not in ma: 225 elif f not in ma:
226 repo.ui.debug(_("remote created %s\n") % f) 226 repo.ui.debug(_("remote created %s\n") % f)
227 get[f] = n 227 get[f] = (m2.execf(f), n)
228 else: 228 else:
229 if overwrite or p2 == pa: # going backwards? 229 if overwrite or p2 == pa: # going backwards?
230 repo.ui.debug(_("local deleted %s, recreating\n") % f) 230 repo.ui.debug(_("local deleted %s, recreating\n") % f)
231 get[f] = n 231 get[f] = (m2.execf(f), n)
232 else: 232 else:
233 repo.ui.debug(_("local deleted %s\n") % f) 233 repo.ui.debug(_("local deleted %s\n") % f)
234 234
235 del mw, m1, m2, ma 235 del mw, m1, m2, ma
236 236
237 if overwrite: 237 if overwrite:
238 for f in merge: 238 for f in merge:
239 get[f] = merge[f][1] 239 get[f] = merge[f][:2]
240 merge = {} 240 merge = {}
241 241
242 if linear_path or overwrite: 242 if linear_path or overwrite:
243 # we don't need to do any magic, just jump to the new rev 243 # we don't need to do any magic, just jump to the new rev
244 p1, p2 = p2, nullid 244 p1, p2 = p2, nullid
252 252
253 # get the files we don't need to change 253 # get the files we don't need to change
254 files = get.keys() 254 files = get.keys()
255 files.sort() 255 files.sort()
256 for f in files: 256 for f in files:
257 flag, node = get[f]
257 if f[0] == "/": 258 if f[0] == "/":
258 continue 259 continue
259 repo.ui.note(_("getting %s\n") % f) 260 repo.ui.note(_("getting %s\n") % f)
260 t = repo.file(f).read(get[f]) 261 t = repo.file(f).read(node)
261 repo.wwrite(f, t) 262 repo.wwrite(f, t)
262 util.set_exec(repo.wjoin(f), mf2.execf(f)) 263 util.set_exec(repo.wjoin(f), flag)
263 if not partial: 264 if not partial:
264 if branchmerge: 265 if branchmerge:
265 repo.dirstate.update([f], 'n', st_mtime=-1) 266 repo.dirstate.update([f], 'n', st_mtime=-1)
266 else: 267 else:
267 repo.dirstate.update([f], 'n') 268 repo.dirstate.update([f], 'n')
270 unresolved = [] 271 unresolved = []
271 files = merge.keys() 272 files = merge.keys()
272 files.sort() 273 files.sort()
273 for f in files: 274 for f in files:
274 repo.ui.status(_("merging %s\n") % f) 275 repo.ui.status(_("merging %s\n") % f)
275 my, other, flag = merge[f] 276 flag, my, other = merge[f]
276 ret = merge3(repo, f, my, other, xp1, xp2) 277 ret = merge3(repo, f, my, other, xp1, xp2)
277 if ret: 278 if ret:
278 unresolved.append(f) 279 unresolved.append(f)
279 util.set_exec(repo.wjoin(f), flag) 280 util.set_exec(repo.wjoin(f), flag)
280 if not partial: 281 if not partial: