mercurial/localrepo.py
changeset 4960 5c5d23d93447
parent 4959 97b734fb9c6f
child 4961 126f527b3ba3
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: