Mercurial > public > mercurial-scm > hg
comparison mercurial/localrepo.py @ 4916: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
4915:97b734fb9c6f | 4916: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: |