289 elif m == "m": # merge |
289 elif m == "m": # merge |
290 f2, fd, flag, move = a[2:] |
290 f2, fd, flag, move = a[2:] |
291 if filemerge(repo, f, f2, wctx, mctx): |
291 if filemerge(repo, f, f2, wctx, mctx): |
292 unresolved += 1 |
292 unresolved += 1 |
293 else: |
293 else: |
|
294 merged += 1 |
294 if f != fd: |
295 if f != fd: |
295 repo.ui.debug(_("copying %s to %s\n") % (f, fd)) |
296 repo.ui.debug(_("copying %s to %s\n") % (f, fd)) |
296 repo.wwrite(fd, repo.wread(f)) |
297 repo.wwrite(fd, repo.wread(f)) |
297 if move: |
298 if move: |
298 repo.ui.debug(_("removing %s\n") % f) |
299 repo.ui.debug(_("removing %s\n") % f) |
299 os.unlink(repo.wjoin(f)) |
300 os.unlink(repo.wjoin(f)) |
300 |
|
301 util.set_exec(repo.wjoin(fd), flag) |
301 util.set_exec(repo.wjoin(fd), flag) |
302 merged += 1 |
|
303 elif m == "g": # get |
302 elif m == "g": # get |
304 flag = a[2] |
303 flag = a[2] |
305 repo.ui.note(_("getting %s\n") % f) |
304 repo.ui.note(_("getting %s\n") % f) |
306 t = mctx.filectx(f).data() |
305 t = mctx.filectx(f).data() |
307 repo.wwrite(f, t) |
306 repo.wwrite(f, t) |
350 if f != fd: |
349 if f != fd: |
351 repo.dirstate.copy(f, fd) |
350 repo.dirstate.copy(f, fd) |
352 else: |
351 else: |
353 repo.dirstate.copy(f2, fd) |
352 repo.dirstate.copy(f2, fd) |
354 |
353 |
355 def update(repo, node, branchmerge=False, force=False, partial=None, |
354 def update(repo, node, branchmerge, force, partial, wlock): |
356 wlock=None, show_stats=True, remind=True): |
|
357 """ |
355 """ |
358 Perform a merge between the working directory and the given node |
356 Perform a merge between the working directory and the given node |
359 |
357 |
360 branchmerge = whether to merge between branches |
358 branchmerge = whether to merge between branches |
361 force = whether to force branch merging or file overwriting |
359 force = whether to force branch merging or file overwriting |
362 partial = a function to filter file lists (dirstate not updated) |
360 partial = a function to filter file lists (dirstate not updated) |
363 wlock = working dir lock, if already held |
361 wlock = working dir lock, if already held |
364 show_stats = whether to report merge statistics |
|
365 remind = whether to remind about merge |
|
366 """ |
362 """ |
367 |
363 |
368 if not wlock: |
364 if not wlock: |
369 wlock = repo.wlock() |
365 wlock = repo.wlock() |
370 |
366 |
402 if not branchmerge: # just jump to the new rev |
398 if not branchmerge: # just jump to the new rev |
403 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
399 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
404 if not partial: |
400 if not partial: |
405 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) |
401 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) |
406 |
402 |
407 updated, merged, removed, unresolved = applyupdates(repo, action, wc, p2) |
403 stats = applyupdates(repo, action, wc, p2) |
408 |
404 |
409 if show_stats: |
|
410 stats = ((updated, _("updated")), |
|
411 (merged - unresolved, _("merged")), |
|
412 (removed, _("removed")), |
|
413 (unresolved, _("unresolved"))) |
|
414 note = ", ".join([_("%d files %s") % s for s in stats]) |
|
415 repo.ui.status("%s\n" % note) |
|
416 if not partial: |
405 if not partial: |
417 recordupdates(repo, action, branchmerge, p2) |
406 recordupdates(repo, action, branchmerge, p2) |
418 repo.dirstate.setparents(fp1, fp2) |
407 repo.dirstate.setparents(fp1, fp2) |
419 repo.hook('update', parent1=xp1, parent2=xp2, error=unresolved) |
408 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
420 |
409 |
421 if branchmerge: |
410 return stats |
422 if unresolved: |
411 |
423 repo.ui.status(_("There are unresolved merges," |
|
424 " you can redo the full merge using:\n" |
|
425 " hg update -C %s\n" |
|
426 " hg merge %s\n" |
|
427 % (p1.rev(), p2.rev()))) |
|
428 elif remind: |
|
429 repo.ui.status(_("(branch merge, don't forget to commit)\n")) |
|
430 elif unresolved: |
|
431 repo.ui.status(_("There are unresolved merges with" |
|
432 " locally modified files.\n")) |
|
433 |
|
434 return unresolved |
|
435 |
|