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 |
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: |