117 pulls.append(node) |
117 pulls.append(node) |
118 p1 = node |
118 p1 = node |
119 continue |
119 continue |
120 if pulls: |
120 if pulls: |
121 if source != repo: |
121 if source != repo: |
122 repo.pull(source, heads=pulls, lock=lock) |
122 repo.pull(source, heads=pulls) |
123 merge.update(repo, pulls[-1], False, False, None, |
123 merge.update(repo, pulls[-1], False, False, None) |
124 wlock=wlock) |
|
125 p1, p2 = repo.dirstate.parents() |
124 p1, p2 = repo.dirstate.parents() |
126 pulls = [] |
125 pulls = [] |
127 |
126 |
128 domerge = False |
127 domerge = False |
129 if node in merges: |
128 if node in merges: |
130 # pulling all the merge revs at once would mean we couldn't |
129 # pulling all the merge revs at once would mean we couldn't |
131 # transplant after the latest even if transplants before them |
130 # transplant after the latest even if transplants before them |
132 # fail. |
131 # fail. |
133 domerge = True |
132 domerge = True |
134 if not hasnode(repo, node): |
133 if not hasnode(repo, node): |
135 repo.pull(source, heads=[node], lock=lock) |
134 repo.pull(source, heads=[node]) |
136 |
135 |
137 if parents[1] != revlog.nullid: |
136 if parents[1] != revlog.nullid: |
138 self.ui.note(_('skipping merge changeset %s:%s\n') |
137 self.ui.note(_('skipping merge changeset %s:%s\n') |
139 % (rev, revlog.short(node))) |
138 % (rev, revlog.short(node))) |
140 patchfile = None |
139 patchfile = None |
145 fp.close() |
144 fp.close() |
146 |
145 |
147 del revmap[rev] |
146 del revmap[rev] |
148 if patchfile or domerge: |
147 if patchfile or domerge: |
149 try: |
148 try: |
150 n = self.applyone(repo, node, source.changelog.read(node), |
149 n = self.applyone(repo, node, |
|
150 source.changelog.read(node), |
151 patchfile, merge=domerge, |
151 patchfile, merge=domerge, |
152 log=opts.get('log'), |
152 log=opts.get('log'), |
153 filter=opts.get('filter'), |
153 filter=opts.get('filter')) |
154 lock=lock, wlock=wlock) |
|
155 if n and domerge: |
154 if n and domerge: |
156 self.ui.status(_('%s merged at %s\n') % (revstr, |
155 self.ui.status(_('%s merged at %s\n') % (revstr, |
157 revlog.short(n))) |
156 revlog.short(n))) |
158 elif n: |
157 elif n: |
159 self.ui.status(_('%s transplanted to %s\n') % (revlog.short(node), |
158 self.ui.status(_('%s transplanted to %s\n') % (revlog.short(node), |
160 revlog.short(n))) |
159 revlog.short(n))) |
161 finally: |
160 finally: |
162 if patchfile: |
161 if patchfile: |
163 os.unlink(patchfile) |
162 os.unlink(patchfile) |
164 if pulls: |
163 if pulls: |
165 repo.pull(source, heads=pulls, lock=lock) |
164 repo.pull(source, heads=pulls) |
166 merge.update(repo, pulls[-1], False, False, None, wlock=wlock) |
165 merge.update(repo, pulls[-1], False, False, None) |
167 finally: |
166 finally: |
168 self.saveseries(revmap, merges) |
167 self.saveseries(revmap, merges) |
169 self.transplants.write() |
168 self.transplants.write() |
170 del lock, wlock |
169 del lock, wlock |
171 |
170 |
193 os.unlink(headerfile) |
192 os.unlink(headerfile) |
194 |
193 |
195 return (user, date, msg) |
194 return (user, date, msg) |
196 |
195 |
197 def applyone(self, repo, node, cl, patchfile, merge=False, log=False, |
196 def applyone(self, repo, node, cl, patchfile, merge=False, log=False, |
198 filter=None, lock=None, wlock=None): |
197 filter=None): |
199 '''apply the patch in patchfile to the repository as a transplant''' |
198 '''apply the patch in patchfile to the repository as a transplant''' |
200 (manifest, user, (time, timezone), files, message) = cl[:5] |
199 (manifest, user, (time, timezone), files, message) = cl[:5] |
201 date = "%d %d" % (time, timezone) |
200 date = "%d %d" % (time, timezone) |
202 extra = {'transplant_source': node} |
201 extra = {'transplant_source': node} |
203 if filter: |
202 if filter: |
219 files=files) |
218 files=files) |
220 if not files: |
219 if not files: |
221 self.ui.warn(_('%s: empty changeset') % revlog.hex(node)) |
220 self.ui.warn(_('%s: empty changeset') % revlog.hex(node)) |
222 return None |
221 return None |
223 finally: |
222 finally: |
224 files = patch.updatedir(self.ui, repo, files, wlock=wlock) |
223 files = patch.updatedir(self.ui, repo, files) |
225 except Exception, inst: |
224 except Exception, inst: |
226 if filter: |
225 if filter: |
227 os.unlink(patchfile) |
226 os.unlink(patchfile) |
228 seriespath = os.path.join(self.path, 'series') |
227 seriespath = os.path.join(self.path, 'series') |
229 if os.path.exists(seriespath): |
228 if os.path.exists(seriespath): |
237 files = None |
236 files = None |
238 if merge: |
237 if merge: |
239 p1, p2 = repo.dirstate.parents() |
238 p1, p2 = repo.dirstate.parents() |
240 repo.dirstate.setparents(p1, node) |
239 repo.dirstate.setparents(p1, node) |
241 |
240 |
242 n = repo.commit(files, message, user, date, lock=lock, wlock=wlock, |
241 n = repo.commit(files, message, user, date, extra=extra) |
243 extra=extra) |
|
244 if not merge: |
242 if not merge: |
245 self.transplants.set(n, node) |
243 self.transplants.set(n, node) |
246 |
244 |
247 return n |
245 return n |
248 |
246 |
280 raise util.Abort( |
278 raise util.Abort( |
281 _('working dir not at transplant parent %s') % |
279 _('working dir not at transplant parent %s') % |
282 revlog.hex(parents[0])) |
280 revlog.hex(parents[0])) |
283 if merge: |
281 if merge: |
284 repo.dirstate.setparents(p1, parents[1]) |
282 repo.dirstate.setparents(p1, parents[1]) |
285 n = repo.commit(None, message, user, date, wlock=wlock, |
283 n = repo.commit(None, message, user, date, extra=extra) |
286 extra=extra) |
|
287 if not n: |
284 if not n: |
288 raise util.Abort(_('commit failed')) |
285 raise util.Abort(_('commit failed')) |
289 if not merge: |
286 if not merge: |
290 self.transplants.set(n, node) |
287 self.transplants.set(n, node) |
291 self.unlog() |
288 self.unlog() |