194 return self.heads |
194 return self.heads |
195 |
195 |
196 def getfile(self, name, rev): |
196 def getfile(self, name, rev): |
197 cmd = 'p4 -G print %s' \ |
197 cmd = 'p4 -G print %s' \ |
198 % util.shellquote("%s#%s" % (self.depotname[name], rev)) |
198 % util.shellquote("%s#%s" % (self.depotname[name], rev)) |
199 stdout = util.popen(cmd, mode='rb') |
199 |
200 |
200 lasterror = None |
201 mode = None |
201 while True: |
202 contents = "" |
202 stdout = util.popen(cmd, mode='rb') |
203 keywords = None |
203 |
204 |
204 mode = None |
205 for d in loaditer(stdout): |
205 contents = "" |
206 code = d["code"] |
206 keywords = None |
207 data = d.get("data") |
207 |
208 |
208 for d in loaditer(stdout): |
209 if code == "error": |
209 code = d["code"] |
210 raise IOError(d["generic"], data) |
210 data = d.get("data") |
211 |
211 |
212 elif code == "stat": |
212 if code == "error": |
213 action = d.get("action") |
213 # if this is the first time error happened |
214 if action in ["purge", "delete", "move/delete"]: |
214 # re-attempt getting the file |
215 return None, None |
215 if not lasterror: |
216 p4type = self.re_type.match(d["type"]) |
216 lasterror = IOError(d["generic"], data) |
217 if p4type: |
217 # this will exit inner-most for-loop |
218 mode = "" |
218 break |
219 flags = (p4type.group(1) or "") + (p4type.group(3) or "") |
219 else: |
220 if "x" in flags: |
220 raise lasterror |
221 mode = "x" |
221 |
222 if p4type.group(2) == "symlink": |
222 elif code == "stat": |
223 mode = "l" |
223 action = d.get("action") |
224 if "ko" in flags: |
224 if action in ["purge", "delete", "move/delete"]: |
225 keywords = self.re_keywords_old |
225 return None, None |
226 elif "k" in flags: |
226 p4type = self.re_type.match(d["type"]) |
227 keywords = self.re_keywords |
227 if p4type: |
228 |
228 mode = "" |
229 elif code == "text" or code == "binary": |
229 flags = ((p4type.group(1) or "") |
230 contents += data |
230 + (p4type.group(3) or "")) |
|
231 if "x" in flags: |
|
232 mode = "x" |
|
233 if p4type.group(2) == "symlink": |
|
234 mode = "l" |
|
235 if "ko" in flags: |
|
236 keywords = self.re_keywords_old |
|
237 elif "k" in flags: |
|
238 keywords = self.re_keywords |
|
239 |
|
240 elif code == "text" or code == "binary": |
|
241 contents += data |
|
242 |
|
243 lasterror = None |
|
244 |
|
245 if not lasterror: |
|
246 break |
231 |
247 |
232 if mode is None: |
248 if mode is None: |
233 return None, None |
249 return None, None |
234 |
250 |
235 if keywords: |
251 if keywords: |