hgext/fastannotate/protocol.py
changeset 39213 303dae0136b0
parent 39211 c8a40b33ce30
child 39214 8da20fc9fc07
equal deleted inserted replaced
39212:ca053fc7efc5 39213:303dae0136b0
   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