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>
This commit is contained in:
parent
bdeeb809d7
commit
7edea5c958
@ -370,7 +370,7 @@ class CustomTree():
|
|||||||
self.repo = repo
|
self.repo = repo
|
||||||
self.revid = revid
|
self.revid = revid
|
||||||
self.parents = parents
|
self.parents = parents
|
||||||
self.updates = files
|
self.updates = {}
|
||||||
|
|
||||||
def copy_tree(revid):
|
def copy_tree(revid):
|
||||||
files = files_cache[revid] = {}
|
files = files_cache[revid] = {}
|
||||||
@ -394,6 +394,13 @@ class CustomTree():
|
|||||||
|
|
||||||
self.files = files_cache[revid] = self.base_files.copy()
|
self.files = files_cache[revid] = self.base_files.copy()
|
||||||
|
|
||||||
|
for path, f in files.iteritems():
|
||||||
|
fid = self.files.get(path, None)
|
||||||
|
if not fid:
|
||||||
|
fid = bzrlib.generate_ids.gen_file_id(path)
|
||||||
|
f['path'] = path
|
||||||
|
self.updates[fid] = f
|
||||||
|
|
||||||
def last_revision(self):
|
def last_revision(self):
|
||||||
return self.base_id
|
return self.base_id
|
||||||
|
|
||||||
@ -409,13 +416,20 @@ class CustomTree():
|
|||||||
return parent_fid
|
return parent_fid
|
||||||
if basename == '':
|
if basename == '':
|
||||||
return None
|
return None
|
||||||
d = add_entry(dirname, 'directory')
|
fid = bzrlib.generate_ids.gen_file_id(path)
|
||||||
return d[0]
|
d = add_entry(fid, dirname, 'directory')
|
||||||
|
return fid
|
||||||
|
|
||||||
def add_entry(path, kind):
|
def add_entry(fid, path, kind, mode = None):
|
||||||
dirname, basename = os.path.split(path)
|
dirname, basename = os.path.split(path)
|
||||||
parent_fid = get_parent(dirname, basename)
|
parent_fid = get_parent(dirname, basename)
|
||||||
fid = bzrlib.generate_ids.gen_file_id(path)
|
|
||||||
|
executable = False
|
||||||
|
if mode == '100755':
|
||||||
|
executable = True
|
||||||
|
elif mode == '120000':
|
||||||
|
kind = 'symlink'
|
||||||
|
|
||||||
change = (fid,
|
change = (fid,
|
||||||
(None, path),
|
(None, path),
|
||||||
True,
|
True,
|
||||||
@ -423,15 +437,21 @@ class CustomTree():
|
|||||||
(None, parent_fid),
|
(None, parent_fid),
|
||||||
(None, basename),
|
(None, basename),
|
||||||
(None, kind),
|
(None, kind),
|
||||||
(None, False))
|
(None, executable))
|
||||||
self.files[path] = change[0]
|
self.files[path] = change[0]
|
||||||
changes.append(change)
|
changes.append(change)
|
||||||
return change
|
return change
|
||||||
|
|
||||||
def update_entry(path, kind):
|
def update_entry(fid, path, kind, mode = None):
|
||||||
dirname, basename = os.path.split(path)
|
dirname, basename = os.path.split(path)
|
||||||
fid = self.base_files[path]
|
|
||||||
parent_fid = get_parent(dirname, basename)
|
parent_fid = get_parent(dirname, basename)
|
||||||
|
|
||||||
|
executable = False
|
||||||
|
if mode == '100755':
|
||||||
|
executable = True
|
||||||
|
elif mode == '120000':
|
||||||
|
kind = 'symlink'
|
||||||
|
|
||||||
change = (fid,
|
change = (fid,
|
||||||
(path, path),
|
(path, path),
|
||||||
True,
|
True,
|
||||||
@ -439,14 +459,13 @@ class CustomTree():
|
|||||||
(None, parent_fid),
|
(None, parent_fid),
|
||||||
(None, basename),
|
(None, basename),
|
||||||
(None, kind),
|
(None, kind),
|
||||||
(None, False))
|
(None, executable))
|
||||||
self.files[path] = change[0]
|
self.files[path] = change[0]
|
||||||
changes.append(change)
|
changes.append(change)
|
||||||
return change
|
return change
|
||||||
|
|
||||||
def remove_entry(path, kind):
|
def remove_entry(fid, path, kind):
|
||||||
dirname, basename = os.path.split(path)
|
dirname, basename = os.path.split(path)
|
||||||
fid = self.base_files[path]
|
|
||||||
parent_fid = get_parent(dirname, basename)
|
parent_fid = get_parent(dirname, basename)
|
||||||
change = (fid,
|
change = (fid,
|
||||||
(path, None),
|
(path, None),
|
||||||
@ -460,18 +479,25 @@ class CustomTree():
|
|||||||
changes.append(change)
|
changes.append(change)
|
||||||
return change
|
return change
|
||||||
|
|
||||||
for path, f in self.updates.iteritems():
|
for fid, f in self.updates.iteritems():
|
||||||
|
path = f['path']
|
||||||
|
|
||||||
if 'deleted' in f:
|
if 'deleted' in f:
|
||||||
remove_entry(path, 'file')
|
remove_entry(fid, path, 'file')
|
||||||
elif path in self.base_files:
|
continue
|
||||||
update_entry(path, 'file')
|
|
||||||
|
if path in self.base_files:
|
||||||
|
update_entry(fid, path, 'file', f['mode'])
|
||||||
else:
|
else:
|
||||||
add_entry(path, 'file')
|
add_entry(fid, path, 'file', f['mode'])
|
||||||
|
|
||||||
return changes
|
return changes
|
||||||
|
|
||||||
def get_file_with_stat(self, file_id, path=None):
|
def get_file_with_stat(self, file_id, path=None):
|
||||||
return (StringIO.StringIO(self.updates[path]['data']), None)
|
return (StringIO.StringIO(self.updates[file_id]['data']), None)
|
||||||
|
|
||||||
|
def get_symlink_target(self, file_id):
|
||||||
|
return self.updates[file_id]['data']
|
||||||
|
|
||||||
def parse_commit(parser):
|
def parse_commit(parser):
|
||||||
global marks, blob_marks, bmarks, parsed_refs
|
global marks, blob_marks, bmarks, parsed_refs
|
||||||
|
Loading…
Reference in New Issue
Block a user