Allow hgwebdir collections to follow symlinks.
authorEric Hopper <hopper@omnifarious.org>
Sat, 15 Mar 2008 12:42:34 -0700
changeset 6284 c93b6c0e6e84
parent 6283 5a45c82fc7da
child 6285 4b81eecc8aa2
Allow hgwebdir collections to follow symlinks.
mercurial/hgweb/hgwebdir_mod.py
mercurial/util.py
--- a/mercurial/hgweb/hgwebdir_mod.py	Sat Mar 15 22:03:18 2008 -0300
+++ b/mercurial/hgweb/hgwebdir_mod.py	Sat Mar 15 12:42:34 2008 -0700
@@ -55,7 +55,7 @@
                 self.repos.extend(cleannames(cp.items('paths')))
             if cp.has_section('collections'):
                 for prefix, root in cp.items('collections'):
-                    for path in util.walkrepos(root):
+                    for path in util.walkrepos(root, followsym = True):
                         repo = os.path.normpath(path)
                         name = repo
                         if name.startswith(prefix):
--- a/mercurial/util.py	Sat Mar 15 22:03:18 2008 -0300
+++ b/mercurial/util.py	Sat Mar 15 12:42:34 2008 -0700
@@ -1702,19 +1702,47 @@
     else:
         return "%s..." % (text[:maxlength-3])
 
-def walkrepos(path):
+def walkrepos(path, followsym=False, seen_dirs=None):
     '''yield every hg repository under path, recursively.'''
     def errhandler(err):
         if err.filename == path:
             raise err
+    if followsym and hasattr(os.path, 'samestat'):
+        def _add_dir_if_not_there(dirlst, dirname):
+            match = False
+            samestat = os.path.samestat
+            dirstat = os.stat(dirname)
+            for lstdirstat in dirlst:
+                if samestat(dirstat, lstdirstat):
+                    match = True
+                    break
+            if not match:
+                dirlst.append(dirstat)
+            return not match
+    else:
+        followsym = false
 
-    for root, dirs, files in os.walk(path, onerror=errhandler):
+    if (seen_dirs is None) and followsym:
+        seen_dirs = []
+        _add_dir_if_not_there(seen_dirs, path)
+    for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler):
         if '.hg' in dirs:
             dirs[:] = [] # don't descend further
             yield root # found a repository
             qroot = os.path.join(root, '.hg', 'patches')
             if os.path.isdir(os.path.join(qroot, '.hg')):
                 yield qroot # we have a patch queue repo here
+        elif followsym:
+            newdirs = []
+            for d in dirs:
+                fname = os.path.join(root, d)
+                if _add_dir_if_not_there(seen_dirs, fname):
+                    if os.path.islink(fname):
+                        for hgname in walkrepos(fname, True, seen_dirs):
+                            yield hgname
+                    else:
+                        newdirs.append(d)
+            dirs[:] = newdirs
 
 _rcpath = None