comparison mercurial/localrepo.py @ 4960:5c5d23d93447

Use a weakref for recursive transactions
author Matt Mackall <mpm@selenic.com>
date Sat, 21 Jul 2007 16:02:10 -0500
parents 97b734fb9c6f
children 126f527b3ba3
comparison
equal deleted inserted replaced
4959:97b734fb9c6f 4960:5c5d23d93447
6 # of the GNU General Public License, incorporated herein by reference. 6 # of the GNU General Public License, incorporated herein by reference.
7 7
8 from node import * 8 from node import *
9 from i18n import _ 9 from i18n import _
10 import repo, changegroup 10 import repo, changegroup
11 import changelog, dirstate, filelog, manifest, context 11 import changelog, dirstate, filelog, manifest, context, weakref
12 import re, lock, transaction, tempfile, stat, mdiff, errno, ui 12 import re, lock, transaction, tempfile, stat, mdiff, errno, ui
13 import os, revlog, time, util, extensions, hook 13 import os, revlog, time, util, extensions, hook
14 14
15 class localrepository(repo.repository): 15 class localrepository(repo.repository):
16 capabilities = ('lookup', 'changegroupsubset') 16 capabilities = ('lookup', 'changegroupsubset')
17 supported = ('revlogv1', 'store') 17 supported = ('revlogv1', 'store')
18 18
19 def __del__(self):
20 self.transhandle = None
21 def __init__(self, parentui, path=None, create=0): 19 def __init__(self, parentui, path=None, create=0):
22 repo.repository.__init__(self) 20 repo.repository.__init__(self)
23 self.path = path 21 self.path = path
24 self.root = os.path.realpath(path) 22 self.root = os.path.realpath(path)
25 self.path = os.path.join(self.root, ".hg") 23 self.path = os.path.join(self.root, ".hg")
82 80
83 self.tagscache = None 81 self.tagscache = None
84 self.branchcache = None 82 self.branchcache = None
85 self.nodetagscache = None 83 self.nodetagscache = None
86 self.filterpats = {} 84 self.filterpats = {}
87 self.transhandle = None 85 self._transref = self._lockref = self._wlockref = None
88 86
89 def __getattr__(self, name): 87 def __getattr__(self, name):
90 if name == 'changelog': 88 if name == 'changelog':
91 self.changelog = changelog.changelog(self.sopener) 89 self.changelog = changelog.changelog(self.sopener)
92 self.sopener.defversion = self.changelog.version 90 self.sopener.defversion = self.changelog.version
394 if key in self.branchtags(): 392 if key in self.branchtags():
395 return self.branchtags()[key] 393 return self.branchtags()[key]
396 n = self.changelog._partialmatch(key) 394 n = self.changelog._partialmatch(key)
397 if n: 395 if n:
398 return n 396 return n
397 try:
398 if len(key) == 20:
399 key = hex(key)
400 except:
401 pass
399 raise repo.RepoError(_("unknown revision '%s'") % key) 402 raise repo.RepoError(_("unknown revision '%s'") % key)
400 403
401 def dev(self): 404 def dev(self):
402 return os.lstat(self.path).st_dev 405 return os.lstat(self.path).st_dev
403 406
493 496
494 def wwritedata(self, filename, data): 497 def wwritedata(self, filename, data):
495 return self._filter("decode", filename, data) 498 return self._filter("decode", filename, data)
496 499
497 def transaction(self): 500 def transaction(self):
498 tr = self.transhandle 501 if self._transref and self._transref():
499 if tr != None and tr.running(): 502 return self._transref().nest()
500 return tr.nest()
501 503
502 # save dirstate for rollback 504 # save dirstate for rollback
503 try: 505 try:
504 ds = self.opener("dirstate").read() 506 ds = self.opener("dirstate").read()
505 except IOError: 507 except IOError:
509 renames = [(self.sjoin("journal"), self.sjoin("undo")), 511 renames = [(self.sjoin("journal"), self.sjoin("undo")),
510 (self.join("journal.dirstate"), self.join("undo.dirstate"))] 512 (self.join("journal.dirstate"), self.join("undo.dirstate"))]
511 tr = transaction.transaction(self.ui.warn, self.sopener, 513 tr = transaction.transaction(self.ui.warn, self.sopener,
512 self.sjoin("journal"), 514 self.sjoin("journal"),
513 aftertrans(renames)) 515 aftertrans(renames))
514 self.transhandle = tr 516 self._transref = weakref.ref(tr)
515 return tr 517 return tr
516 518
517 def recover(self): 519 def recover(self):
518 l = self.lock() 520 l = self.lock()
519 try: 521 try: