8 '''pull, update and merge in one command (DEPRECATED)''' |
8 '''pull, update and merge in one command (DEPRECATED)''' |
9 |
9 |
10 from __future__ import absolute_import |
10 from __future__ import absolute_import |
11 |
11 |
12 from mercurial.i18n import _ |
12 from mercurial.i18n import _ |
13 from mercurial.node import ( |
13 from mercurial.node import short |
14 short, |
|
15 ) |
|
16 from mercurial import ( |
14 from mercurial import ( |
17 cmdutil, |
15 cmdutil, |
18 error, |
16 error, |
19 exchange, |
17 exchange, |
20 hg, |
18 hg, |
32 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
30 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
33 # be specifying the version(s) of Mercurial they are tested with, or |
31 # be specifying the version(s) of Mercurial they are tested with, or |
34 # leave the attribute unspecified. |
32 # leave the attribute unspecified. |
35 testedwith = 'ships-with-hg-core' |
33 testedwith = 'ships-with-hg-core' |
36 |
34 |
37 @command('fetch', |
35 |
38 [('r', 'rev', [], |
36 @command( |
39 _('a specific revision you would like to pull'), _('REV')), |
37 'fetch', |
40 ('', 'edit', None, _('invoke editor on commit messages')), |
38 [ |
41 ('', 'force-editor', None, _('edit commit message (DEPRECATED)')), |
39 ( |
42 ('', 'switch-parent', None, _('switch parents when merging')), |
40 'r', |
43 ] + cmdutil.commitopts + cmdutil.commitopts2 + cmdutil.remoteopts, |
41 'rev', |
|
42 [], |
|
43 _('a specific revision you would like to pull'), |
|
44 _('REV'), |
|
45 ), |
|
46 ('', 'edit', None, _('invoke editor on commit messages')), |
|
47 ('', 'force-editor', None, _('edit commit message (DEPRECATED)')), |
|
48 ('', 'switch-parent', None, _('switch parents when merging')), |
|
49 ] |
|
50 + cmdutil.commitopts |
|
51 + cmdutil.commitopts2 |
|
52 + cmdutil.remoteopts, |
44 _('hg fetch [SOURCE]'), |
53 _('hg fetch [SOURCE]'), |
45 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT) |
54 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, |
|
55 ) |
46 def fetch(ui, repo, source='default', **opts): |
56 def fetch(ui, repo, source='default', **opts): |
47 '''pull changes from a remote repository, merge new changes if needed. |
57 '''pull changes from a remote repository, merge new changes if needed. |
48 |
58 |
49 This finds all changes from the repository at the specified path |
59 This finds all changes from the repository at the specified path |
50 or URL and adds them to the local repository. |
60 or URL and adds them to the local repository. |
73 try: |
83 try: |
74 branchnode = repo.branchtip(branch) |
84 branchnode = repo.branchtip(branch) |
75 except error.RepoLookupError: |
85 except error.RepoLookupError: |
76 branchnode = None |
86 branchnode = None |
77 if parent != branchnode: |
87 if parent != branchnode: |
78 raise error.Abort(_('working directory not at branch tip'), |
88 raise error.Abort( |
79 hint=_("use 'hg update' to check out branch tip")) |
89 _('working directory not at branch tip'), |
|
90 hint=_("use 'hg update' to check out branch tip"), |
|
91 ) |
80 |
92 |
81 wlock = lock = None |
93 wlock = lock = None |
82 try: |
94 try: |
83 wlock = repo.wlock() |
95 wlock = repo.wlock() |
84 lock = repo.lock() |
96 lock = repo.lock() |
86 cmdutil.bailifchanged(repo) |
98 cmdutil.bailifchanged(repo) |
87 |
99 |
88 bheads = repo.branchheads(branch) |
100 bheads = repo.branchheads(branch) |
89 bheads = [head for head in bheads if len(repo[head].children()) == 0] |
101 bheads = [head for head in bheads if len(repo[head].children()) == 0] |
90 if len(bheads) > 1: |
102 if len(bheads) > 1: |
91 raise error.Abort(_('multiple heads in this branch ' |
103 raise error.Abort( |
92 '(use "hg heads ." and "hg merge" to merge)')) |
104 _( |
|
105 'multiple heads in this branch ' |
|
106 '(use "hg heads ." and "hg merge" to merge)' |
|
107 ) |
|
108 ) |
93 |
109 |
94 other = hg.peer(repo, opts, ui.expandpath(source)) |
110 other = hg.peer(repo, opts, ui.expandpath(source)) |
95 ui.status(_('pulling from %s\n') % |
111 ui.status( |
96 util.hidepassword(ui.expandpath(source))) |
112 _('pulling from %s\n') % util.hidepassword(ui.expandpath(source)) |
|
113 ) |
97 revs = None |
114 revs = None |
98 if opts['rev']: |
115 if opts['rev']: |
99 try: |
116 try: |
100 revs = [other.lookup(rev) for rev in opts['rev']] |
117 revs = [other.lookup(rev) for rev in opts['rev']] |
101 except error.CapabilityError: |
118 except error.CapabilityError: |
102 err = _("other repository doesn't support revision lookup, " |
119 err = _( |
103 "so a rev cannot be specified.") |
120 "other repository doesn't support revision lookup, " |
|
121 "so a rev cannot be specified." |
|
122 ) |
104 raise error.Abort(err) |
123 raise error.Abort(err) |
105 |
124 |
106 # Are there any changes at all? |
125 # Are there any changes at all? |
107 modheads = exchange.pull(repo, other, heads=revs).cgresult |
126 modheads = exchange.pull(repo, other, heads=revs).cgresult |
108 if modheads == 0: |
127 if modheads == 0: |
123 if newchildren: |
142 if newchildren: |
124 newparent = newchildren[0] |
143 newparent = newchildren[0] |
125 hg.clean(repo, newparent) |
144 hg.clean(repo, newparent) |
126 newheads = [n for n in newheads if n != newparent] |
145 newheads = [n for n in newheads if n != newparent] |
127 if len(newheads) > 1: |
146 if len(newheads) > 1: |
128 ui.status(_('not merging with %d other new branch heads ' |
147 ui.status( |
129 '(use "hg heads ." and "hg merge" to merge them)\n') % |
148 _( |
130 (len(newheads) - 1)) |
149 'not merging with %d other new branch heads ' |
|
150 '(use "hg heads ." and "hg merge" to merge them)\n' |
|
151 ) |
|
152 % (len(newheads) - 1) |
|
153 ) |
131 return 1 |
154 return 1 |
132 |
155 |
133 if not newheads: |
156 if not newheads: |
134 return 0 |
157 return 0 |
135 |
158 |
141 # theirs. |
164 # theirs. |
142 if opts['switch_parent']: |
165 if opts['switch_parent']: |
143 firstparent, secondparent = newparent, newheads[0] |
166 firstparent, secondparent = newparent, newheads[0] |
144 else: |
167 else: |
145 firstparent, secondparent = newheads[0], newparent |
168 firstparent, secondparent = newheads[0], newparent |
146 ui.status(_('updating to %d:%s\n') % |
169 ui.status( |
147 (repo.changelog.rev(firstparent), |
170 _('updating to %d:%s\n') |
148 short(firstparent))) |
171 % (repo.changelog.rev(firstparent), short(firstparent)) |
|
172 ) |
149 hg.clean(repo, firstparent) |
173 hg.clean(repo, firstparent) |
150 ui.status(_('merging with %d:%s\n') % |
174 ui.status( |
151 (repo.changelog.rev(secondparent), short(secondparent))) |
175 _('merging with %d:%s\n') |
|
176 % (repo.changelog.rev(secondparent), short(secondparent)) |
|
177 ) |
152 err = hg.merge(repo, secondparent, remind=False) |
178 err = hg.merge(repo, secondparent, remind=False) |
153 |
179 |
154 if not err: |
180 if not err: |
155 # we don't translate commit messages |
181 # we don't translate commit messages |
156 message = (cmdutil.logmessage(ui, opts) or |
182 message = cmdutil.logmessage(ui, opts) or ( |
157 ('Automated merge with %s' % |
183 'Automated merge with %s' % util.removeauth(other.url()) |
158 util.removeauth(other.url()))) |
184 ) |
159 editopt = opts.get('edit') or opts.get('force_editor') |
185 editopt = opts.get('edit') or opts.get('force_editor') |
160 editor = cmdutil.getcommiteditor(edit=editopt, editform='fetch') |
186 editor = cmdutil.getcommiteditor(edit=editopt, editform='fetch') |
161 n = repo.commit(message, opts['user'], opts['date'], editor=editor) |
187 n = repo.commit(message, opts['user'], opts['date'], editor=editor) |
162 ui.status(_('new changeset %d:%s merges remote changes ' |
188 ui.status( |
163 'with local\n') % (repo.changelog.rev(n), |
189 _('new changeset %d:%s merges remote changes ' 'with local\n') |
164 short(n))) |
190 % (repo.changelog.rev(n), short(n)) |
|
191 ) |
165 |
192 |
166 return err |
193 return err |
167 |
194 |
168 finally: |
195 finally: |
169 release(lock, wlock) |
196 release(lock, wlock) |