Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/appendfile.py @ 2075:343aeefb553b
Make the appendfile class inline-data index friendly
The appendfile class needs a few changes to make it work with interleaved
index files. It needs to support the tell() method, opening in a+ mode,
and it needs to delay the checkinlinesize call until after the
append file is written.
Given that open(file, "a+") doesn't always seek to the end of the file,
this adds seek operations to appendfile that understand whence args
author | mason@suse.com |
---|---|
date | Tue, 04 Apr 2006 16:38:43 -0400 |
parents | 94d3170399e1 |
children | 856f0ba200bc |
comparison
equal
deleted
inserted
replaced
2074:01ee43dda681 | 2075:343aeefb553b |
---|---|
40 self.offset = fp.tell() | 40 self.offset = fp.tell() |
41 # real file is not written by anyone else. cache its size so | 41 # real file is not written by anyone else. cache its size so |
42 # seek and read can be fast. | 42 # seek and read can be fast. |
43 self.fpsize = os.fstat(fp.fileno()).st_size | 43 self.fpsize = os.fstat(fp.fileno()).st_size |
44 | 44 |
45 def seek(self, offset): | 45 def end(self): |
46 self.tmpfp.flush() # make sure the stat is correct | |
47 return self.fpsize + os.fstat(self.tmpfp.fileno()).st_size | |
48 | |
49 def seek(self, offset, whence=0): | |
46 '''virtual file offset spans real file and temp file.''' | 50 '''virtual file offset spans real file and temp file.''' |
47 self.offset = offset | 51 if whence == 0: |
52 self.offset = offset | |
53 elif whence == 1: | |
54 self.offset += offset | |
55 elif whence == 2: | |
56 self.offset = self.end() + offset | |
57 | |
48 if self.offset < self.fpsize: | 58 if self.offset < self.fpsize: |
49 self.realfp.seek(self.offset) | 59 self.realfp.seek(self.offset) |
50 else: | 60 else: |
51 self.tmpfp.seek(self.offset - self.fpsize) | 61 self.tmpfp.seek(self.offset - self.fpsize) |
52 | 62 |
101 | 111 |
102 def __init__(self, fp): | 112 def __init__(self, fp): |
103 self.fp = fp | 113 self.fp = fp |
104 self.offset = 0 | 114 self.offset = 0 |
105 | 115 |
106 def seek(self, offset): | 116 def tell(self): |
107 self.offset = offset | 117 return self.offset |
118 | |
119 def seek(self, offset, whence=0): | |
120 if whence == 0: | |
121 self.offset = offset | |
122 elif whence == 1: | |
123 self.offset += offset | |
124 elif whence == 2: | |
125 self.offset = self.fp.end() + offset | |
108 | 126 |
109 def read(self, count=-1): | 127 def read(self, count=-1): |
110 try: | 128 try: |
111 if self.offset != self.fp.offset: | 129 if self.offset != self.fp.offset: |
112 self.fp.seek(self.offset) | 130 self.fp.seek(self.offset) |
141 | 159 |
142 def __call__(self, name, mode='r'): | 160 def __call__(self, name, mode='r'): |
143 '''open file. return same cached appendfile object for every | 161 '''open file. return same cached appendfile object for every |
144 later call.''' | 162 later call.''' |
145 | 163 |
146 assert mode in 'ra' | 164 assert mode in 'ra+' |
147 fp = self.fps.get(name) | 165 fp = self.fps.get(name) |
148 if fp is None: | 166 if fp is None: |
149 fp = appendfile(self.realopener(name, 'a+')) | 167 fp = appendfile(self.realopener(name, 'a+')) |
150 self.fps[name] = fp | 168 self.fps[name] = fp |
151 return sharedfile(fp) | 169 return sharedfile(fp) |
163 | 181 |
164 class appendchangelog(changelog.changelog, appendopener): | 182 class appendchangelog(changelog.changelog, appendopener): |
165 def __init__(self, opener): | 183 def __init__(self, opener): |
166 appendopener.__init__(self, opener) | 184 appendopener.__init__(self, opener) |
167 changelog.changelog.__init__(self, self) | 185 changelog.changelog.__init__(self, self) |
186 def checkinlinesize(self, fp, tr): | |
187 return | |
168 | 188 |
169 class appendmanifest(manifest.manifest, appendopener): | 189 class appendmanifest(manifest.manifest, appendopener): |
170 def __init__(self, opener): | 190 def __init__(self, opener): |
171 appendopener.__init__(self, opener) | 191 appendopener.__init__(self, opener) |
172 manifest.manifest.__init__(self, self) | 192 manifest.manifest.__init__(self, self) |
193 def checkinlinesize(self, fp, tr): | |
194 return |