comparison mercurial/localrepo.py @ 3854:4f6db0233606

Merge Benoit's .hg/store support
author Matt Mackall <mpm@selenic.com>
date Sun, 10 Dec 2006 02:11:02 -0600
parents d1ce5461beed c0b449154a90
children db36a4f490f6
comparison
equal deleted inserted replaced
3848:8cbf060f637e 3854:4f6db0233606
14 demandload(globals(), "re lock transaction tempfile stat mdiff errno ui") 14 demandload(globals(), "re lock transaction tempfile stat mdiff errno ui")
15 demandload(globals(), "os revlog time util") 15 demandload(globals(), "os revlog time util")
16 16
17 class localrepository(repo.repository): 17 class localrepository(repo.repository):
18 capabilities = ('lookup', 'changegroupsubset') 18 capabilities = ('lookup', 'changegroupsubset')
19 supported = ('revlogv1', 'store')
19 20
20 def __del__(self): 21 def __del__(self):
21 self.transhandle = None 22 self.transhandle = None
22 def __init__(self, parentui, path=None, create=0): 23 def __init__(self, parentui, path=None, create=0):
23 repo.repository.__init__(self) 24 repo.repository.__init__(self)
28 p = os.path.dirname(p) 29 p = os.path.dirname(p)
29 if p == oldp: 30 if p == oldp:
30 raise repo.RepoError(_("There is no Mercurial repository" 31 raise repo.RepoError(_("There is no Mercurial repository"
31 " here (.hg not found)")) 32 " here (.hg not found)"))
32 path = p 33 path = p
34
33 self.path = os.path.join(path, ".hg") 35 self.path = os.path.join(path, ".hg")
34 self.spath = self.path 36 self.root = os.path.realpath(path)
37 self.origroot = path
38 self.opener = util.opener(self.path)
39 self.wopener = util.opener(self.root)
35 40
36 if not os.path.isdir(self.path): 41 if not os.path.isdir(self.path):
37 if create: 42 if create:
38 if not os.path.exists(path): 43 if not os.path.exists(path):
39 os.mkdir(path) 44 os.mkdir(path)
40 os.mkdir(self.path) 45 os.mkdir(self.path)
41 if self.spath != self.path: 46 os.mkdir(os.path.join(self.path, "store"))
42 os.mkdir(self.spath) 47 requirements = ("revlogv1", "store")
48 reqfile = self.opener("requires", "w")
49 for r in requirements:
50 reqfile.write("%s\n" % r)
51 reqfile.close()
52 # create an invalid changelog
53 self.opener("00changelog.i", "a").write('\0\0\0\2')
43 else: 54 else:
44 raise repo.RepoError(_("repository %s not found") % path) 55 raise repo.RepoError(_("repository %s not found") % path)
45 elif create: 56 elif create:
46 raise repo.RepoError(_("repository %s already exists") % path) 57 raise repo.RepoError(_("repository %s already exists") % path)
47 58 else:
48 self.root = os.path.realpath(path) 59 # find requirements
49 self.origroot = path 60 try:
61 requirements = self.opener("requires").read().splitlines()
62 except IOError, inst:
63 if inst.errno != errno.ENOENT:
64 raise
65 requirements = []
66 # check them
67 for r in requirements:
68 if r not in self.supported:
69 raise repo.RepoError(_("requirement '%s' not supported") % r)
70
71 # setup store
72 if "store" in requirements:
73 self.encodefn = util.encodefilename
74 self.decodefn = util.decodefilename
75 self.spath = os.path.join(self.path, "store")
76 else:
77 self.encodefn = lambda x: x
78 self.decodefn = lambda x: x
79 self.spath = self.path
80 self.sopener = util.encodedopener(util.opener(self.spath), self.encodefn)
81
50 self.ui = ui.ui(parentui=parentui) 82 self.ui = ui.ui(parentui=parentui)
51 self.opener = util.opener(self.path)
52 self.sopener = util.opener(self.spath)
53 self.wopener = util.opener(self.root)
54
55 try: 83 try:
56 self.ui.readconfig(self.join("hgrc"), self.root) 84 self.ui.readconfig(self.join("hgrc"), self.root)
57 except IOError: 85 except IOError:
58 pass 86 pass
59 87
406 434
407 def join(self, f): 435 def join(self, f):
408 return os.path.join(self.path, f) 436 return os.path.join(self.path, f)
409 437
410 def sjoin(self, f): 438 def sjoin(self, f):
439 f = self.encodefn(f)
411 return os.path.join(self.spath, f) 440 return os.path.join(self.spath, f)
412 441
413 def wjoin(self, f): 442 def wjoin(self, f):
414 return os.path.join(self.root, f) 443 return os.path.join(self.root, f)
415 444