comparison mercurial/posix.py @ 45942:89a2afe31e82

formating: upgrade to black 20.8b1 This required a couple of small tweaks to un-confuse black, but now it works. Big formatting changes come from: * Dramatically improved collection-splitting logic upstream * Black having a strong (correct IMO) opinion that """ is better than ''' Differential Revision: https://phab.mercurial-scm.org/D9430
author Augie Fackler <raf@durin42.com>
date Fri, 27 Nov 2020 17:03:29 -0500
parents 87c35b5a14eb
children 6595e22048fe
comparison
equal deleted inserted replaced
45941:346af7687c6f 45942:89a2afe31e82
74 # https://github.com/python/cpython/blob/v3.7.3/Modules/_io/fileio.c#L474 74 # https://github.com/python/cpython/blob/v3.7.3/Modules/_io/fileio.c#L474
75 posixfile = open 75 posixfile = open
76 76
77 77
78 def split(p): 78 def split(p):
79 '''Same as posixpath.split, but faster 79 """Same as posixpath.split, but faster
80 80
81 >>> import posixpath 81 >>> import posixpath
82 >>> for f in [b'/absolute/path/to/file', 82 >>> for f in [b'/absolute/path/to/file',
83 ... b'relative/path/to/file', 83 ... b'relative/path/to/file',
84 ... b'file_alone', 84 ... b'file_alone',
86 ... b'/multiple/path//separators', 86 ... b'/multiple/path//separators',
87 ... b'/file_at_root', 87 ... b'/file_at_root',
88 ... b'///multiple_leading_separators_at_root', 88 ... b'///multiple_leading_separators_at_root',
89 ... b'']: 89 ... b'']:
90 ... assert split(f) == posixpath.split(f), f 90 ... assert split(f) == posixpath.split(f), f
91 ''' 91 """
92 ht = p.rsplit(b'/', 1) 92 ht = p.rsplit(b'/', 1)
93 if len(ht) == 1: 93 if len(ht) == 1:
94 return b'', p 94 return b'', p
95 nh = ht[0].rstrip(b'/') 95 nh = ht[0].rstrip(b'/')
96 if nh: 96 if nh:
181 # Turn off all +x bits 181 # Turn off all +x bits
182 os.chmod(f, s & 0o666) 182 os.chmod(f, s & 0o666)
183 183
184 184
185 def copymode(src, dst, mode=None, enforcewritable=False): 185 def copymode(src, dst, mode=None, enforcewritable=False):
186 '''Copy the file mode from the file at path src to dst. 186 """Copy the file mode from the file at path src to dst.
187 If src doesn't exist, we're using mode instead. If mode is None, we're 187 If src doesn't exist, we're using mode instead. If mode is None, we're
188 using umask.''' 188 using umask."""
189 try: 189 try:
190 st_mode = os.lstat(src).st_mode & 0o777 190 st_mode = os.lstat(src).st_mode & 0o777
191 except OSError as inst: 191 except OSError as inst:
192 if inst.errno != errno.ENOENT: 192 if inst.errno != errno.ENOENT:
193 raise 193 raise
357 unlink(name) 357 unlink(name)
358 return False 358 return False
359 359
360 360
361 def checkosfilename(path): 361 def checkosfilename(path):
362 '''Check that the base-relative path is a valid filename on this platform. 362 """Check that the base-relative path is a valid filename on this platform.
363 Returns None if the path is ok, or a UI string describing the problem.''' 363 Returns None if the path is ok, or a UI string describing the problem."""
364 return None # on posix platforms, every path is ok 364 return None # on posix platforms, every path is ok
365 365
366 366
367 def getfsmountpoint(dirpath): 367 def getfsmountpoint(dirpath):
368 '''Get the filesystem mount point from a directory (best-effort) 368 """Get the filesystem mount point from a directory (best-effort)
369 369
370 Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc. 370 Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
371 ''' 371 """
372 return getattr(osutil, 'getfsmountpoint', lambda x: None)(dirpath) 372 return getattr(osutil, 'getfsmountpoint', lambda x: None)(dirpath)
373 373
374 374
375 def getfstype(dirpath): 375 def getfstype(dirpath):
376 '''Get the filesystem type name from a directory (best-effort) 376 """Get the filesystem type name from a directory (best-effort)
377 377
378 Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc. 378 Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
379 ''' 379 """
380 return getattr(osutil, 'getfstype', lambda x: None)(dirpath) 380 return getattr(osutil, 'getfstype', lambda x: None)(dirpath)
381 381
382 382
383 def setbinary(fd): 383 def setbinary(fd):
384 pass 384 pass
417 normcasefallback = normcase 417 normcasefallback = normcase
418 418
419 if pycompat.isdarwin: 419 if pycompat.isdarwin:
420 420
421 def normcase(path): 421 def normcase(path):
422 ''' 422 """
423 Normalize a filename for OS X-compatible comparison: 423 Normalize a filename for OS X-compatible comparison:
424 - escape-encode invalid characters 424 - escape-encode invalid characters
425 - decompose to NFD 425 - decompose to NFD
426 - lowercase 426 - lowercase
427 - omit ignored characters [200c-200f, 202a-202e, 206a-206f,feff] 427 - omit ignored characters [200c-200f, 202a-202e, 206a-206f,feff]
432 'cafe\\xcc\\x81' 432 'cafe\\xcc\\x81'
433 >>> normcase(b'\\xc3\\x89') 433 >>> normcase(b'\\xc3\\x89')
434 'e\\xcc\\x81' 434 'e\\xcc\\x81'
435 >>> normcase(b'\\xb8\\xca\\xc3\\xca\\xbe\\xc8.JPG') # issue3918 435 >>> normcase(b'\\xb8\\xca\\xc3\\xca\\xbe\\xc8.JPG') # issue3918
436 '%b8%ca%c3\\xca\\xbe%c8.jpg' 436 '%b8%ca%c3\\xca\\xbe%c8.jpg'
437 ''' 437 """
438 438
439 try: 439 try:
440 return encoding.asciilower(path) # exception for non-ASCII 440 return encoding.asciilower(path) # exception for non-ASCII
441 except UnicodeDecodeError: 441 except UnicodeDecodeError:
442 return normcasefallback(path) 442 return normcasefallback(path)
473 # treated as case sensitive, even though underlying NTFS is case 473 # treated as case sensitive, even though underlying NTFS is case
474 # insensitive. 474 # insensitive.
475 475
476 # default mount points 476 # default mount points
477 cygwinmountpoints = sorted( 477 cygwinmountpoints = sorted(
478 [b"/usr/bin", b"/usr/lib", b"/cygdrive",], reverse=True 478 [
479 b"/usr/bin",
480 b"/usr/lib",
481 b"/cygdrive",
482 ],
483 reverse=True,
479 ) 484 )
480 485
481 # use upper-ing as normcase as same as NTFS workaround 486 # use upper-ing as normcase as same as NTFS workaround
482 def normcase(path): 487 def normcase(path):
483 pathlen = len(path) 488 pathlen = len(path)
551 """Return True if the stat object st is from the current user.""" 556 """Return True if the stat object st is from the current user."""
552 return st.st_uid == os.getuid() 557 return st.st_uid == os.getuid()
553 558
554 559
555 def findexe(command): 560 def findexe(command):
556 '''Find executable for command searching like which does. 561 """Find executable for command searching like which does.
557 If command is a basename then PATH is searched for command. 562 If command is a basename then PATH is searched for command.
558 PATH isn't searched if command is an absolute or relative path. 563 PATH isn't searched if command is an absolute or relative path.
559 If command isn't found None is returned.''' 564 If command isn't found None is returned."""
560 if pycompat.sysplatform == b'OpenVMS': 565 if pycompat.sysplatform == b'OpenVMS':
561 return command 566 return command
562 567
563 def findexisting(executable): 568 def findexisting(executable):
564 b'Will return executable if existing file' 569 b'Will return executable if existing file'
585 590
586 _wantedkinds = {stat.S_IFREG, stat.S_IFLNK} 591 _wantedkinds = {stat.S_IFREG, stat.S_IFLNK}
587 592
588 593
589 def statfiles(files): 594 def statfiles(files):
590 '''Stat each file in files. Yield each stat, or None if a file does not 595 """Stat each file in files. Yield each stat, or None if a file does not
591 exist or has a type we don't care about.''' 596 exist or has a type we don't care about."""
592 lstat = os.lstat 597 lstat = os.lstat
593 getkind = stat.S_IFMT 598 getkind = stat.S_IFMT
594 for nf in files: 599 for nf in files:
595 try: 600 try:
596 st = lstat(nf) 601 st = lstat(nf)