Skip to content

Commit 7edea5c

Browse files
Felipe Contrerasgitster
authored andcommitted
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>
1 parent bdeeb80 commit 7edea5c

1 file changed

Lines changed: 43 additions & 17 deletions

File tree

contrib/remote-helpers/git-remote-bzr

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ class CustomTree():
370370
self.repo = repo
371371
self.revid = revid
372372
self.parents = parents
373-
self.updates = files
373+
self.updates = {}
374374

375375
def copy_tree(revid):
376376
files = files_cache[revid] = {}
@@ -394,6 +394,13 @@ class CustomTree():
394394

395395
self.files = files_cache[revid] = self.base_files.copy()
396396

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+
397404
def last_revision(self):
398405
return self.base_id
399406

@@ -409,44 +416,56 @@ class CustomTree():
409416
return parent_fid
410417
if basename == '':
411418
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
414422

415-
def add_entry(path, kind):
423+
def add_entry(fid, path, kind, mode = None):
416424
dirname, basename = os.path.split(path)
417425
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+
419433
change = (fid,
420434
(None, path),
421435
True,
422436
(False, True),
423437
(None, parent_fid),
424438
(None, basename),
425439
(None, kind),
426-
(None, False))
440+
(None, executable))
427441
self.files[path] = change[0]
428442
changes.append(change)
429443
return change
430444

431-
def update_entry(path, kind):
445+
def update_entry(fid, path, kind, mode = None):
432446
dirname, basename = os.path.split(path)
433-
fid = self.base_files[path]
434447
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+
435455
change = (fid,
436456
(path, path),
437457
True,
438458
(True, True),
439459
(None, parent_fid),
440460
(None, basename),
441461
(None, kind),
442-
(None, False))
462+
(None, executable))
443463
self.files[path] = change[0]
444464
changes.append(change)
445465
return change
446466

447-
def remove_entry(path, kind):
467+
def remove_entry(fid, path, kind):
448468
dirname, basename = os.path.split(path)
449-
fid = self.base_files[path]
450469
parent_fid = get_parent(dirname, basename)
451470
change = (fid,
452471
(path, None),
@@ -460,18 +479,25 @@ class CustomTree():
460479
changes.append(change)
461480
return change
462481

463-
for path, f in self.updates.iteritems():
482+
for fid, f in self.updates.iteritems():
483+
path = f['path']
484+
464485
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'])
468491
else:
469-
add_entry(path, 'file')
492+
add_entry(fid, path, 'file', f['mode'])
470493

471494
return changes
472495

473496
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']
475501

476502
def parse_commit(parser):
477503
global marks, blob_marks, bmarks, parsed_refs

0 commit comments

Comments
 (0)