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