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