561 _winreservednames = '''con prn aux nul |
561 _winreservednames = '''con prn aux nul |
562 com1 com2 com3 com4 com5 com6 com7 com8 com9 |
562 com1 com2 com3 com4 com5 com6 com7 com8 com9 |
563 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9'''.split() |
563 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9'''.split() |
564 _winreservedchars = ':*?"<>|' |
564 _winreservedchars = ':*?"<>|' |
565 def checkwinfilename(path): |
565 def checkwinfilename(path): |
566 '''Check that the base-relative path is a valid filename on Windows. |
566 r'''Check that the base-relative path is a valid filename on Windows. |
567 Returns None if the path is ok, or a UI string describing the problem. |
567 Returns None if the path is ok, or a UI string describing the problem. |
568 |
568 |
569 >>> checkwinfilename("just/a/normal/path") |
569 >>> checkwinfilename("just/a/normal/path") |
570 >>> checkwinfilename("foo/bar/con.xml") |
570 >>> checkwinfilename("foo/bar/con.xml") |
571 "filename contains 'con', which is reserved on Windows" |
571 "filename contains 'con', which is reserved on Windows" |
575 >>> checkwinfilename("foo/bar/AUX/bla.txt") |
575 >>> checkwinfilename("foo/bar/AUX/bla.txt") |
576 "filename contains 'AUX', which is reserved on Windows" |
576 "filename contains 'AUX', which is reserved on Windows" |
577 >>> checkwinfilename("foo/bar/bla:.txt") |
577 >>> checkwinfilename("foo/bar/bla:.txt") |
578 "filename contains ':', which is reserved on Windows" |
578 "filename contains ':', which is reserved on Windows" |
579 >>> checkwinfilename("foo/bar/b\07la.txt") |
579 >>> checkwinfilename("foo/bar/b\07la.txt") |
580 "filename contains '\\\\x07', which is invalid on Windows" |
580 "filename contains '\\x07', which is invalid on Windows" |
581 >>> checkwinfilename("foo/bar/bla ") |
581 >>> checkwinfilename("foo/bar/bla ") |
582 "filename ends with ' ', which is not allowed on Windows" |
582 "filename ends with ' ', which is not allowed on Windows" |
583 >>> checkwinfilename("../bar") |
583 >>> checkwinfilename("../bar") |
|
584 >>> checkwinfilename("foo\\") |
|
585 "filename ends with '\\', which is invalid on Windows" |
|
586 >>> checkwinfilename("foo\\/bar") |
|
587 "directory name ends with '\\', which is invalid on Windows" |
584 ''' |
588 ''' |
|
589 if path.endswith('\\'): |
|
590 return _("filename ends with '\\', which is invalid on Windows") |
|
591 if '\\/' in path: |
|
592 return _("directory name ends with '\\', which is invalid on Windows") |
585 for n in path.replace('\\', '/').split('/'): |
593 for n in path.replace('\\', '/').split('/'): |
586 if not n: |
594 if not n: |
587 continue |
595 continue |
588 for c in n: |
596 for c in n: |
589 if c in _winreservedchars: |
597 if c in _winreservedchars: |