mercurial/dirstate.py
changeset 8589 3edf133dcb5a
parent 8588 2624f485b9bc
child 8640 8536119f2f94
equal deleted inserted replaced
8588:2624f485b9bc 8589:3edf133dcb5a
   459         lnkkind = stat.S_IFLNK
   459         lnkkind = stat.S_IFLNK
   460         join = self._join
   460         join = self._join
   461         work = []
   461         work = []
   462         wadd = work.append
   462         wadd = work.append
   463 
   463 
       
   464         if match.anypats():
       
   465             #match.match with patterns
       
   466             dostep3 = True
       
   467             nomatches = False
       
   468         elif not match.files():
       
   469             #match.always or match.never
       
   470             dostep3 = matchfn('')
       
   471             nomatches = not dostep3
       
   472         else:
       
   473             #match.exact or match.match without pattern
       
   474             dostep3 = False
       
   475             nomatches = matchfn == match.exact
       
   476 
       
   477         if nomatches:
       
   478             #skip step 2
       
   479             dirignore = util.always
       
   480 
   464         files = set(match.files())
   481         files = set(match.files())
   465         if not files or '.' in files:
   482         if not files or '.' in files:
   466             files = ['']
   483             files = ['']
   467         results = {'.hg': None}
   484         results = {'.hg': None}
   468 
   485 
   474 
   491 
   475             try:
   492             try:
   476                 st = lstat(join(nf))
   493                 st = lstat(join(nf))
   477                 kind = getkind(st.st_mode)
   494                 kind = getkind(st.st_mode)
   478                 if kind == dirkind:
   495                 if kind == dirkind:
       
   496                     dostep3 = True
   479                     if nf in dmap:
   497                     if nf in dmap:
   480                         #file deleted on disc but still in dirstate
   498                         #file deleted on disc but still in dirstate
   481                         results[nf] = None
   499                         results[nf] = None
   482                     if not dirignore(nf):
   500                     if not dirignore(nf):
   483                         wadd(nf)
   501                         wadd(nf)
   495                         if matchfn(nf):
   513                         if matchfn(nf):
   496                             results[nf] = None
   514                             results[nf] = None
   497                         keep = True
   515                         keep = True
   498                         break
   516                         break
   499                     elif fn.startswith(prefix):
   517                     elif fn.startswith(prefix):
       
   518                         dostep3 = True
   500                         keep = True
   519                         keep = True
   501                         break
   520                         break
   502                 if not keep:
   521                 if not keep:
   503                     if inst.errno != errno.ENOENT:
   522                     if inst.errno != errno.ENOENT:
   504                         fwarn(ff, inst.strerror)
   523                         fwarn(ff, inst.strerror)
   539                             results[nf] = st
   558                             results[nf] = st
   540                     elif nf in dmap and matchfn(nf):
   559                     elif nf in dmap and matchfn(nf):
   541                         results[nf] = None
   560                         results[nf] = None
   542 
   561 
   543         # step 3: report unseen items in the dmap hash
   562         # step 3: report unseen items in the dmap hash
   544         visit = sorted([f for f in dmap if f not in results and matchfn(f)])
   563         if dostep3 and not nomatches:
   545         for nf, st in zip(visit, util.statfiles([join(i) for i in visit])):
   564             visit = sorted([f for f in dmap if f not in results and matchfn(f)])
   546             if not st is None and not getkind(st.st_mode) in (regkind, lnkkind):
   565             for nf, st in zip(visit, util.statfiles([join(i) for i in visit])):
   547                 st = None
   566                 if not st is None and not getkind(st.st_mode) in (regkind, lnkkind):
   548             results[nf] = st
   567                     st = None
       
   568                 results[nf] = st
   549 
   569 
   550         del results['.hg']
   570         del results['.hg']
   551         return results
   571         return results
   552 
   572 
   553     def status(self, match, ignored, clean, unknown):
   573     def status(self, match, ignored, clean, unknown):