comparison mercurial/localrepo.py @ 6840:80e51429cb9a

introduce store classes move store walking from streamclone.py into store.py
author Adrian Buehlmann <adrian@cadifra.com>
date Thu, 24 Jul 2008 16:32:52 +0200
parents 01db3e101362
children 077f1e637cd8
comparison
equal deleted inserted replaced
6839:01db3e101362 6840:80e51429cb9a
58 # check them 58 # check them
59 for r in requirements: 59 for r in requirements:
60 if r not in self.supported: 60 if r not in self.supported:
61 raise repo.RepoError(_("requirement '%s' not supported") % r) 61 raise repo.RepoError(_("requirement '%s' not supported") % r)
62 62
63 # setup store 63 self.store = store.store(requirements, self.path)
64 if "store" in requirements: 64
65 self.encodefn = store.encodefilename 65 self.spath = self.store.path
66 self.decodefn = store.decodefilename 66 self.sopener = self.store.opener
67 self.spath = os.path.join(self.path, "store") 67 self.sjoin = self.store.join
68 else: 68 self._createmode = self.store.createmode
69 self.encodefn = lambda x: x 69 self.opener.createmode = self.store.createmode
70 self.decodefn = lambda x: x
71 self.spath = self.path
72
73 try:
74 # files in .hg/ will be created using this mode
75 mode = os.stat(self.spath).st_mode
76 # avoid some useless chmods
77 if (0777 & ~util._umask) == (0777 & mode):
78 mode = None
79 except OSError:
80 mode = None
81
82 self._createmode = mode
83 self.opener.createmode = mode
84 sopener = util.opener(self.spath)
85 sopener.createmode = mode
86 self.sopener = store.encodedopener(sopener, self.encodefn)
87 70
88 self.ui = ui.ui(parentui=parentui) 71 self.ui = ui.ui(parentui=parentui)
89 try: 72 try:
90 self.ui.readconfig(self.join("hgrc"), self.root) 73 self.ui.readconfig(self.join("hgrc"), self.root)
91 extensions.loadall(self.ui) 74 extensions.loadall(self.ui)
478 def local(self): 461 def local(self):
479 return True 462 return True
480 463
481 def join(self, f): 464 def join(self, f):
482 return os.path.join(self.path, f) 465 return os.path.join(self.path, f)
483
484 def sjoin(self, f):
485 f = self.encodefn(f)
486 return os.path.join(self.spath, f)
487 466
488 def wjoin(self, f): 467 def wjoin(self, f):
489 return os.path.join(self.root, f) 468 return os.path.join(self.root, f)
490 469
491 def rjoin(self, f): 470 def rjoin(self, f):
2059 2038
2060 if stream and not heads and remote.capable('stream'): 2039 if stream and not heads and remote.capable('stream'):
2061 return self.stream_in(remote) 2040 return self.stream_in(remote)
2062 return self.pull(remote, heads) 2041 return self.pull(remote, heads)
2063 2042
2043 def storefiles(self):
2044 '''get all *.i and *.d files in the store
2045
2046 Returns (list of (filename, size), total_bytes)'''
2047
2048 lock = None
2049 try:
2050 self.ui.debug('scanning\n')
2051 entries = []
2052 total_bytes = 0
2053 # get consistent snapshot of repo, lock during scan
2054 lock = self.lock()
2055 for name, size in self.store.walk():
2056 entries.append((name, size))
2057 total_bytes += size
2058 return entries, total_bytes
2059 finally:
2060 del lock
2061
2064 # used to avoid circular references so destructors work 2062 # used to avoid circular references so destructors work
2065 def aftertrans(files): 2063 def aftertrans(files):
2066 renamefiles = [tuple(t) for t in files] 2064 renamefiles = [tuple(t) for t in files]
2067 def a(): 2065 def a():
2068 for src, dest in renamefiles: 2066 for src, dest in renamefiles: