diff --git a/hgext/fetch.py b/hgext/fetch.py index b193a6e591319726e8ccd0b4322f9b4785f59390_aGdleHQvZmV0Y2gucHk=..0b6f12495276ea2551bb2cf191da7d4b9313e5be_aGdleHQvZmV0Y2gucHk= 100644 --- a/hgext/fetch.py +++ b/hgext/fetch.py @@ -17,7 +17,12 @@ If the pulled changes add a new head, the head is automatically merged, and the result of the merge is committed. Otherwise, the - working directory is updated. + working directory is updated to include the new changes. + + When a merge occurs, the newly pulled changes are assumed to be + "authoritative". The head of the new changes is used as the first + parent, with local changes as the second. To switch the merge + order, use --switch-parent. See 'hg help dates' for a list of formats valid for -d/--date. ''' @@ -34,12 +39,7 @@ newparent = newchildren[0] hg.clean(repo, newparent) newheads = [n for n in repo.heads() if n != newparent] - err = False - if newheads: - ui.status(_('merging with new head %d:%s\n') % - (repo.changelog.rev(newheads[0]), short(newheads[0]))) - err = hg.merge(repo, newheads[0], remind=False) - if not err and len(newheads) > 1: + if len(newheads) > 1: ui.status(_('not merging with %d other new heads ' '(use "hg heads" and "hg merge" to merge them)') % (len(newheads) - 1)) @@ -43,6 +43,23 @@ ui.status(_('not merging with %d other new heads ' '(use "hg heads" and "hg merge" to merge them)') % (len(newheads) - 1)) + return + err = False + if newheads: + # By default, we consider the repository we're pulling + # *from* as authoritative, so we merge our changes into + # theirs. + if opts['switch_parent']: + firstparent, secondparent = newparent, newheads[0] + else: + firstparent, secondparent = newheads[0], newparent + ui.status(_('updating to %d:%s\n') % + (repo.changelog.rev(firstparent), + short(firstparent))) + hg.clean(repo, firstparent) + ui.status(_('merging with %d:%s\n') % + (repo.changelog.rev(secondparent), short(secondparent))) + err = hg.merge(repo, secondparent, remind=False) if not err: mod, add, rem = repo.status()[:3] message = (cmdutil.logmessage(opts) or @@ -54,6 +71,7 @@ ui.status(_('new changeset %d:%s merges remote changes ' 'with local\n') % (repo.changelog.rev(n), short(n))) + def pull(): cmdutil.setremoteconfig(ui, opts) @@ -97,6 +115,7 @@ (fetch, [('r', 'rev', [], _('a specific revision you would like to pull')), ('f', 'force-editor', None, _('edit commit message')), + ('', 'switch-parent', None, _('switch parents when merging')), ] + commands.commitopts + commands.commitopts2 + commands.remoteopts, _('hg fetch [SOURCE]')), } diff --git a/tests/test-fetch b/tests/test-fetch index b193a6e591319726e8ccd0b4322f9b4785f59390_dGVzdHMvdGVzdC1mZXRjaA==..0b6f12495276ea2551bb2cf191da7d4b9313e5be_dGVzdHMvdGVzdC1mZXRjaA== 100755 --- a/tests/test-fetch +++ b/tests/test-fetch @@ -24,6 +24,7 @@ hg clone c d hg clone c e +echo % should merge c into a hg --cwd c fetch -d '4 0' -m 'automated merge' ../a ls c @@ -37,3 +38,15 @@ echo '% fetch over http with auth (should be hidden in desc)' hg --cwd e fetch -d '5 0' http://user:password@localhost:$HGPORT/ hg --cwd e tip --template '{desc}\n' + +hg clone a f +hg clone a g + +echo f > f/f +hg --cwd f ci -d '6 0' -Amf + +echo g > g/g +hg --cwd g ci -d '6 0' -Amg + +echo % should merge f into g +hg --cwd g fetch --switch ../f diff --git a/tests/test-fetch.out b/tests/test-fetch.out index b193a6e591319726e8ccd0b4322f9b4785f59390_dGVzdHMvdGVzdC1mZXRjaC5vdXQ=..0b6f12495276ea2551bb2cf191da7d4b9313e5be_dGVzdHMvdGVzdC1mZXRjaC5vdXQ= 100644 --- a/tests/test-fetch.out +++ b/tests/test-fetch.out @@ -15,9 +15,10 @@ adding c 2 files updated, 0 files merged, 0 files removed, 0 files unresolved 2 files updated, 0 files merged, 0 files removed, 0 files unresolved +% should merge c into a pulling from ../a searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) @@ -18,10 +19,12 @@ pulling from ../a searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) -merging with new head 2:97d72e5f12c7 +updating to 2:97d72e5f12c7 +1 files updated, 0 files merged, 1 files removed, 0 files unresolved +merging with 1:5e056962225c 1 files updated, 0 files merged, 0 files removed, 0 files unresolved new changeset 3:cd3a41621cf0 merges remote changes with local a @@ -34,7 +37,9 @@ adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) -merging with new head 2:97d72e5f12c7 +updating to 2:97d72e5f12c7 +1 files updated, 0 files merged, 1 files removed, 0 files unresolved +merging with 1:5e056962225c 1 files updated, 0 files merged, 0 files removed, 0 files unresolved new changeset 3:0b6439e938f9 merges remote changes with local Automated merge with http://localhost:20059/ @@ -45,7 +50,9 @@ adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) -merging with new head 2:97d72e5f12c7 +updating to 2:97d72e5f12c7 +1 files updated, 0 files merged, 1 files removed, 0 files unresolved +merging with 1:5e056962225c 1 files updated, 0 files merged, 0 files removed, 0 files unresolved new changeset 3:0b6439e938f9 merges remote changes with local Automated merge with http://localhost:20059/ @@ -49,3 +56,18 @@ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved new changeset 3:0b6439e938f9 merges remote changes with local Automated merge with http://localhost:20059/ +2 files updated, 0 files merged, 0 files removed, 0 files unresolved +2 files updated, 0 files merged, 0 files removed, 0 files unresolved +adding f +adding g +% should merge f into g +pulling from ../f +searching for changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files (+1 heads) +0 files updated, 0 files merged, 0 files removed, 0 files unresolved +merging with 3:cc6a3744834d +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +new changeset 4:96d2275e70b4 merges remote changes with local