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() |