mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	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:
		
							parent
							
								
									b6ae6aa8ac
								
							
						
					
					
						commit
						03b90d8cfd
					
				
					 4 changed files with 64 additions and 22 deletions
				
			
		|  | @ -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} | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -134,6 +134,13 @@ def tester(fn, wantResult): | |||
|     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) | ||||
|  |  | |||
|  | @ -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. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl