hgext/transplant.py
changeset 4961 126f527b3ba3
parent 4959 97b734fb9c6f
equal deleted inserted replaced
4960:5c5d23d93447 4961:126f527b3ba3
   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()