comparison contrib/convert-repo @ 3957:558f52943cd2

convert-repo: add CVS exec bit support
author Matt Mackall <mpm@selenic.com>
date Fri, 22 Dec 2006 17:59:39 -0600
parents 9af4b853ed4d
children 2b87d3c5ab8e
comparison
equal deleted inserted replaced
3956:497c69726a04 3957:558f52943cd2
187 r = self.readp.readline() 187 r = self.readp.readline()
188 188
189 def getheads(self): 189 def getheads(self):
190 return self.heads 190 return self.heads
191 191
192 def getfile(self, name, rev): 192 def _getfile(self, name, rev):
193 if rev.endswith("(DEAD)"): 193 if rev.endswith("(DEAD)"):
194 raise IOError 194 raise IOError
195 195
196 args = ("-N -P -kk -r %s --" % rev).split() 196 args = ("-N -P -kk -r %s --" % rev).split()
197 args.append(os.path.join(self.cvsrepo, name)) 197 args.append(os.path.join(self.cvsrepo, name))
216 elif line.startswith("Mbinary "): 216 elif line.startswith("Mbinary "):
217 count = int(self.readp.readline()[:-1]) 217 count = int(self.readp.readline()[:-1])
218 data = self.readp.read(count) 218 data = self.readp.read(count)
219 else: 219 else:
220 if line == "ok\n": 220 if line == "ok\n":
221 return data 221 return (data, "x" in mode)
222 elif line.startswith("E "): 222 elif line.startswith("E "):
223 warn("cvs server: %s\n" % line[2:]) 223 warn("cvs server: %s\n" % line[2:])
224 elif line.startswith("Remove"): 224 elif line.startswith("Remove"):
225 l = self.readp.readline() 225 l = self.readp.readline()
226 l = self.readp.readline() 226 l = self.readp.readline()
227 if l != "ok\n": 227 if l != "ok\n":
228 abort("unknown CVS response: %s\n" % l) 228 abort("unknown CVS response: %s\n" % l)
229 else: 229 else:
230 abort("unknown CVS response: %s\n" % line) 230 abort("unknown CVS response: %s\n" % line)
231 231
232 def getfile(self, file, rev):
233 data, mode = self._getfile(file, rev)
234 self.modecache[(file, rev)] = mode
235 return data
236
237 def getmode(self, file, rev):
238 return self.modecache[(file, rev)]
239
232 def getchanges(self, rev): 240 def getchanges(self, rev):
241 self.modecache = {}
233 files = self.files[rev] 242 files = self.files[rev]
234 cl = [ (f, r, 0) for f,r in files.items() ] 243 cl = files.items()
235 cl.sort() 244 cl.sort()
236 return cl 245 return cl
237 246
238 def recode(self, text): 247 def recode(self, text):
239 return text.decode(self.encoding, "replace").encode("utf-8") 248 return text.decode(self.encoding, "replace").encode("utf-8")
262 return fh.read() 271 return fh.read()
263 272
264 def getfile(self, name, rev): 273 def getfile(self, name, rev):
265 return self.catfile(rev, "blob") 274 return self.catfile(rev, "blob")
266 275
276 def getmode(self, name, rev):
277 return self.modecache[(name, rev)]
278
267 def getchanges(self, version): 279 def getchanges(self, version):
280 self.modecache = {}
268 fh = os.popen("GIT_DIR=%s git-diff-tree --root -m -r %s" % (self.path, version)) 281 fh = os.popen("GIT_DIR=%s git-diff-tree --root -m -r %s" % (self.path, version))
269 changes = [] 282 changes = []
270 for l in fh: 283 for l in fh:
271 if "\t" not in l: continue 284 if "\t" not in l: continue
272 m, f = l[:-1].split("\t") 285 m, f = l[:-1].split("\t")
273 m = m.split() 286 m = m.split()
274 h = m[3] 287 h = m[3]
275 p = (m[1] == "100755") 288 p = (m[1] == "100755")
276 changes.append((f, h, p)) 289 self.modecache[(f, h)] = p
290 changes.append((f, h))
277 return changes 291 return changes
278 292
279 def getcommit(self, version): 293 def getcommit(self, version):
280 c = self.catfile(version, "commit") # read the commit hash 294 c = self.catfile(version, "commit") # read the commit hash
281 end = c.find("\n\n") 295 end = c.find("\n\n")
496 510
497 def copy(self, rev): 511 def copy(self, rev):
498 c = self.commitcache[rev] 512 c = self.commitcache[rev]
499 files = self.source.getchanges(rev) 513 files = self.source.getchanges(rev)
500 514
501 for f,v,e in files: 515 for f,v in files:
502 try: 516 try:
503 data = self.source.getfile(f, v) 517 data = self.source.getfile(f, v)
504 except IOError, inst: 518 except IOError, inst:
505 self.dest.delfile(f) 519 self.dest.delfile(f)
506 else: 520 else:
521 e = self.source.getmode(f, v)
507 self.dest.putfile(f, e, data) 522 self.dest.putfile(f, e, data)
508 523
509 r = [self.map[v] for v in c.parents] 524 r = [self.map[v] for v in c.parents]
510 f = [f for f,v,e in files] 525 f = [f for f,v in files]
511 self.map[rev] = self.dest.putcommit(f, r, c) 526 self.map[rev] = self.dest.putcommit(f, r, c)
512 file(self.mapfile, "a").write("%s %s\n" % (rev, self.map[rev])) 527 file(self.mapfile, "a").write("%s %s\n" % (rev, self.map[rev]))
513 528
514 def convert(self): 529 def convert(self):
515 status("scanning source...\n") 530 status("scanning source...\n")