@@ -387,8 +387,8 @@ def display_rev(self, rev):
387
387
def short_rev (self , rev ):
388
388
return self .git .shortrev (self .normalize_rev (rev ), min_len = self ._shortrev_len )
389
389
390
- def get_node (self , path , rev = None ):
391
- return GitNode (self , path , rev , self .log )
390
+ def get_node (self , path , rev = None , historian = None ):
391
+ return GitNode (self , path , rev , self .log , None , historian )
392
392
393
393
def get_quickjump_entries (self , rev ):
394
394
for bname , bsha in self .git .get_branches ():
@@ -412,24 +412,26 @@ def get_changes(self, old_path, old_rev, new_path, new_rev, ignore_ancestry=0):
412
412
if old_path != new_path :
413
413
raise TracError ("not supported in git_fs" )
414
414
415
- for chg in self .git .diff_tree (old_rev , new_rev , self .normalize_path (new_path )):
416
- mode1 , mode2 , obj1 , obj2 , action , path , path2 = chg
415
+ with self .git .get_historian (old_rev , old_path .strip ('/' )) as old_historian :
416
+ with self .git .get_historian (new_rev , new_path .strip ('/' )) as new_historian :
417
+ for chg in self .git .diff_tree (old_rev , new_rev , self .normalize_path (new_path )):
418
+ mode1 , mode2 , obj1 , obj2 , action , path , path2 = chg
417
419
418
- kind = Node .FILE
419
- if mode2 .startswith ('04' ) or mode1 .startswith ('04' ):
420
- kind = Node .DIRECTORY
420
+ kind = Node .FILE
421
+ if mode2 .startswith ('04' ) or mode1 .startswith ('04' ):
422
+ kind = Node .DIRECTORY
421
423
422
- change = GitChangeset .action_map [action ]
424
+ change = GitChangeset .action_map [action ]
423
425
424
- old_node = None
425
- new_node = None
426
+ old_node = None
427
+ new_node = None
426
428
427
- if change != Changeset .ADD :
428
- old_node = self .get_node (path , old_rev )
429
- if change != Changeset .DELETE :
430
- new_node = self .get_node (path , new_rev )
429
+ if change != Changeset .ADD :
430
+ old_node = self .get_node (path , old_rev , old_historian )
431
+ if change != Changeset .DELETE :
432
+ new_node = self .get_node (path , new_rev , new_historian )
431
433
432
- yield old_node , new_node , kind , change
434
+ yield old_node , new_node , kind , change
433
435
434
436
def next_rev (self , rev , path = '' ):
435
437
return self .git .hist_next_revision (rev )
@@ -469,7 +471,7 @@ def sync(self, rev_callback=None, clean=None):
469
471
rev_callback (rev )
470
472
471
473
class GitNode (Node ):
472
- def __init__ (self , repos , path , rev , log , ls_tree_info = None ):
474
+ def __init__ (self , repos , path , rev , log , ls_tree_info = None , historian = None ):
473
475
self .log = log
474
476
self .repos = repos
475
477
self .fs_sha = None # points to either tree or blobs
@@ -491,7 +493,7 @@ def __init__(self, repos, path, rev, log, ls_tree_info=None):
491
493
self .fs_perm , k , self .fs_sha , self .fs_size , _ = ls_tree_info
492
494
493
495
# fix-up to the last commit-rev that touched this node
494
- rev = repos .git .last_change (rev , p )
496
+ rev = repos .git .last_change (rev , p , historian )
495
497
496
498
if k == 'tree' :
497
499
pass
@@ -537,8 +539,9 @@ def get_entries(self):
537
539
if not self .isdir :
538
540
return
539
541
540
- for ent in self .repos .git .ls_tree (self .rev , self .__git_path ()):
541
- yield GitNode (self .repos , ent [- 1 ], self .rev , self .log , ent )
542
+ with self .repos .git .get_historian (self .rev , self .path .strip ('/' )) as historian :
543
+ for ent in self .repos .git .ls_tree (self .rev , self .__git_path ()):
544
+ yield GitNode (self .repos , ent [- 1 ], self .rev , self .log , ent , historian )
542
545
543
546
def get_content_type (self ):
544
547
if self .isdir :
0 commit comments