Patch #957650: "%var%" environment variable references are now properly

expanded in ntpath.expandvars(), also "~user" home directory references
are recognized and handled on Windows.
This commit is contained in:
Georg Brandl 2007-03-13 22:07:36 +00:00
parent b6ae6aa8ac
commit 03b90d8cfd
4 changed files with 64 additions and 22 deletions

View File

@ -58,18 +58,20 @@ Equivalent to \function{exists()} on platforms lacking
\end{funcdesc}
\begin{funcdesc}{expanduser}{path}
On \UNIX, return the argument with an initial component of \samp{\~} or
\samp{\~\var{user}} replaced by that \var{user}'s home directory.
An initial \samp{\~} is replaced by the environment variable
On \UNIX and Windows, return the argument with an initial component of
\samp{\~} or \samp{\~\var{user}} replaced by that \var{user}'s home directory.
On \UNIX, an initial \samp{\~} is replaced by the environment variable
\envvar{HOME} if it is set; otherwise the current user's home directory
is looked up in the password directory through the built-in module
\refmodule{pwd}\refbimodindex{pwd}.
An initial \samp{\~\var{user}} is looked up directly in the
password directory.
On Windows, only \samp{\~} is supported; it is replaced by the
environment variable \envvar{HOME} or by a combination of
\envvar{HOMEDRIVE} and \envvar{HOMEPATH}.
On Windows, \envvar{HOME} and \envvar{USERPROFILE} will be used if set,
otherwise a combination of \envvar{HOMEPATH} and \envvar{HOMEDRIVE} will be
used. An initial \samp{\~\var{user}} is handled by stripping the last
directory component from the created user path derived above.
If the expansion fails or if the
path does not begin with a tilde, the path is returned unchanged.
@ -81,6 +83,9 @@ of the form \samp{\$\var{name}} or \samp{\$\{\var{name}\}} are
replaced by the value of environment variable \var{name}. Malformed
variable names and references to non-existing variables are left
unchanged.
On Windows, \samp{\%\var{name}\%} expansions are supported in addition to
\samp{\$\var{name}} and \samp{\$\{\var{name}\}}.
\end{funcdesc}
\begin{funcdesc}{getatime}{path}

View File

@ -278,9 +278,11 @@ def expanduser(path):
i, n = 1, len(path)
while i < n and path[i] not in '/\\':
i = i + 1
if i == 1:
if 'HOME' in os.environ:
userhome = os.environ['HOME']
elif 'USERPROFILE' in os.environ:
userhome = os.environ['USERPROFILE']
elif not 'HOMEPATH' in os.environ:
return path
else:
@ -289,25 +291,31 @@ def expanduser(path):
except KeyError:
drive = ''
userhome = join(drive, os.environ['HOMEPATH'])
else:
return path
if i != 1: #~user
userhome = join(dirname(userhome), path[1:i])
return userhome + path[i:]
# Expand paths containing shell variable substitutions.
# The following rules apply:
# - no expansion within single quotes
# - no escape character, except for '$$' which is translated into '$'
# - '$$' is translated into '$'
# - '%%' is translated into '%' if '%%' are not seen in %var1%%var2%
# - ${varname} is accepted.
# - varnames can be made out of letters, digits and the character '_'
# - $varname is accepted.
# - %varname% is accepted.
# - varnames can be made out of letters, digits and the characters '_-'
# (though is not verifed in the ${varname} and %varname% cases)
# 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}.
"""Expand shell variables of the forms $var, ${var} and %var%.
Unknown variables are left unchanged."""
if '$' not in path:
if '$' not in path and '%' not in path:
return path
import string
varchars = string.ascii_letters + string.digits + '_-'
@ -325,6 +333,24 @@ def expandvars(path):
except ValueError:
res = res + path
index = pathlen - 1
elif c == '%': # variable or '%'
if path[index + 1:index + 2] == '%':
res = res + c
index = index + 1
else:
path = path[index+1:]
pathlen = len(path)
try:
index = path.index('%')
except ValueError:
res = res + '%' + path
index = pathlen - 1
else:
var = path[:index]
if var in os.environ:
res = res + os.environ[var]
else:
res = res + '%' + var + '%'
elif c == '$': # variable or '$$'
if path[index + 1:index + 2] == '$':
res = res + c

View File

@ -134,6 +134,13 @@ try:
tester('ntpath.expandvars("${{foo}}")', "baz1}")
tester('ntpath.expandvars("$foo$foo")', "barbar")
tester('ntpath.expandvars("$bar$bar")', "$bar$bar")
tester('ntpath.expandvars("%foo% bar")', "bar bar")
tester('ntpath.expandvars("%foo%bar")', "barbar")
tester('ntpath.expandvars("%foo%%foo%")', "barbar")
tester('ntpath.expandvars("%%foo%%foo%foo%")', "%foo%foobar")
tester('ntpath.expandvars("%?bar%")', "%?bar%")
tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
finally:
os.environ.clear()
os.environ.update(oldenv)

View File

@ -170,6 +170,10 @@ Core and builtins
Library
-------
- Patch #957650: "%var%" environment variable references are now properly
expanded in ntpath.expandvars(), also "~user" home directory references
are recognized and handled on Windows.
- Patch #1429539: pdb now correctly initializes the __main__ module for
the debugged script, which means that imports from __main__ work
correctly now.