# HG changeset patch # User Dirkjan Ochtman # Date 1214226172 -7200 # Node ID 1fe6f365df2e0ed6dd56b5bd9993812378506174 # Parent 197d54d82f8d1606ea88d75e868d84242a044f4a merge: only in-branch merges can be implicit diff -r 197d54d82f8d -r 1fe6f365df2e mercurial/commands.py --- a/mercurial/commands.py Mon Jun 23 15:03:22 2008 +0200 +++ b/mercurial/commands.py Mon Jun 23 15:02:52 2008 +0200 @@ -1891,7 +1891,7 @@ performed before any further updates are allowed. If no revision is specified, the working directory's parent is a - head revision, and the repository contains exactly one other head, + head revision, and the current branch contains exactly one other head, the other head is merged with by default. Otherwise, an explicit revision to merge with must be provided. """ @@ -1902,22 +1902,28 @@ node = rev if not node: - heads = repo.heads() - if len(heads) > 2: - raise util.Abort(_('repo has %d heads - ' - 'please merge with an explicit rev') % - len(heads)) + branch = repo.workingctx().branch() + bheads = repo.branchheads() + if len(bheads) > 2: + raise util.Abort(_("branch '%s' has %d heads - " + "please merge with an explicit rev") % + (branch, len(bheads))) + parent = repo.dirstate.parents()[0] - if len(heads) == 1: + if len(bheads) == 1: + if len(repo.heads()) > 1: + raise util.Abort(_("branch '%s' has one head - " + "please merge with an explicit rev") % + branch) msg = _('there is nothing to merge') if parent != repo.lookup(repo.workingctx().branch()): msg = _('%s - use "hg update" instead') % msg raise util.Abort(msg) - if parent not in heads: + if parent not in bheads: raise util.Abort(_('working dir not at a head rev - ' 'use "hg update" or merge with an explicit rev')) - node = parent == heads[0] and heads[-1] or heads[0] + node = parent == bheads[0] and bheads[-1] or bheads[0] return hg.merge(repo, node, force=force) def outgoing(ui, repo, dest=None, **opts): diff -r 197d54d82f8d -r 1fe6f365df2e tests/test-command-template --- a/tests/test-command-template Mon Jun 23 15:03:22 2008 +0200 +++ b/tests/test-command-template Mon Jun 23 15:02:52 2008 +0200 @@ -23,7 +23,7 @@ echo other 4 >> d hg add d hg commit -m 'new head' -d '1500000 0' -u 'person' -hg merge -q +hg merge -q foo hg commit -m 'merge' -d '1500001 0' -u 'person' # second branch starting at nullrev hg update null diff -r 197d54d82f8d -r 1fe6f365df2e tests/test-convert-clonebranches --- a/tests/test-convert-clonebranches Mon Jun 23 15:03:22 2008 +0200 +++ b/tests/test-convert-clonebranches Mon Jun 23 15:02:52 2008 +0200 @@ -17,7 +17,7 @@ echo b > b hg ci -qAm addb hg up -qC -hg merge +hg merge default hg ci -qm mergeab hg tag -ql mergeab cd .. diff -r 197d54d82f8d -r 1fe6f365df2e tests/test-merge-default.out --- a/tests/test-merge-default.out Mon Jun 23 15:03:22 2008 +0200 +++ b/tests/test-merge-default.out Mon Jun 23 15:02:52 2008 +0200 @@ -5,10 +5,10 @@ created new head 1 files updated, 0 files merged, 0 files removed, 0 files unresolved % should fail because not at a head -abort: repo has 3 heads - please merge with an explicit rev +abort: branch 'default' has 3 heads - please merge with an explicit rev 1 files updated, 0 files merged, 0 files removed, 0 files unresolved % should fail because > 2 heads -abort: repo has 3 heads - please merge with an explicit rev +abort: branch 'default' has 3 heads - please merge with an explicit rev % should succeed 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) diff -r 197d54d82f8d -r 1fe6f365df2e tests/test-newbranch --- a/tests/test-newbranch Mon Jun 23 15:03:22 2008 +0200 +++ b/tests/test-newbranch Mon Jun 23 15:02:52 2008 +0200 @@ -24,7 +24,7 @@ echo bleah > a hg ci -m "modify a branch" -d "1000000 0" -hg merge +hg merge default hg branch hg ci -m "merge" -d "1000000 0" hg log @@ -73,4 +73,38 @@ hg parents hg manifest -exit 0 +echo % test merging, add 3 default heads and one test head +cd .. +hg init merges +cd merges +echo a > a +hg ci -Ama + +echo b > b +hg ci -Amb + +hg up 0 +echo c > c +hg ci -Amc + +hg up 0 +echo d > d +hg ci -Amd + +hg up 0 +hg branch test +echo e >> e +hg ci -Ame + +hg log + +echo % implicit merge with test branch as parent +hg merge +hg up -C default +echo % implicit merge with default branch as parent +hg merge +echo % 3 branch heads, explicit merge required +hg merge 2 +hg ci -m merge +echo % 2 branch heads, implicit merge works +hg merge diff -r 197d54d82f8d -r 1fe6f365df2e tests/test-newbranch.out --- a/tests/test-newbranch.out Mon Jun 23 15:03:22 2008 +0200 +++ b/tests/test-newbranch.out Mon Jun 23 15:02:52 2008 +0200 @@ -116,3 +116,57 @@ a ff +% test merging, add 3 default heads and one test head +adding a +adding b +0 files updated, 0 files merged, 1 files removed, 0 files unresolved +adding c +created new head +0 files updated, 0 files merged, 1 files removed, 0 files unresolved +adding d +created new head +0 files updated, 0 files merged, 1 files removed, 0 files unresolved +marked working directory as branch test +adding e +created new head +changeset: 4:3a1e01ed1df4 +branch: test +tag: tip +parent: 0:cb9a9f314b8b +user: test +date: Thu Jan 01 00:00:00 1970 +0000 +summary: e + +changeset: 3:980f7dc84c29 +parent: 0:cb9a9f314b8b +user: test +date: Thu Jan 01 00:00:00 1970 +0000 +summary: d + +changeset: 2:d36c0562f908 +parent: 0:cb9a9f314b8b +user: test +date: Thu Jan 01 00:00:00 1970 +0000 +summary: c + +changeset: 1:d2ae7f538514 +user: test +date: Thu Jan 01 00:00:00 1970 +0000 +summary: b + +changeset: 0:cb9a9f314b8b +user: test +date: Thu Jan 01 00:00:00 1970 +0000 +summary: a + +% implicit merge with test branch as parent +abort: branch 'test' has one head - please merge with an explicit rev +1 files updated, 0 files merged, 1 files removed, 0 files unresolved +% implicit merge with default branch as parent +abort: branch 'default' has 3 heads - please merge with an explicit rev +% 3 branch heads, explicit merge required +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +% 2 branch heads, implicit merge works +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit)