[Zope-Checkins] CVS: Zope/lib/python/App - Common.py:1.15.4.1

Chris McDonough chrism@zope.com
Mon, 2 Sep 2002 22:55:03 -0400


Update of /cvs-repository/Zope/lib/python/App
In directory cvs.zope.org:/tmp/cvs-serv23875

Modified Files:
      Tag: chrism-install-branch
	Common.py 
Log Message:
Work around problems reported by Jens using my hacked realpath module.
Replace this code with logic from Python 2.2's os module.


=== Zope/lib/python/App/Common.py 1.15 => 1.15.4.1 ===
--- Zope/lib/python/App/Common.py:1.15	Wed Aug 14 17:31:40 2002
+++ Zope/lib/python/App/Common.py	Mon Sep  2 22:55:03 2002
@@ -127,27 +127,31 @@
 
 def Dictionary(**kw): return kw # Sorry Guido
 
-def realpath(p):
-    """ Computes the 'real' path of a file or directory devoid of
-    any symlink in any element of the path """
-    p = os.path.abspath(p)
+try:
+    # Python 2.2. already has a realpath function, while 2.1 doesn't
+    realpath = os.path.realpath
+except:
     if os.name == 'posix':
-        path_list = p.split(os.sep)
-        orig_len = len(path_list)
-        changed = 0
-        i = 1
-        while not changed and i <= orig_len:
-            head = path_list[:i]
-            tail = path_list[i:]
-            head_s = os.sep.join(head)
-            tail_s = os.sep.join(tail)
-            if os.path.islink(head_s):
-                head_s = os.path.join(os.sep.join(head[:-1]),
-                                      os.readlink(head_s))
-                path_list = head_s.split(os.sep)
-                path_list.extend(tail)
-                p = os.sep.join(path_list)
-                p = realpath(p)
-                changed = 1
-            i = i + 1
-    return p
+        def realpath(filename):
+            """
+            Return the canonical path of the specified filename,
+            eliminating any symbolic links encountered in the path
+            (this is ripped off from Python 2.2).
+            """
+            filename = os.path.abspath(filename)
+
+            bits = ['/'] + filename.split('/')[1:]
+            for i in range(2, len(bits)+1):
+                component = os.path.join(*bits[0:i])
+                if os.path.islink(component):
+                    resolved = os.readlink(component)
+                    (dir, file) = os.path.split(component)
+                    resolved = os.path.normpath(join(dir, resolved))
+                    newpath = os.path.join(*([resolved] + bits[i:]))
+                    return realpath(newpath)
+
+            return filename
+    else:
+        # other platforms are assumed to not have symlinks, so we alias
+        # realpath to abspath
+        realpath = os.path.abspath