Skip to content
Snippets Groups Projects
Commit 0b6f1249 authored by Bryan O'Sullivan's avatar Bryan O'Sullivan
Browse files

fetch: switch the default parent used for a merge

This treats newly pulled changes as authoritative, and local changes as
the "satellite" changes.

The prior default behaviour is still available, via the --switch-parent
option.
parent b193a6e5
No related branches found
No related tags found
No related merge requests found
...@@ -17,7 +17,12 @@ ...@@ -17,7 +17,12 @@
If the pulled changes add a new head, the head is automatically If the pulled changes add a new head, the head is automatically
merged, and the result of the merge is committed. Otherwise, the 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. See 'hg help dates' for a list of formats valid for -d/--date.
''' '''
...@@ -34,12 +39,7 @@ ...@@ -34,12 +39,7 @@
newparent = newchildren[0] newparent = newchildren[0]
hg.clean(repo, newparent) hg.clean(repo, newparent)
newheads = [n for n in repo.heads() if n != newparent] newheads = [n for n in repo.heads() if n != newparent]
err = False if len(newheads) > 1:
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:
ui.status(_('not merging with %d other new heads ' ui.status(_('not merging with %d other new heads '
'(use "hg heads" and "hg merge" to merge them)') % '(use "hg heads" and "hg merge" to merge them)') %
(len(newheads) - 1)) (len(newheads) - 1))
...@@ -43,6 +43,23 @@ ...@@ -43,6 +43,23 @@
ui.status(_('not merging with %d other new heads ' ui.status(_('not merging with %d other new heads '
'(use "hg heads" and "hg merge" to merge them)') % '(use "hg heads" and "hg merge" to merge them)') %
(len(newheads) - 1)) (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: if not err:
mod, add, rem = repo.status()[:3] mod, add, rem = repo.status()[:3]
message = (cmdutil.logmessage(opts) or message = (cmdutil.logmessage(opts) or
...@@ -54,6 +71,7 @@ ...@@ -54,6 +71,7 @@
ui.status(_('new changeset %d:%s merges remote changes ' ui.status(_('new changeset %d:%s merges remote changes '
'with local\n') % (repo.changelog.rev(n), 'with local\n') % (repo.changelog.rev(n),
short(n))) short(n)))
def pull(): def pull():
cmdutil.setremoteconfig(ui, opts) cmdutil.setremoteconfig(ui, opts)
...@@ -97,6 +115,7 @@ ...@@ -97,6 +115,7 @@
(fetch, (fetch,
[('r', 'rev', [], _('a specific revision you would like to pull')), [('r', 'rev', [], _('a specific revision you would like to pull')),
('f', 'force-editor', None, _('edit commit message')), ('f', 'force-editor', None, _('edit commit message')),
('', 'switch-parent', None, _('switch parents when merging')),
] + commands.commitopts + commands.commitopts2 + commands.remoteopts, ] + commands.commitopts + commands.commitopts2 + commands.remoteopts,
_('hg fetch [SOURCE]')), _('hg fetch [SOURCE]')),
} }
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
hg clone c d hg clone c d
hg clone c e hg clone c e
echo % should merge c into a
hg --cwd c fetch -d '4 0' -m 'automated merge' ../a hg --cwd c fetch -d '4 0' -m 'automated merge' ../a
ls c ls c
...@@ -37,3 +38,15 @@ ...@@ -37,3 +38,15 @@
echo '% fetch over http with auth (should be hidden in desc)' 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 fetch -d '5 0' http://user:password@localhost:$HGPORT/
hg --cwd e tip --template '{desc}\n' 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
...@@ -15,9 +15,10 @@ ...@@ -15,9 +15,10 @@
adding c 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
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 pulling from ../a
searching for changes searching for changes
adding changesets adding changesets
adding manifests adding manifests
adding file changes adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads) added 1 changesets with 1 changes to 1 files (+1 heads)
...@@ -18,10 +19,12 @@ ...@@ -18,10 +19,12 @@
pulling from ../a pulling from ../a
searching for changes searching for changes
adding changesets adding changesets
adding manifests adding manifests
adding file changes adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads) 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 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 3:cd3a41621cf0 merges remote changes with local new changeset 3:cd3a41621cf0 merges remote changes with local
a a
...@@ -34,7 +37,9 @@ ...@@ -34,7 +37,9 @@
adding manifests adding manifests
adding file changes adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads) 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 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 3:0b6439e938f9 merges remote changes with local new changeset 3:0b6439e938f9 merges remote changes with local
Automated merge with http://localhost:20059/ Automated merge with http://localhost:20059/
...@@ -45,7 +50,9 @@ ...@@ -45,7 +50,9 @@
adding manifests adding manifests
adding file changes adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads) 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 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 3:0b6439e938f9 merges remote changes with local new changeset 3:0b6439e938f9 merges remote changes with local
Automated merge with http://localhost:20059/ Automated merge with http://localhost:20059/
...@@ -49,3 +56,18 @@ ...@@ -49,3 +56,18 @@
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 3:0b6439e938f9 merges remote changes with local new changeset 3:0b6439e938f9 merges remote changes with local
Automated merge with http://localhost:20059/ 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment