@@ -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
476502def parse_commit (parser ):
477503 global marks , blob_marks , bmarks , parsed_refs
0 commit comments