comparison mercurial/merge.py @ 2919:8743188f4d2e

merge: consolidate dirstate updates
author Matt Mackall <mpm@selenic.com>
date Tue, 15 Aug 2006 23:17:06 -0500
parents db397c38005d
children 545d33aa3f82
comparison
equal deleted inserted replaced
2918:db397c38005d 2919:8743188f4d2e
252 continue 252 continue
253 repo.ui.note(_("getting %s\n") % f) 253 repo.ui.note(_("getting %s\n") % f)
254 t = repo.file(f).read(node) 254 t = repo.file(f).read(node)
255 repo.wwrite(f, t) 255 repo.wwrite(f, t)
256 util.set_exec(repo.wjoin(f), flag) 256 util.set_exec(repo.wjoin(f), flag)
257 if not partial:
258 if branchmerge:
259 repo.dirstate.update([f], 'n', st_mtime=-1)
260 else:
261 repo.dirstate.update([f], 'n')
262 257
263 # merge the tricky bits 258 # merge the tricky bits
264 unresolved = [] 259 unresolved = []
265 files = merge.keys() 260 files = merge.keys()
266 files.sort() 261 files.sort()
269 flag, my, other = merge[f] 264 flag, my, other = merge[f]
270 ret = merge3(repo, f, my, other, xp1, xp2) 265 ret = merge3(repo, f, my, other, xp1, xp2)
271 if ret: 266 if ret:
272 unresolved.append(f) 267 unresolved.append(f)
273 util.set_exec(repo.wjoin(f), flag) 268 util.set_exec(repo.wjoin(f), flag)
274 if not partial:
275 if branchmerge:
276 # We've done a branch merge, mark this file as merged
277 # so that we properly record the merger later
278 repo.dirstate.update([f], 'm')
279 else:
280 # We've update-merged a locally modified file, so
281 # we set the dirstate to emulate a normal checkout
282 # of that file some time in the past. Thus our
283 # merge will appear as a normal local file
284 # modification.
285 fl = repo.file(f)
286 f_len = fl.size(fl.rev(other))
287 repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1)
288 269
289 remove.sort() 270 remove.sort()
290 for f in remove: 271 for f in remove:
291 repo.ui.note(_("removing %s\n") % f) 272 repo.ui.note(_("removing %s\n") % f)
292 util.audit_path(f) 273 util.audit_path(f)
294 util.unlink(repo.wjoin(f)) 275 util.unlink(repo.wjoin(f))
295 except OSError, inst: 276 except OSError, inst:
296 if inst.errno != errno.ENOENT: 277 if inst.errno != errno.ENOENT:
297 repo.ui.warn(_("update failed to remove %s: %s!\n") % 278 repo.ui.warn(_("update failed to remove %s: %s!\n") %
298 (f, inst.strerror)) 279 (f, inst.strerror))
280
281 # update dirstate
299 if not partial: 282 if not partial:
283 repo.dirstate.setparents(p1, p2)
284 repo.dirstate.forget(forget)
300 if branchmerge: 285 if branchmerge:
301 repo.dirstate.update(remove, 'r') 286 repo.dirstate.update(remove, 'r')
302 else: 287 else:
303 repo.dirstate.forget(remove) 288 repo.dirstate.forget(remove)
304 289
305 if not partial: 290 files = get.keys()
306 repo.dirstate.setparents(p1, p2) 291 files.sort()
307 repo.dirstate.forget(forget) 292 for f in files:
293 if branchmerge:
294 repo.dirstate.update([f], 'n', st_mtime=-1)
295 else:
296 repo.dirstate.update([f], 'n')
297
298 files = merge.keys()
299 files.sort()
300 for f in files:
301 if branchmerge:
302 # We've done a branch merge, mark this file as merged
303 # so that we properly record the merger later
304 repo.dirstate.update([f], 'm')
305 else:
306 # We've update-merged a locally modified file, so
307 # we set the dirstate to emulate a normal checkout
308 # of that file some time in the past. Thus our
309 # merge will appear as a normal local file
310 # modification.
311 fl = repo.file(f)
312 f_len = fl.size(fl.rev(other))
313 repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1)
308 314
309 if show_stats: 315 if show_stats:
310 stats = ((len(get), _("updated")), 316 stats = ((len(get), _("updated")),
311 (len(merge) - len(unresolved), _("merged")), 317 (len(merge) - len(unresolved), _("merged")),
312 (len(remove), _("removed")), 318 (len(remove), _("removed")),