changeset 6830:2cf4cda64727

dirstate.walk: fold in _supported - inline tests for regular or link files - simplify bad type reporting
author Matt Mackall <mpm@selenic.com>
date Tue, 22 Jul 2008 13:03:23 -0500
parents fec1da46006e
children 2b663f542bd3
files mercurial/dirstate.py
diffstat 1 files changed, 22 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dirstate.py	Tue Jul 22 13:03:21 2008 -0500
+++ b/mercurial/dirstate.py	Tue Jul 22 13:03:23 2008 -0500
@@ -398,20 +398,6 @@
         st.rename()
         self._dirty = self._dirtypl = False
 
-    def _supported(self, f, mode, verbose=False):
-        if stat.S_ISREG(mode) or stat.S_ISLNK(mode):
-            return True
-        if verbose:
-            kind = 'unknown'
-            if stat.S_ISCHR(mode): kind = _('character device')
-            elif stat.S_ISBLK(mode): kind = _('block device')
-            elif stat.S_ISFIFO(mode): kind = _('fifo')
-            elif stat.S_ISSOCK(mode): kind = _('socket')
-            elif stat.S_ISDIR(mode): kind = _('directory')
-            self._ui.warn(_('%s: unsupported file type (type is %s)\n')
-                          % (self.pathto(f), kind))
-        return False
-
     def _dirignore(self, f):
         if f == '.':
             return False
@@ -448,6 +434,16 @@
                 return False
             return match(file_)
 
+        def badtype(f, mode):
+            kind = 'unknown'
+            if stat.S_ISCHR(mode): kind = _('character device')
+            elif stat.S_ISBLK(mode): kind = _('block device')
+            elif stat.S_ISFIFO(mode): kind = _('fifo')
+            elif stat.S_ISSOCK(mode): kind = _('socket')
+            elif stat.S_ISDIR(mode): kind = _('directory')
+            self._ui.warn(_('%s: unsupported file type (type is %s)\n')
+                          % (self.pathto(f), kind))
+
         # TODO: don't walk unknown directories if unknown and ignored are False
         ignore = self._ignore
         dirignore = self._dirignore
@@ -461,12 +457,12 @@
         listdir = osutil.listdir
         lstat = os.lstat
         bisect_left = bisect.bisect_left
-        isdir = os.path.isdir
         pconvert = util.pconvert
         join = os.path.join
-        isdir = stat.S_ISDIR
+        getkind = stat.S_IFMT
         dirkind = stat.S_IFDIR
-        supported = self._supported
+        regkind = stat.S_IFREG
+        lnkkind = stat.S_IFLNK
         _join = self._join
         work = []
         wadd = work.append
@@ -481,13 +477,15 @@
 
             try:
                 st = lstat(_join(nf))
-                if isdir(st.st_mode):
+                kind = getkind(st.st_mode)
+                if kind == dirkind:
                     if not dirignore(nf):
                         wadd(nf)
+                elif kind == regkind or kind == lnkkind:
+                    results[nf] = st
                 else:
-                    if supported(ff, st.st_mode, verbose=True):
-                        results[nf] = st
-                    elif nf in dmap:
+                    badtype(ff, kind)
+                    if nf in dmap:
                         results[nf] = None
             except OSError, inst:
                 keep = False
@@ -529,7 +527,7 @@
                         if nf in dmap and match(nf):
                             results[nf] = None
                     elif imatch(nf):
-                        if supported(nf, st.st_mode):
+                        if kind == regkind or kind == lnkkind:
                             results[nf] = st
                         elif nf in dmap:
                             results[nf] = None
@@ -540,7 +538,8 @@
                 results[f] = None
                 try:
                     st = lstat(_join(f))
-                    if supported(f, st.st_mode):
+                    kind = getkind(st.st_mode)
+                    if kind == regkind or kind == lnkkind:
                         results[f] = st
                 except OSError, inst:
                     if inst.errno not in (errno.ENOENT, errno.ENOTDIR):