##// END OF EJS Templates
graft: add initial implementation
Matt Mackall -
r15238:2d710c12 default
parent child Browse files
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