Merge latest round of walk fixes.
authorBryan O'Sullivan <bos@serpentine.com>
Fri, 12 Aug 2005 11:18:41 -0800
changeset 885 6594ba2a0f51
parent 878 781266a78fe1 (current diff)
parent 884 087771ebe2e6 (diff)
child 887 882756761433
Merge latest round of walk fixes.
mercurial/commands.py
mercurial/hg.py
mercurial/hgweb.py
mercurial/util.py
--- a/mercurial/commands.py	Fri Aug 12 10:17:12 2005 -0800
+++ b/mercurial/commands.py	Fri Aug 12 11:18:41 2005 -0800
@@ -40,22 +40,12 @@
     return util.matcher(repo, cwd, pats or ['.'], opts.get('include'),
                         opts.get('exclude'), head)
 
-def pathto(n1, n2):
-    '''return the relative path from one place to another'''
-    if not n1: return n2
-    a, b = n1.split(os.sep), n2.split(os.sep)
-    a.reverse(), b.reverse()
-    while a and b and a[-1] == b[-1]:
-        a.pop(), b.pop()
-    b.reverse()
-    return os.sep.join((['..'] * len(a)) + b)
-
 def makewalk(repo, pats, opts, head = ''):
     cwd = repo.getcwd()
     files, matchfn = matchpats(repo, cwd, pats, opts, head)
     def walk():
         for src, fn in repo.walk(files = files, match = matchfn):
-            yield src, fn, pathto(cwd, fn)
+            yield src, fn, util.pathto(cwd, fn)
     return files, matchfn, walk()
 
 def walk(repo, pats, opts, head = ''):
@@ -1078,7 +1068,7 @@
 
     cwd = repo.getcwd()
     files, matchfn = matchpats(repo, cwd, pats, opts)
-    (c, a, d, u) = [[pathto(cwd, x) for x in n]
+    (c, a, d, u) = [[util.pathto(cwd, x) for x in n]
                     for n in repo.changes(files=files, match=matchfn)]
 
     changetypes = [('modified', 'M', c),
--- a/mercurial/hg.py	Fri Aug 12 10:17:12 2005 -0800
+++ b/mercurial/hg.py	Fri Aug 12 11:18:41 2005 -0800
@@ -11,7 +11,7 @@
 from demandload import *
 demandload(globals(), "re lock urllib urllib2 transaction time socket")
 demandload(globals(), "tempfile httprangereader bdiff urlparse")
-demandload(globals(), "bisect select")
+demandload(globals(), "bisect errno select stat")
 
 class filelog(revlog):
     def __init__(self, opener, path):
@@ -489,9 +489,16 @@
             if fn in known: return True
             known[fn] = 1
         def traverse():
-            for f in util.unique(files):
-                f = os.path.join(self.root, f)
-                if os.path.isdir(f):
+            for ff in util.unique(files):
+                f = os.path.join(self.root, ff)
+                try:
+                    st = os.stat(f)
+                except OSError, inst:
+                    if ff not in dc: self.ui.warn('%s: %s\n' % (
+                        util.pathto(self.getcwd(), ff),
+                        inst.strerror))
+                    continue
+                if stat.S_ISDIR(st.st_mode):
                     for dir, subdirs, fl in os.walk(f):
                         d = dir[len(self.root) + 1:]
                         nd = os.path.normpath(d)
@@ -507,8 +514,18 @@
                         for fn in fl:
                             fn = util.pconvert(os.path.join(d, fn))
                             yield 'f', fn
+                elif stat.S_ISREG(st.st_mode):
+                    yield 'f', ff
                 else:
-                    yield 'f', f[len(self.root) + 1:]
+                    kind = 'unknown'
+                    if stat.S_ISCHR(st.st_mode): kind = 'character device'
+                    elif stat.S_ISBLK(st.st_mode): kind = 'block device'
+                    elif stat.S_ISFIFO(st.st_mode): kind = 'fifo'
+                    elif stat.S_ISLNK(st.st_mode): kind = 'symbolic link'
+                    elif stat.S_ISSOCK(st.st_mode): kind = 'socket'
+                    self.ui.warn('%s: unsupported file type (type is %s)\n' % (
+                        util.pathto(self.getcwd(), ff),
+                        kind))
 
             ks = dc.keys()
             ks.sort()
--- a/mercurial/hgweb.py	Fri Aug 12 10:17:12 2005 -0800
+++ b/mercurial/hgweb.py	Fri Aug 12 11:18:41 2005 -0800
@@ -708,7 +708,12 @@
     import BaseHTTPServer
 
     class IPv6HTTPServer(BaseHTTPServer.HTTPServer):
-        address_family = socket.AF_INET6
+        address_family = getattr(socket, 'AF_INET6', None)
+
+        def __init__(self, *args, **kwargs):
+            if self.address_family is None:
+                raise RepoError('IPv6 not available on this system')
+            BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs)
 
     class hgwebhandler(BaseHTTPServer.BaseHTTPRequestHandler):
         def log_error(self, format, *args):
--- a/mercurial/util.py	Fri Aug 12 10:17:12 2005 -0800
+++ b/mercurial/util.py	Fri Aug 12 11:18:41 2005 -0800
@@ -69,6 +69,16 @@
 
 _globchars = {'[': 1, '{': 1, '*': 1, '?': 1}
 
+def pathto(n1, n2):
+    '''return the relative path from one place to another'''
+    if not n1: return n2
+    a, b = n1.split(os.sep), n2.split(os.sep)
+    a.reverse(), b.reverse()
+    while a and b and a[-1] == b[-1]:
+        a.pop(), b.pop()
+    b.reverse()
+    return os.sep.join((['..'] * len(a)) + b)
+
 def canonpath(repo, cwd, myname):
     rootsep = repo.root + os.sep
     name = myname