aboutsummaryrefslogtreecommitdiffstats
path: root/lib/jython/Lib/javapath.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/jython/Lib/javapath.py')
-rw-r--r--lib/jython/Lib/javapath.py331
1 files changed, 331 insertions, 0 deletions
diff --git a/lib/jython/Lib/javapath.py b/lib/jython/Lib/javapath.py
new file mode 100644
index 000000000..8292331b9
--- /dev/null
+++ b/lib/jython/Lib/javapath.py
@@ -0,0 +1,331 @@
+"""Common pathname manipulations, JDK version.
+
+Instead of importing this module directly, import os and refer to this
+module as os.path.
+
+"""
+
+# Incompletely implemented:
+# islink -- How?
+# ismount -- How?
+# splitdrive -- How?
+# normcase -- How?
+
+# Missing:
+# sameopenfile -- Java doesn't have fstat nor file descriptors?
+# samestat -- How?
+
+import java
+from java.io import File
+from java.lang import System
+import os
+
+def _tostr(s, method):
+ if isinstance(s, "".__class__):
+ return s
+ import org
+ raise TypeError, "%s() argument must be a string object, not %s" % (
+ method, org.python.core.Py.safeRepr(s))
+
+def dirname(path):
+ """Return the directory component of a pathname"""
+ path = _tostr(path, "dirname")
+ result = File(path).getParent()
+ if not result:
+ if isabs(path):
+ result = path # Must be root
+ else:
+ result = ""
+ return result
+
+def basename(path):
+ """Return the final component of a pathname"""
+ path = _tostr(path, "basename")
+ return File(path).getName()
+
+def split(path):
+ """Split a pathname.
+
+ Return tuple "(head, tail)" where "tail" is everything after the
+ final slash. Either part may be empty.
+
+ """
+ path = _tostr(path, "split")
+ return (dirname(path), basename(path))
+
+def splitext(path):
+ """Split the extension from a pathname.
+
+ Extension is everything from the last dot to the end. Return
+ "(root, ext)", either part may be empty.
+
+ """
+ i = 0
+ n = -1
+ for c in path:
+ if c == '.': n = i
+ i = i+1
+ if n < 0:
+ return (path, "")
+ else:
+ return (path[:n], path[n:])
+
+def splitdrive(path):
+ """Split a pathname into drive and path.
+
+ On JDK, drive is always empty.
+ XXX This isn't correct for JDK on DOS/Windows!
+
+ """
+ return ("", path)
+
+def exists(path):
+ """Test whether a path exists.
+
+ Returns false for broken symbolic links.
+
+ """
+ path = _tostr(path, "exists")
+ return File(path).exists()
+
+def isabs(path):
+ """Test whether a path is absolute"""
+ path = _tostr(path, "isabs")
+ return File(path).isAbsolute()
+
+def isfile(path):
+ """Test whether a path is a regular file"""
+ path = _tostr(path, "isfile")
+ return File(path).isFile()
+
+def isdir(path):
+ """Test whether a path is a directory"""
+ path = _tostr(path, "isdir")
+ return File(path).isDirectory()
+
+def join(path, *args):
+ """Join two or more pathname components, inserting os.sep as needed"""
+ path = _tostr(path, "join")
+ f = File(path)
+ for a in args:
+ a = _tostr(a, "join")
+ g = File(a)
+ if g.isAbsolute() or len(f.getPath()) == 0:
+ f = g
+ else:
+ f = File(f, a)
+ return f.getPath()
+
+def normcase(path):
+ """Normalize case of pathname.
+
+ XXX Not done right under JDK.
+
+ """
+ path = _tostr(path, "normcase")
+ return File(path).getPath()
+
+def commonprefix(m):
+ "Given a list of pathnames, return the longest common leading component"
+ if not m: return ''
+ prefix = m[0]
+ for item in m:
+ for i in range(len(prefix)):
+ if prefix[:i+1] <> item[:i+1]:
+ prefix = prefix[:i]
+ if i == 0: return ''
+ break
+ return prefix
+
+def islink(path):
+ """Test whether a path is a symbolic link.
+
+ XXX This incorrectly always returns false under JDK.
+
+ """
+ return 0
+
+def samefile(path, path2):
+ """Test whether two pathnames reference the same actual file"""
+ path = _tostr(path, "samefile")
+ path2 = _tostr(path2, "samefile")
+ f = File(path)
+ f2 = File(path2)
+ return f.getCanonicalPath() == f2.getCanonicalPath()
+
+def ismount(path):
+ """Test whether a path is a mount point.
+
+ XXX This incorrectly always returns false under JDK.
+
+ """
+ return 0
+
+
+def walk(top, func, arg):
+ """Walk a directory tree.
+
+ walk(top,func,args) calls func(arg, d, files) for each directory
+ "d" in the tree rooted at "top" (including "top" itself). "files"
+ is a list of all the files and subdirs in directory "d".
+
+ """
+ try:
+ names = os.listdir(top)
+ except os.error:
+ return
+ func(arg, top, names)
+ for name in names:
+ name = join(top, name)
+ if isdir(name) and not islink(name):
+ walk(name, func, arg)
+
+def expanduser(path):
+ if path[:1] == "~":
+ c = path[1:2]
+ if not c:
+ return gethome()
+ if c == os.sep:
+ return File(gethome(), path[2:]).getPath()
+ return path
+
+def getuser():
+ return System.getProperty("user.name")
+
+def gethome():
+ return System.getProperty("user.home")
+
+
+# normpath() from Python 1.5.2, with Java appropriate generalizations
+
+# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
+# It should be understood that this may change the meaning of the path
+# if it contains symbolic links!
+def normpath(path):
+ """Normalize path, eliminating double slashes, etc."""
+ sep = os.sep
+ if sep == '\\':
+ path = path.replace("/", sep)
+ curdir = os.curdir
+ pardir = os.pardir
+ import string
+ # Treat initial slashes specially
+ slashes = ''
+ while path[:1] == sep:
+ slashes = slashes + sep
+ path = path[1:]
+ comps = string.splitfields(path, sep)
+ i = 0
+ while i < len(comps):
+ if comps[i] == curdir:
+ del comps[i]
+ while i < len(comps) and comps[i] == '':
+ del comps[i]
+ elif comps[i] == pardir and i > 0 and comps[i-1] not in ('', pardir):
+ del comps[i-1:i+1]
+ i = i-1
+ elif comps[i] == '' and i > 0 and comps[i-1] <> '':
+ del comps[i]
+ else:
+ i = i+1
+ # If the path is now empty, substitute '.'
+ if not comps and not slashes:
+ comps.append(curdir)
+ return slashes + string.joinfields(comps, sep)
+
+# Return an absolute path.
+def abspath(path):
+ path = _tostr(path, "abspath")
+ return File(path).getAbsolutePath()
+
+
+def getsize(path):
+ path = _tostr(path, "getsize")
+ f = File(path)
+ size = f.length()
+ # Sadly, if the returned length is zero, we don't really know if the file
+ # is zero sized or does not exist.
+ if size == 0 and not f.exists():
+ raise OSError(0, 'No such file or directory', path)
+ return size
+
+def getmtime(path):
+ path = _tostr(path, "getmtime")
+ f = File(path)
+ return f.lastModified() / 1000.0
+
+def getatime(path):
+ # We can't detect access time so we return modification time. This
+ # matches the behaviour in os.stat().
+ path = _tostr(path, "getatime")
+ f = File(path)
+ return f.lastModified() / 1000.0
+
+
+# expandvars is stolen from CPython-2.1.1's Lib/ntpath.py:
+
+# Expand paths containing shell variable substitutions.
+# The following rules apply:
+# - no expansion within single quotes
+# - no escape character, except for '$$' which is translated into '$'
+# - ${varname} is accepted.
+# - varnames can be made out of letters, digits and the character '_'
+# XXX With COMMAND.COM you can use any characters in a variable name,
+# XXX except '^|<>='.
+
+def expandvars(path):
+ """Expand shell variables of form $var and ${var}.
+
+ Unknown variables are left unchanged."""
+ if '$' not in path:
+ return path
+ import string
+ varchars = string.letters + string.digits + '_-'
+ res = ''
+ index = 0
+ pathlen = len(path)
+ while index < pathlen:
+ c = path[index]
+ if c == '\'': # no expansion within single quotes
+ path = path[index + 1:]
+ pathlen = len(path)
+ try:
+ index = path.index('\'')
+ res = res + '\'' + path[:index + 1]
+ except ValueError:
+ res = res + path
+ index = pathlen - 1
+ elif c == '$': # variable or '$$'
+ if path[index + 1:index + 2] == '$':
+ res = res + c
+ index = index + 1
+ elif path[index + 1:index + 2] == '{':
+ path = path[index+2:]
+ pathlen = len(path)
+ try:
+ index = path.index('}')
+ var = path[:index]
+ if os.environ.has_key(var):
+ res = res + os.environ[var]
+ except ValueError:
+ res = res + path
+ index = pathlen - 1
+ else:
+ var = ''
+ index = index + 1
+ c = path[index:index + 1]
+ while c != '' and c in varchars:
+ var = var + c
+ index = index + 1
+ c = path[index:index + 1]
+ if os.environ.has_key(var):
+ res = res + os.environ[var]
+ if c != '':
+ res = res + c
+ else:
+ res = res + c
+ index = index + 1
+ return res
+
+
+