def resume(self, repo, source, opts=None): '''recover last transaction and apply remaining changesets''' if os.path.exists(os.path.join(self.path, 'journal')): n, node = self.recover(repo) self.ui.status(_('%s transplanted as %s\n') % (revlog.short(node), revlog.short(n))) seriespath = os.path.join(self.path, 'series') if not os.path.exists(seriespath): self.transplants.write() return nodes, merges = self.readseries() revmap = {} for n in nodes: revmap[source.changelog.rev(n)] = n os.unlink(seriespath) self.apply(repo, source, revmap, merges, opts)
def applyone(self, repo, node, cl, patchfile, merge=False, log=False, filter=None): '''apply the patch in patchfile to the repository as a transplant''' (manifest, user, (time, timezone), files, message) = cl[:5] date = "%d %d" % (time, timezone) extra = {'transplant_source': node} if filter: (user, date, message) = self.filter(filter, cl, patchfile) if log: # we don't translate messages inserted into commits message += '\n(transplanted from %s)' % revlog.hex(node) self.ui.status(_('applying %s\n') % revlog.short(node)) self.ui.note('%s %s\n%s\n' % (user, date, message)) if not patchfile and not merge: raise util.Abort(_('can only omit patchfile if merging')) if patchfile: try: files = {} try: patch.patch(patchfile, self.ui, cwd=repo.root, files=files, eolmode=None) if not files: self.ui.warn( _('%s: empty changeset') % revlog.hex(node)) return None finally: files = patch.updatedir(self.ui, repo, files) except Exception, inst: if filter: os.unlink(patchfile) seriespath = os.path.join(self.path, 'series') if os.path.exists(seriespath): os.unlink(seriespath) p1 = repo.dirstate.parents()[0] p2 = node self.log(user, date, message, p1, p2, merge=merge) self.ui.write(str(inst) + '\n') raise util.Abort( _('Fix up the merge and run ' 'hg transplant --continue'))
def applyone(self, repo, node, cl, patchfile, merge=False, log=False, filter=None): '''apply the patch in patchfile to the repository as a transplant''' (manifest, user, (time, timezone), files, message) = cl[:5] date = "%d %d" % (time, timezone) extra = {'transplant_source': node} if filter: (user, date, message) = self.filter(filter, cl, patchfile) if log: # we don't translate messages inserted into commits message += '\n(transplanted from %s)' % revlog.hex(node) self.ui.status(_('applying %s\n') % revlog.short(node)) self.ui.note('%s %s\n%s\n' % (user, date, message)) if not patchfile and not merge: raise util.Abort(_('can only omit patchfile if merging')) if patchfile: try: files = {} try: patch.patch(patchfile, self.ui, cwd=repo.root, files=files, eolmode=None) if not files: self.ui.warn(_('%s: empty changeset') % revlog.hex(node)) return None finally: files = patch.updatedir(self.ui, repo, files) except Exception, inst: if filter: os.unlink(patchfile) seriespath = os.path.join(self.path, 'series') if os.path.exists(seriespath): os.unlink(seriespath) p1 = repo.dirstate.parents()[0] p2 = node self.log(user, date, message, p1, p2, merge=merge) self.ui.write(str(inst) + '\n') raise util.Abort(_('Fix up the merge and run ' 'hg transplant --continue'))
def apply(self, repo, source, revmap, merges, opts={}): '''apply the revisions in revmap one by one in revision order''' revs = revmap.keys() revs.sort() p1, p2 = repo.dirstate.parents() pulls = [] diffopts = patch.diffopts(self.ui, opts) diffopts.git = True lock = wlock = None try: wlock = repo.wlock() lock = repo.lock() for rev in revs: node = revmap[rev] revstr = '%s:%s' % (rev, revlog.short(node)) if self.applied(repo, node, p1): self.ui.warn(_('skipping already applied revision %s\n') % revstr) continue parents = source.changelog.parents(node) if not opts.get('filter'): # If the changeset parent is the same as the wdir's parent, # just pull it. if parents[0] == p1: pulls.append(node) p1 = node continue if pulls: if source != repo: repo.pull(source, heads=pulls) merge.update(repo, pulls[-1], False, False, None) p1, p2 = repo.dirstate.parents() pulls = [] domerge = False if node in merges: # pulling all the merge revs at once would mean we couldn't # transplant after the latest even if transplants before them # fail. domerge = True if not hasnode(repo, node): repo.pull(source, heads=[node]) if parents[1] != revlog.nullid: self.ui.note(_('skipping merge changeset %s:%s\n') % (rev, revlog.short(node))) patchfile = None else: fd, patchfile = tempfile.mkstemp(prefix='hg-transplant-') fp = os.fdopen(fd, 'w') patch.diff(source, parents[0], node, fp=fp, opts=diffopts) fp.close() del revmap[rev] if patchfile or domerge: try: n = self.applyone(repo, node, source.changelog.read(node), patchfile, merge=domerge, log=opts.get('log'), filter=opts.get('filter')) if n and domerge: self.ui.status(_('%s merged at %s\n') % (revstr, revlog.short(n))) elif n: self.ui.status(_('%s transplanted to %s\n') % (revlog.short(node), revlog.short(n))) finally: if patchfile: os.unlink(patchfile) if pulls: repo.pull(source, heads=pulls) merge.update(repo, pulls[-1], False, False, None) finally: self.saveseries(revmap, merges) self.transplants.write() del lock, wlock
def apply(self, repo, source, revmap, merges, opts={}): '''apply the revisions in revmap one by one in revision order''' revs = revmap.keys() revs.sort() p1, p2 = repo.dirstate.parents() pulls = [] diffopts = patch.diffopts(self.ui, opts) diffopts.git = True lock = wlock = None try: wlock = repo.wlock() lock = repo.lock() for rev in revs: node = revmap[rev] revstr = '%s:%s' % (rev, revlog.short(node)) if self.applied(repo, node, p1): self.ui.warn( _('skipping already applied revision %s\n') % revstr) continue parents = source.changelog.parents(node) if not opts.get('filter'): # If the changeset parent is the same as the wdir's parent, # just pull it. if parents[0] == p1: pulls.append(node) p1 = node continue if pulls: if source != repo: repo.pull(source, heads=pulls) merge.update(repo, pulls[-1], False, False, None) p1, p2 = repo.dirstate.parents() pulls = [] domerge = False if node in merges: # pulling all the merge revs at once would mean we couldn't # transplant after the latest even if transplants before them # fail. domerge = True if not hasnode(repo, node): repo.pull(source, heads=[node]) if parents[1] != revlog.nullid: self.ui.note( _('skipping merge changeset %s:%s\n') % (rev, revlog.short(node))) patchfile = None else: fd, patchfile = tempfile.mkstemp(prefix='hg-transplant-') fp = os.fdopen(fd, 'w') patch.diff(source, parents[0], node, fp=fp, opts=diffopts) fp.close() del revmap[rev] if patchfile or domerge: try: n = self.applyone(repo, node, source.changelog.read(node), patchfile, merge=domerge, log=opts.get('log'), filter=opts.get('filter')) if n and domerge: self.ui.status( _('%s merged at %s\n') % (revstr, revlog.short(n))) elif n: self.ui.status( _('%s transplanted to %s\n') % (revlog.short(node), revlog.short(n))) finally: if patchfile: os.unlink(patchfile) if pulls: repo.pull(source, heads=pulls) merge.update(repo, pulls[-1], False, False, None) finally: self.saveseries(revmap, merges) self.transplants.write() del lock, wlock