[Python-Dev] problems building Python 2.1a1 on QNX 4.25

M.-A. Lemburg mal@lemburg.com
Fri, 26 Jan 2001 23:51:09 +0100


Fredrik Lundh wrote:
> 
> mal wrote:> > Ooh, very likely:
> > > >>> os.path.normpath('//5/foo/bar')
> > > '/5/foo/bar'
> > >
> > > Isn't // at the root a Unix convention of some sort for some
> > > network filesystems?  Probably normpath() should just leave it alone.
> >
> > Samba uses //<hostname>/<mountname>/<path>. os.path.normpath()
> > should probably leave the leading '//' untouched (having too
> > many of those in the path doesn't do any harm, AFAIK).
> 
> from 1.5.2's posixpath:
> 
> def normpath(path):
>     """Normalize path, eliminating double slashes, etc."""
>     import string
>     # Treat initial slashes specially
>     slashes = ''
>     while path[:1] == '/':
>         slashes = slashes + '/'
>         path = path[1:]
>     ...
>     return slashes + string.joinfields(comps, '/')
> 
> from 2.0's posixpath:
> 
> def normpath(path):
>     """Normalize path, eliminating double slashes, etc."""
>     if path == '':
>         return '.'
>     import string
>     initial_slash = (path[0] == '/')
>     ...
>     if initial_slash:
>         path = '/' + path
>     return path or '.'
> 
> interesting...

Here's the log message:

revision 1.34
date: 2000/07/19 17:09:51;  author: montanaro;  state: Exp;  lines: +18 -23
added rewritten normpath from Moshe Zadka that does the right thing with
paths containing ..

and the diff:

diff -r1.34 -r1.33
349,350d348
<     if path == '':
<         return '.'
352,367c350,372
<     initial_slash = (path[0] == '/')
<     comps = string.split(path, '/')
<     new_comps = []
<     for comp in comps:
<         if comp in ('', '.'):
<             continue
<         if (comp != '..' or (not initial_slash and not new_comps) or 
<              (new_comps and new_comps[-1] == '..')):
<             new_comps.append(comp)
<         elif new_comps:
<             new_comps.pop()
<     comps = new_comps
<     path = string.join(comps, '/')
<     if initial_slash:
<         path = '/' + path
<     return path or '.'
---
>     # Treat initial slashes specially
>     slashes = ''
>     while path[:1] == '/':
>         slashes = slashes + '/'
>         path = path[1:]
>     comps = string.splitfields(path, '/')
>     i = 0
>     while i < len(comps):
>         if comps[i] == '.':
>             del comps[i]
>             while i < len(comps) and comps[i] == '':
>                 del comps[i]
>         elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'):
>             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('.')
>     return slashes + string.joinfields(comps, '/')

Revision 1.33 clearly leaves initial slashes untouched.
I guess we should restore this...

-- 
Marc-Andre Lemburg
______________________________________________________________________
Company:                                        http://www.egenix.com/
Consulting:                                    http://www.lemburg.com/
Python Pages:                           http://www.lemburg.com/python/