132 |
132 |
133 @contextlib.contextmanager |
133 @contextlib.contextmanager |
134 def annotatepeer(repo): |
134 def annotatepeer(repo): |
135 ui = repo.ui |
135 ui = repo.ui |
136 |
136 |
137 # fileservice belongs to remotefilelog |
137 remotepath = ui.expandpath( |
138 fileservice = getattr(repo, 'fileservice', None) |
138 ui.config('fastannotate', 'remotepath', 'default')) |
139 sharepeer = ui.configbool('fastannotate', 'clientsharepeer', True) |
139 peer = hg.peer(ui, {}, remotepath) |
140 |
|
141 if sharepeer and fileservice: |
|
142 ui.debug('fastannotate: using remotefilelog connection pool\n') |
|
143 conn = repo.connectionpool.get(repo.fallbackpath) |
|
144 peer = conn.peer |
|
145 stolen = True |
|
146 else: |
|
147 remotepath = ui.expandpath( |
|
148 ui.config('fastannotate', 'remotepath', 'default')) |
|
149 peer = hg.peer(ui, {}, remotepath) |
|
150 stolen = False |
|
151 |
140 |
152 try: |
141 try: |
153 # Note: fastannotate requests should never trigger a remotefilelog |
|
154 # "getfiles" request, because "getfiles" puts the stream into a state |
|
155 # that does not exit. See "clientfetch": it does "getannotate" before |
|
156 # any hg stuff that could potentially trigger a "getfiles". |
|
157 yield peer |
142 yield peer |
158 finally: |
143 finally: |
159 if not stolen: |
144 peer.close() |
160 for i in ['close', 'cleanup']: |
|
161 getattr(peer, i, lambda: None)() |
|
162 else: |
|
163 conn.__exit__(None, None, None) |
|
164 |
145 |
165 def clientfetch(repo, paths, lastnodemap=None, peer=None): |
146 def clientfetch(repo, paths, lastnodemap=None, peer=None): |
166 """download annotate cache from the server for paths""" |
147 """download annotate cache from the server for paths""" |
167 if not paths: |
148 if not paths: |
168 return |
149 return |
207 if threshold <= 0: |
188 if threshold <= 0: |
208 return paths |
189 return paths |
209 |
190 |
210 master = repo.ui.config('fastannotate', 'mainbranch') or 'default' |
191 master = repo.ui.config('fastannotate', 'mainbranch') or 'default' |
211 |
192 |
212 if 'remotefilelog' in repo.requirements: |
|
213 ctx = scmutil.revsingle(repo, master) |
|
214 f = lambda path: len(ctx[path].ancestormap()) |
|
215 else: |
|
216 f = lambda path: len(repo.file(path)) |
|
217 |
|
218 result = [] |
193 result = [] |
219 for path in paths: |
194 for path in paths: |
220 try: |
195 try: |
221 if f(path) >= threshold: |
196 if len(repo.file(path)) >= threshold: |
222 result.append(path) |
197 result.append(path) |
223 except Exception: # file not found etc. |
198 except Exception: # file not found etc. |
224 result.append(path) |
199 result.append(path) |
225 |
200 |
226 return result |
201 return result |