hgext/convert/p4.py
changeset 25775 220d9ae6a9a8
parent 25760 648323f41a89
child 25776 809c3e4a9e31
equal deleted inserted replaced
25774:4f8c20fe66f0 25775:220d9ae6a9a8
   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: