equal
deleted
inserted
replaced
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 |