@@ -332,34 +332,55 @@ def with_segments(self, *pathsegments):
332
332
return type (self )(* pathsegments )
333
333
334
334
@classmethod
335
- def _parse_path (cls , path ):
336
- if not path :
335
+ def _parse_paths (cls , paths ):
336
+ if not paths :
337
337
return '' , '' , []
338
338
sep = cls ._flavour .sep
339
339
altsep = cls ._flavour .altsep
340
- if altsep :
341
- path = path .replace (altsep , sep )
342
- drv , root , rel = cls ._flavour .splitroot (path )
343
- if not root and drv .startswith (sep ) and not drv .endswith (sep ):
340
+ splitroot = cls ._flavour .splitroot
341
+
342
+ # Join paths like ntpath.join(), but without concatenating strings.
343
+ drv , root , tail = '' , '' , []
344
+ for path in paths :
345
+ if altsep :
346
+ path = path .replace (altsep , sep )
347
+ p_drv , p_root , p_rel = splitroot (path )
348
+ p_tail = p_rel .split (sep )
349
+ if p_root :
350
+ if p_drv :
351
+ drv = p_drv
352
+ root = p_root
353
+ tail = p_tail
354
+ elif p_drv and p_drv != drv :
355
+ if p_drv .lower () != drv .lower ():
356
+ drv = p_drv
357
+ root = p_root
358
+ tail = p_tail
359
+ else :
360
+ drv = p_drv
361
+ tail .extend (p_tail )
362
+ else :
363
+ tail .extend (p_tail )
364
+
365
+ # Normalize UNC path.
366
+ if drv and not root and drv [- 1 ] not in ':\\ ' :
367
+ if any (tail ):
368
+ # Join onto partial UNC drive - must join and re-split.
369
+ parts = [drv ] + [x for x in tail if x ]
370
+ drv , root , rel = splitroot (sep .join (parts ))
371
+ tail = rel .split (sep )
344
372
drv_parts = drv .split (sep )
345
373
if len (drv_parts ) == 4 and drv_parts [2 ] not in '?.' :
346
374
# e.g. //server/share
347
375
root = sep
348
376
elif len (drv_parts ) == 6 :
349
377
# e.g. //?/unc/server/share
350
378
root = sep
351
- parsed = [sys .intern (str (x )) for x in rel . split ( sep ) if x and x != '.' ]
379
+ parsed = [sys .intern (str (x )) for x in tail if x and x != '.' ]
352
380
return drv , root , parsed
353
381
354
382
def _load_parts (self ):
355
- paths = self ._raw_paths
356
- if len (paths ) == 0 :
357
- path = ''
358
- elif len (paths ) == 1 :
359
- path = paths [0 ]
360
- else :
361
- path = self ._flavour .join (* paths )
362
- drv , root , tail = self ._parse_path (path )
383
+ drv , root , tail = self ._parse_paths (self ._raw_paths )
363
384
self ._drv = drv
364
385
self ._root = root
365
386
self ._tail_cached = tail
@@ -1385,7 +1406,7 @@ def expanduser(self):
1385
1406
homedir = self ._flavour .expanduser (self ._tail [0 ])
1386
1407
if homedir [:1 ] == "~" :
1387
1408
raise RuntimeError ("Could not determine home directory." )
1388
- drv , root , tail = self ._parse_path ( homedir )
1409
+ drv , root , tail = self ._parse_paths (( homedir ,) )
1389
1410
return self ._from_parsed_parts (drv , root , tail + self ._tail [1 :])
1390
1411
1391
1412
return self
0 commit comments