remote-bzr: add support to push special modes

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Felipe Contreras committed Nov 11, 2012 at 15:19 UTC 7edea5c958196f2af13655c8aa2444f80b27bb4c
1 file changed +43 -17
contrib/remote-helpers/git-remote-bzr
+43 -17
@@ -370,7 +370,7 @@ class CustomTree():
370 self.repo = repo
371 self.revid = revid
372 self.parents = parents
373 - self.updates = files
373 + self.updates = {}
374
375 def copy_tree(revid):
376 files = files_cache[revid] = {}
@@ -394,6 +394,13 @@ class CustomTree():
394
395 self.files = files_cache[revid] = self.base_files.copy()
396
397 + for path, f in files.iteritems():
398 + fid = self.files.get(path, None)
399 + if not fid:
400 + fid = bzrlib.generate_ids.gen_file_id(path)
401 + f['path'] = path
402 + self.updates[fid] = f
403 +
404 def last_revision(self):
405 return self.base_id
406
@@ -409,13 +416,20 @@ class CustomTree():
416 return parent_fid
417 if basename == '':
418 return None
412 - d = add_entry(dirname, 'directory')
413 - return d[0]
419 + fid = bzrlib.generate_ids.gen_file_id(path)
420 + d = add_entry(fid, dirname, 'directory')
421 + return fid
422
415 - def add_entry(path, kind):
423 + def add_entry(fid, path, kind, mode = None):
424 dirname, basename = os.path.split(path)
425 parent_fid = get_parent(dirname, basename)
418 - fid = bzrlib.generate_ids.gen_file_id(path)
426 +
427 + executable = False
428 + if mode == '100755':
429 + executable = True
430 + elif mode == '120000':
431 + kind = 'symlink'
432 +
433 change = (fid,
434 (None, path),
435 True,
@@ -423,15 +437,21 @@ class CustomTree():
437 (None, parent_fid),
438 (None, basename),
439 (None, kind),
426 - (None, False))
440 + (None, executable))
441 self.files[path] = change[0]
442 changes.append(change)
443 return change
444
431 - def update_entry(path, kind):
445 + def update_entry(fid, path, kind, mode = None):
446 dirname, basename = os.path.split(path)
433 - fid = self.base_files[path]
447 parent_fid = get_parent(dirname, basename)
448 +
449 + executable = False
450 + if mode == '100755':
451 + executable = True
452 + elif mode == '120000':
453 + kind = 'symlink'
454 +
455 change = (fid,
456 (path, path),
457 True,
@@ -439,14 +459,13 @@ class CustomTree():
459 (None, parent_fid),
460 (None, basename),
461 (None, kind),
442 - (None, False))
462 + (None, executable))
463 self.files[path] = change[0]
464 changes.append(change)
465 return change
466
447 - def remove_entry(path, kind):
467 + def remove_entry(fid, path, kind):
468 dirname, basename = os.path.split(path)
449 - fid = self.base_files[path]
469 parent_fid = get_parent(dirname, basename)
470 change = (fid,
471 (path, None),
@@ -460,18 +479,25 @@ class CustomTree():
479 changes.append(change)
480 return change
481
463 - for path, f in self.updates.iteritems():
482 + for fid, f in self.updates.iteritems():
483 + path = f['path']
484 +
485 if 'deleted' in f:
465 - remove_entry(path, 'file')
466 - elif path in self.base_files:
467 - update_entry(path, 'file')
486 + remove_entry(fid, path, 'file')
487 + continue
488 +
489 + if path in self.base_files:
490 + update_entry(fid, path, 'file', f['mode'])
491 else:
469 - add_entry(path, 'file')
492 + add_entry(fid, path, 'file', f['mode'])
493
494 return changes
495
496 def get_file_with_stat(self, file_id, path=None):
474 - return (StringIO.StringIO(self.updates[path]['data']), None)
497 + return (StringIO.StringIO(self.updates[file_id]['data']), None)
498 +
499 + def get_symlink_target(self, file_id):
500 + return self.updates[file_id]['data']
501
502 def parse_commit(parser):
503 global marks, blob_marks, bmarks, parsed_refs