Mercurial > hg > mercurial-crew-with-dirclash
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") |