mercurial/localrepo.py
changeset 17139 ad1b5e070f16
parent 17137 b090601a80d1
parent 17126 8fa8717b47b6
child 17156 7034365089bf
equal deleted inserted replaced
17138:528cb91a90ee 17139:ad1b5e070f16
   195     def _phasecache(self):
   195     def _phasecache(self):
   196         return phases.phasecache(self, self._phasedefaults)
   196         return phases.phasecache(self, self._phasedefaults)
   197 
   197 
   198     @storecache('obsstore')
   198     @storecache('obsstore')
   199     def obsstore(self):
   199     def obsstore(self):
   200         store = obsolete.obsstore()
   200         store = obsolete.obsstore(self.sopener)
   201         data = self.sopener.tryread('obsstore')
       
   202         if data:
       
   203             store.loadmarkers(data)
       
   204         return store
   201         return store
   205 
   202 
   206     @storecache('00changelog.i')
   203     @storecache('00changelog.i')
   207     def changelog(self):
   204     def changelog(self):
   208         c = changelog.changelog(self.sopener)
   205         c = changelog.changelog(self.sopener)
   992 
   989 
   993         def unlock():
   990         def unlock():
   994             self.store.write()
   991             self.store.write()
   995             if '_phasecache' in vars(self):
   992             if '_phasecache' in vars(self):
   996                 self._phasecache.write()
   993                 self._phasecache.write()
   997             if 'obsstore' in vars(self) and self.obsstore._new:
       
   998                 # XXX: transaction logic should be used here. But for
       
   999                 # now rewriting the whole file is good enough.
       
  1000                 f = self.sopener('obsstore', 'wb', atomictemp=True)
       
  1001                 try:
       
  1002                     self.obsstore.flushmarkers(f)
       
  1003                     f.close()
       
  1004                 except: # re-raises
       
  1005                     f.discard()
       
  1006                     raise
       
  1007             for k, ce in self._filecache.items():
   994             for k, ce in self._filecache.items():
  1008                 if k == 'dirstate':
   995                 if k == 'dirstate':
  1009                     continue
   996                     continue
  1010                 ce.refresh()
   997                 ce.refresh()
  1011 
   998 
  1620             r.append(l)
  1607             r.append(l)
  1621 
  1608 
  1622         return r
  1609         return r
  1623 
  1610 
  1624     def pull(self, remote, heads=None, force=False):
  1611     def pull(self, remote, heads=None, force=False):
       
  1612         # don't open transaction for nothing or you break future useful
       
  1613         # rollback call
       
  1614         tr = None
       
  1615         trname = 'pull\n' + util.hidepassword(remote.url())
  1625         lock = self.lock()
  1616         lock = self.lock()
  1626         try:
  1617         try:
  1627             tmp = discovery.findcommonincoming(self, remote, heads=heads,
  1618             tmp = discovery.findcommonincoming(self, remote, heads=heads,
  1628                                                force=force)
  1619                                                force=force)
  1629             common, fetch, rheads = tmp
  1620             common, fetch, rheads = tmp
  1630             if not fetch:
  1621             if not fetch:
  1631                 self.ui.status(_("no changes found\n"))
  1622                 self.ui.status(_("no changes found\n"))
  1632                 added = []
  1623                 added = []
  1633                 result = 0
  1624                 result = 0
  1634             else:
  1625             else:
       
  1626                 tr = self.transaction(trname)
  1635                 if heads is None and list(common) == [nullid]:
  1627                 if heads is None and list(common) == [nullid]:
  1636                     self.ui.status(_("requesting all changes\n"))
  1628                     self.ui.status(_("requesting all changes\n"))
  1637                 elif heads is None and remote.capable('changegroupsubset'):
  1629                 elif heads is None and remote.capable('changegroupsubset'):
  1638                     # issue1320, avoid a race if remote changed after discovery
  1630                     # issue1320, avoid a race if remote changed after discovery
  1639                     heads = rheads
  1631                     heads = rheads
  1678                 # should be seen as public
  1670                 # should be seen as public
  1679                 phases.advanceboundary(self, phases.public, subset)
  1671                 phases.advanceboundary(self, phases.public, subset)
  1680 
  1672 
  1681             remoteobs = remote.listkeys('obsolete')
  1673             remoteobs = remote.listkeys('obsolete')
  1682             if 'dump' in remoteobs:
  1674             if 'dump' in remoteobs:
       
  1675                 if tr is None:
       
  1676                     tr = self.transaction(trname)
  1683                 data = base85.b85decode(remoteobs['dump'])
  1677                 data = base85.b85decode(remoteobs['dump'])
  1684                 self.obsstore.mergemarkers(data)
  1678                 self.obsstore.mergemarkers(tr, data)
       
  1679             if tr is not None:
       
  1680                 tr.close()
  1685         finally:
  1681         finally:
       
  1682             if tr is not None:
       
  1683                 tr.release()
  1686             lock.release()
  1684             lock.release()
  1687 
  1685 
  1688         return result
  1686         return result
  1689 
  1687 
  1690     def checkpush(self, force, revs):
  1688     def checkpush(self, force, revs):
  1821                                            str(phases.public))
  1819                                            str(phases.public))
  1822                         if not r:
  1820                         if not r:
  1823                             self.ui.warn(_('updating %s to public failed!\n')
  1821                             self.ui.warn(_('updating %s to public failed!\n')
  1824                                             % newremotehead)
  1822                                             % newremotehead)
  1825                 if 'obsolete' in self.listkeys('namespaces') and self.obsstore:
  1823                 if 'obsolete' in self.listkeys('namespaces') and self.obsstore:
  1826                     data = self.obsstore._writemarkers()
  1824                     data = self.listkeys('obsolete')['dump']
  1827                     r = remote.pushkey('obsolete', 'dump', '',
  1825                     r = remote.pushkey('obsolete', 'dump', '', data)
  1828                                        base85.b85encode(data))
       
  1829                     if not r:
  1826                     if not r:
  1830                         self.ui.warn(_('failed to push obsolete markers!\n'))
  1827                         self.ui.warn(_('failed to push obsolete markers!\n'))
  1831             finally:
  1828             finally:
  1832                 if lock is not None:
  1829                 if lock is not None:
  1833                     lock.release()
  1830                     lock.release()