Opened 7 years ago
Last modified 7 years ago
#12895 closed enhancement
Improve performance of sync command with many revisions — at Initial Version
Reported by: | Ryan J Ollos | Owned by: | |
---|---|---|---|
Priority: | normal | Milestone: | 1.0.17 |
Component: | plugin/git | Version: | |
Severity: | normal | Keywords: | performance |
Cc: | Branch: | ||
Release Notes: | |||
API Changes: | |||
Internal Changes: |
Description
The patch was proposed in gmessage:trac-dev:2ityvgVZxsQ/KEA6IwY2CAAJ.
-
tracopt/versioncontrol/git/PyGIT.py
diff --git a/tracopt/versioncontrol/git/PyGIT.py b/tracopt/versioncontrol/git/PyGIT.py index 47f397389..32aac9184 100644
a b class Storage(object): 596 596 key=lambda (name, rev, head): (not head, name)) 597 597 return [(name, rev) for name, rev, head in branches] 598 598 599 def get_refs(self): 600 for refname, rev in self.rev_cache.refs_dict.iteritems(): 601 if refname != 'HEAD': 602 yield refname, rev 603 599 604 def get_commits(self): 600 605 return self.rev_cache.rev_dict 601 606 -
tracopt/versioncontrol/git/git_fs.py
diff --git a/tracopt/versioncontrol/git/git_fs.py b/tracopt/versioncontrol/git/git_fs.py index 031f68c2b..c33eb7a5d 100644
a b class GitCachedRepository(CachedRepository): 100 100 return count > 0 101 101 return False 102 102 103 def needs_sync(): 104 max_holders = 999 105 revs = sorted(set(rev for refname, rev in repos.git.get_refs())) 106 for idx in xrange(0, len(revs), max_holders): 107 revs_ = revs[idx:idx + max_holders] 108 holders = ','.join(('%s',) * len(revs_)) 109 args = [self.id] 110 args.extend(revs_) 111 query = 'SELECT COUNT(*) FROM revision ' \ 112 'WHERE repos=%s AND rev IN (' + holders + ')' 113 for count, in self.env.db_query(query, args): 114 if count < len(revs_): 115 return True 116 return False 117 103 118 def traverse(rev, seen): 104 119 revs = [] 105 120 merge_revs = [] … … class GitCachedRepository(CachedRepository): 121 136 revs[idx:idx] = traverse(rev, seen) 122 137 return revs 123 138 124 while True: 125 repos.sync() 126 repos_youngest = repos.youngest_rev or '' 139 def sync_revs(): 127 140 updated = False 128 141 seen = set() 129 142 … … class GitCachedRepository(CachedRepository): 148 161 if feedback: 149 162 feedback(rev) 150 163 151 if updated: 152 continue # sync again 164 return updated 153 165 166 while True: 167 repos.sync() 168 repos_youngest = repos.youngest_rev or '' 169 if needs_sync() and sync_revs(): 170 continue # sync again 154 171 if meta_youngest != repos_youngest: 155 172 with self.env.db_transaction as db: 156 173 db("""
Note:
See TracTickets
for help on using tickets.