Show More
@@ -2447,6 +2447,75 b' def forget(ui, repo, *pats, **opts):' | |||||
2447 | repo[None].forget(forget) |
|
2447 | repo[None].forget(forget) | |
2448 | return errs |
|
2448 | return errs | |
2449 |
|
2449 | |||
|
2450 | @command('graft', | |||
|
2451 | [], | |||
|
2452 | _('[OPTION]... REVISION...')) | |||
|
2453 | def graft(ui, repo, rev, *revs, **opts): | |||
|
2454 | '''copy changes from other branches onto the current branch | |||
|
2455 | ||||
|
2456 | This command uses Mercurial's merge logic to copy individual | |||
|
2457 | changes from other branches without merging branches in the | |||
|
2458 | history graph. This is sometimes known as 'backporting' or | |||
|
2459 | 'cherry-picking'. | |||
|
2460 | ||||
|
2461 | Changesets that are ancestors of the current revision, that have | |||
|
2462 | already been grafted, or that are merges will be skipped. | |||
|
2463 | ||||
|
2464 | Returns 0 on successful completion. | |||
|
2465 | ''' | |||
|
2466 | ||||
|
2467 | cmdutil.bailifchanged(repo) | |||
|
2468 | ||||
|
2469 | revs = [rev] + list(revs) | |||
|
2470 | revs = scmutil.revrange(repo, revs) | |||
|
2471 | ||||
|
2472 | # check for merges | |||
|
2473 | for ctx in repo.set('%ld and merge()', revs): | |||
|
2474 | ui.warn(_('skipping ungraftable merge revision %s\n') % ctx.rev()) | |||
|
2475 | revs.remove(ctx.rev()) | |||
|
2476 | if not revs: | |||
|
2477 | return -1 | |||
|
2478 | ||||
|
2479 | # check for ancestors of dest branch | |||
|
2480 | for ctx in repo.set('::. and %ld', revs): | |||
|
2481 | ui.warn(_('skipping ancestor revision %s\n') % ctx.rev()) | |||
|
2482 | revs.remove(ctx.rev()) | |||
|
2483 | if not revs: | |||
|
2484 | return -1 | |||
|
2485 | ||||
|
2486 | # check ancestors for earlier grafts | |||
|
2487 | ui.debug('scanning for existing transplants') | |||
|
2488 | for ctx in repo.set("::. - ::%ld", revs): | |||
|
2489 | n = ctx.extra().get('source') | |||
|
2490 | if n and n in repo: | |||
|
2491 | r = repo[n].rev() | |||
|
2492 | ui.warn(_('skipping already grafted revision %s\n') % r) | |||
|
2493 | revs.remove(r) | |||
|
2494 | if not revs: | |||
|
2495 | return -1 | |||
|
2496 | ||||
|
2497 | for ctx in repo.set("%ld", revs): | |||
|
2498 | current = repo['.'] | |||
|
2499 | ui.debug('grafting revision %s', ctx.rev()) | |||
|
2500 | # perform the graft merge with p1(rev) as 'ancestor' | |||
|
2501 | stats = mergemod.update(repo, ctx.node(), True, True, False, | |||
|
2502 | ctx.p1().node()) | |||
|
2503 | # drop the second merge parent | |||
|
2504 | repo.dirstate.setparents(current.node(), nullid) | |||
|
2505 | repo.dirstate.write() | |||
|
2506 | # fix up dirstate for copies and renames | |||
|
2507 | cmdutil.duplicatecopies(repo, ctx.rev(), current.node(), nullid) | |||
|
2508 | # report any conflicts | |||
|
2509 | if stats and stats[3] > 0: | |||
|
2510 | raise util.Abort(_("unresolved conflicts, can't continue"), | |||
|
2511 | hint=_('use hg resolve and hg graft --continue')) | |||
|
2512 | # commit | |||
|
2513 | extra = {'source': ctx.hex()} | |||
|
2514 | repo.commit(text=ctx.description(), user=ctx.user(), | |||
|
2515 | date=ctx.date(), extra=extra) | |||
|
2516 | ||||
|
2517 | return 0 | |||
|
2518 | ||||
2450 | @command('grep', |
|
2519 | @command('grep', | |
2451 | [('0', 'print0', None, _('end fields with NUL')), |
|
2520 | [('0', 'print0', None, _('end fields with NUL')), | |
2452 | ('', 'all', None, _('print all revisions that match')), |
|
2521 | ('', 'all', None, _('print all revisions that match')), |
@@ -17,6 +17,7 b' Show all commands except debug commands' | |||||
17 | diff |
|
17 | diff | |
18 | export |
|
18 | export | |
19 | forget |
|
19 | forget | |
|
20 | graft | |||
20 | grep |
|
21 | grep | |
21 | heads |
|
22 | heads | |
22 | help |
|
23 | help | |
@@ -242,6 +243,7 b' Show all commands + options' | |||||
242 | debugsub: rev |
|
243 | debugsub: rev | |
243 | debugwalk: include, exclude |
|
244 | debugwalk: include, exclude | |
244 | debugwireargs: three, four, five, ssh, remotecmd, insecure |
|
245 | debugwireargs: three, four, five, ssh, remotecmd, insecure | |
|
246 | graft: | |||
245 | grep: print0, all, text, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude |
|
247 | grep: print0, all, text, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude | |
246 | heads: rev, topo, active, closed, style, template |
|
248 | heads: rev, topo, active, closed, style, template | |
247 | help: extension, command |
|
249 | help: extension, command |
@@ -296,6 +296,7 b' Testing -h/--help:' | |||||
296 | diff diff repository (or selected files) |
|
296 | diff diff repository (or selected files) | |
297 | export dump the header and diffs for one or more changesets |
|
297 | export dump the header and diffs for one or more changesets | |
298 | forget forget the specified files on the next commit |
|
298 | forget forget the specified files on the next commit | |
|
299 | graft copy changes from other branches onto the current branch | |||
299 | grep search for a pattern in specified files and revisions |
|
300 | grep search for a pattern in specified files and revisions | |
300 | heads show current repository heads or show branch heads |
|
301 | heads show current repository heads or show branch heads | |
301 | help show help for a given topic or a help overview |
|
302 | help show help for a given topic or a help overview | |
@@ -377,6 +378,7 b' Testing -h/--help:' | |||||
377 | diff diff repository (or selected files) |
|
378 | diff diff repository (or selected files) | |
378 | export dump the header and diffs for one or more changesets |
|
379 | export dump the header and diffs for one or more changesets | |
379 | forget forget the specified files on the next commit |
|
380 | forget forget the specified files on the next commit | |
|
381 | graft copy changes from other branches onto the current branch | |||
380 | grep search for a pattern in specified files and revisions |
|
382 | grep search for a pattern in specified files and revisions | |
381 | heads show current repository heads or show branch heads |
|
383 | heads show current repository heads or show branch heads | |
382 | help show help for a given topic or a help overview |
|
384 | help show help for a given topic or a help overview |
@@ -66,6 +66,7 b' Short help:' | |||||
66 | diff diff repository (or selected files) |
|
66 | diff diff repository (or selected files) | |
67 | export dump the header and diffs for one or more changesets |
|
67 | export dump the header and diffs for one or more changesets | |
68 | forget forget the specified files on the next commit |
|
68 | forget forget the specified files on the next commit | |
|
69 | graft copy changes from other branches onto the current branch | |||
69 | grep search for a pattern in specified files and revisions |
|
70 | grep search for a pattern in specified files and revisions | |
70 | heads show current repository heads or show branch heads |
|
71 | heads show current repository heads or show branch heads | |
71 | help show help for a given topic or a help overview |
|
72 | help show help for a given topic or a help overview | |
@@ -141,6 +142,7 b' Short help:' | |||||
141 | diff diff repository (or selected files) |
|
142 | diff diff repository (or selected files) | |
142 | export dump the header and diffs for one or more changesets |
|
143 | export dump the header and diffs for one or more changesets | |
143 | forget forget the specified files on the next commit |
|
144 | forget forget the specified files on the next commit | |
|
145 | graft copy changes from other branches onto the current branch | |||
144 | grep search for a pattern in specified files and revisions |
|
146 | grep search for a pattern in specified files and revisions | |
145 | heads show current repository heads or show branch heads |
|
147 | heads show current repository heads or show branch heads | |
146 | help show help for a given topic or a help overview |
|
148 | help show help for a given topic or a help overview | |
@@ -626,6 +628,7 b' Test that default list of commands omits' | |||||
626 | diff diff repository (or selected files) |
|
628 | diff diff repository (or selected files) | |
627 | export dump the header and diffs for one or more changesets |
|
629 | export dump the header and diffs for one or more changesets | |
628 | forget forget the specified files on the next commit |
|
630 | forget forget the specified files on the next commit | |
|
631 | graft copy changes from other branches onto the current branch | |||
629 | grep search for a pattern in specified files and revisions |
|
632 | grep search for a pattern in specified files and revisions | |
630 | heads show current repository heads or show branch heads |
|
633 | heads show current repository heads or show branch heads | |
631 | help show help for a given topic or a help overview |
|
634 | help show help for a given topic or a help overview |
General Comments 0
You need to be logged in to leave comments.
Login now