mercurial/localrepo.py
changeset 1100 d6b6a15cc7c6
parent 1094 221b5252864c
parent 1097 1f89ccbab6ce
child 1101 2cf5c8a4eae5
equal deleted inserted replaced
1099:0cb9c72b6c03 1100:d6b6a15cc7c6
     4 #
     4 #
     5 # This software may be used and distributed according to the terms
     5 # This software may be used and distributed according to the terms
     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 import struct, os, util
     8 import struct, os, util
     9 from repo import *
     9 import filelog, manifest, changelog, dirstate, repo
    10 from revlog import *
    10 from node import *
    11 from filelog import *
       
    12 from manifest import *
       
    13 from changelog import *
       
    14 from dirstate import *
       
    15 from demandload import *
    11 from demandload import *
    16 demandload(globals(), "re lock transaction tempfile stat")
    12 demandload(globals(), "re lock transaction tempfile stat mdiff")
    17 
    13 
    18 class localrepository:
    14 class localrepository:
    19     def __init__(self, ui, opener, path=None, create=0):
    15     def __init__(self, ui, opener, path=None, create=0):
    20         self.remote = 0
    16         self.remote = 0
    21         if path and path.startswith("http://"):
    17         if path and path.startswith("http://"):
    25             if not path:
    21             if not path:
    26                 p = os.getcwd()
    22                 p = os.getcwd()
    27                 while not os.path.isdir(os.path.join(p, ".hg")):
    23                 while not os.path.isdir(os.path.join(p, ".hg")):
    28                     oldp = p
    24                     oldp = p
    29                     p = os.path.dirname(p)
    25                     p = os.path.dirname(p)
    30                     if p == oldp: raise RepoError("no repo found")
    26                     if p == oldp: raise repo.RepoError("no repo found")
    31                 path = p
    27                 path = p
    32             self.path = os.path.join(path, ".hg")
    28             self.path = os.path.join(path, ".hg")
    33 
    29 
    34             if not create and not os.path.isdir(self.path):
    30             if not create and not os.path.isdir(self.path):
    35                 raise RepoError("repository %s not found" % self.path)
    31                 raise repo.RepoError("repository %s not found" % self.path)
    36 
    32 
    37         self.root = os.path.abspath(path)
    33         self.root = os.path.abspath(path)
    38         self.ui = ui
    34         self.ui = ui
    39 
    35 
    40         if create:
    36         if create:
    41             os.mkdir(self.path)
    37             os.mkdir(self.path)
    42             os.mkdir(self.join("data"))
    38             os.mkdir(self.join("data"))
    43 
    39 
    44         self.opener = opener(self.path)
    40         self.opener = opener(self.path)
    45         self.wopener = opener(self.root)
    41         self.wopener = opener(self.root)
    46         self.manifest = manifest(self.opener)
    42         self.manifest = manifest.manifest(self.opener)
    47         self.changelog = changelog(self.opener)
    43         self.changelog = changelog.changelog(self.opener)
    48         self.tagscache = None
    44         self.tagscache = None
    49         self.nodetagscache = None
    45         self.nodetagscache = None
    50 
    46 
    51         if not self.remote:
    47         if not self.remote:
    52             self.dirstate = dirstate(self.opener, ui, self.root)
    48             self.dirstate = dirstate.dirstate(self.opener, ui, self.root)
    53             try:
    49             try:
    54                 self.ui.readconfig(self.opener("hgrc"))
    50                 self.ui.readconfig(self.opener("hgrc"))
    55             except IOError: pass
    51             except IOError: pass
    56 
    52 
    57     def hook(self, name, **args):
    53     def hook(self, name, **args):
   141             return self.tags()[key]
   137             return self.tags()[key]
   142         except KeyError:
   138         except KeyError:
   143             try:
   139             try:
   144                 return self.changelog.lookup(key)
   140                 return self.changelog.lookup(key)
   145             except:
   141             except:
   146                 raise RepoError("unknown revision '%s'" % key)
   142                 raise repo.RepoError("unknown revision '%s'" % key)
   147 
   143 
   148     def dev(self):
   144     def dev(self):
   149         if self.remote: return -1
   145         if self.remote: return -1
   150         return os.stat(self.path).st_dev
   146         return os.stat(self.path).st_dev
   151 
   147 
   158     def wjoin(self, f):
   154     def wjoin(self, f):
   159         return os.path.join(self.root, f)
   155         return os.path.join(self.root, f)
   160 
   156 
   161     def file(self, f):
   157     def file(self, f):
   162         if f[0] == '/': f = f[1:]
   158         if f[0] == '/': f = f[1:]
   163         return filelog(self.opener, f)
   159         return filelog.filelog(self.opener, f)
   164 
   160 
   165     def getcwd(self):
   161     def getcwd(self):
   166         return self.dirstate.getcwd()
   162         return self.dirstate.getcwd()
   167 
   163 
   168     def wfile(self, f, mode='r'):
   164     def wfile(self, f, mode='r'):
   205         if os.path.exists(self.join("undo")):
   201         if os.path.exists(self.join("undo")):
   206             self.ui.status("rolling back last transaction\n")
   202             self.ui.status("rolling back last transaction\n")
   207             transaction.rollback(self.opener, self.join("undo"))
   203             transaction.rollback(self.opener, self.join("undo"))
   208             self.dirstate = None
   204             self.dirstate = None
   209             util.rename(self.join("undo.dirstate"), self.join("dirstate"))
   205             util.rename(self.join("undo.dirstate"), self.join("dirstate"))
   210             self.dirstate = dirstate(self.opener, self.ui, self.root)
   206             self.dirstate = dirstate.dirstate(self.opener, self.ui, self.root)
   211         else:
   207         else:
   212             self.ui.warn("no undo information available\n")
   208             self.ui.warn("no undo information available\n")
   213 
   209 
   214     def lock(self, wait=1):
   210     def lock(self, wait=1):
   215         try:
   211         try:
   808                 p, f = i, f * 2
   804                 p, f = i, f * 2
   809 
   805 
   810         # sanity check our fetch list
   806         # sanity check our fetch list
   811         for f in fetch.keys():
   807         for f in fetch.keys():
   812             if f in m:
   808             if f in m:
   813                 raise RepoError("already have changeset " + short(f[:4]))
   809                 raise repo.RepoError("already have changeset " + short(f[:4]))
   814 
   810 
   815         if base.keys() == [nullid]:
   811         if base.keys() == [nullid]:
   816             self.ui.warn("warning: pulling from an unrelated repository!\n")
   812             self.ui.warn("warning: pulling from an unrelated repository!\n")
   817 
   813 
   818         self.ui.note("found new changesets starting at " +
   814         self.ui.note("found new changesets starting at " +