diff options
Diffstat (limited to 'bitbake/lib/bb/utils.py')
-rw-r--r-- | bitbake/lib/bb/utils.py | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 5f5767c1da..34fa0b7a67 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
@@ -16,7 +16,8 @@ import bb.msg | |||
16 | import multiprocessing | 16 | import multiprocessing |
17 | import fcntl | 17 | import fcntl |
18 | import importlib | 18 | import importlib |
19 | from importlib import machinery | 19 | import importlib.machinery |
20 | import importlib.util | ||
20 | import itertools | 21 | import itertools |
21 | import subprocess | 22 | import subprocess |
22 | import glob | 23 | import glob |
@@ -420,12 +421,14 @@ def better_eval(source, locals, extraglobals = None): | |||
420 | return eval(source, ctx, locals) | 421 | return eval(source, ctx, locals) |
421 | 422 | ||
422 | @contextmanager | 423 | @contextmanager |
423 | def fileslocked(files): | 424 | def fileslocked(files, *args, **kwargs): |
424 | """Context manager for locking and unlocking file locks.""" | 425 | """Context manager for locking and unlocking file locks.""" |
425 | locks = [] | 426 | locks = [] |
426 | if files: | 427 | if files: |
427 | for lockfile in files: | 428 | for lockfile in files: |
428 | locks.append(bb.utils.lockfile(lockfile)) | 429 | l = bb.utils.lockfile(lockfile, *args, **kwargs) |
430 | if l is not None: | ||
431 | locks.append(l) | ||
429 | 432 | ||
430 | try: | 433 | try: |
431 | yield | 434 | yield |
@@ -458,9 +461,16 @@ def lockfile(name, shared=False, retry=True, block=False): | |||
458 | consider the possibility of sending a signal to the process to break | 461 | consider the possibility of sending a signal to the process to break |
459 | out - at which point you want block=True rather than retry=True. | 462 | out - at which point you want block=True rather than retry=True. |
460 | """ | 463 | """ |
464 | basename = os.path.basename(name) | ||
465 | if len(basename) > 255: | ||
466 | root, ext = os.path.splitext(basename) | ||
467 | basename = root[:255 - len(ext)] + ext | ||
468 | |||
461 | dirname = os.path.dirname(name) | 469 | dirname = os.path.dirname(name) |
462 | mkdirhier(dirname) | 470 | mkdirhier(dirname) |
463 | 471 | ||
472 | name = os.path.join(dirname, basename) | ||
473 | |||
464 | if not os.access(dirname, os.W_OK): | 474 | if not os.access(dirname, os.W_OK): |
465 | logger.error("Unable to acquire lock '%s', directory is not writable", | 475 | logger.error("Unable to acquire lock '%s', directory is not writable", |
466 | name) | 476 | name) |
@@ -494,7 +504,7 @@ def lockfile(name, shared=False, retry=True, block=False): | |||
494 | return lf | 504 | return lf |
495 | lf.close() | 505 | lf.close() |
496 | except OSError as e: | 506 | except OSError as e: |
497 | if e.errno == errno.EACCES: | 507 | if e.errno == errno.EACCES or e.errno == errno.ENAMETOOLONG: |
498 | logger.error("Unable to acquire lock '%s', %s", | 508 | logger.error("Unable to acquire lock '%s', %s", |
499 | e.strerror, name) | 509 | e.strerror, name) |
500 | sys.exit(1) | 510 | sys.exit(1) |
@@ -959,6 +969,17 @@ def which(path, item, direction = 0, history = False, executable=False): | |||
959 | return "", hist | 969 | return "", hist |
960 | return "" | 970 | return "" |
961 | 971 | ||
972 | @contextmanager | ||
973 | def umask(new_mask): | ||
974 | """ | ||
975 | Context manager to set the umask to a specific mask, and restore it afterwards. | ||
976 | """ | ||
977 | current_mask = os.umask(new_mask) | ||
978 | try: | ||
979 | yield | ||
980 | finally: | ||
981 | os.umask(current_mask) | ||
982 | |||
962 | def to_boolean(string, default=None): | 983 | def to_boolean(string, default=None): |
963 | if not string: | 984 | if not string: |
964 | return default | 985 | return default |
@@ -1560,21 +1581,22 @@ def set_process_name(name): | |||
1560 | 1581 | ||
1561 | # export common proxies variables from datastore to environment | 1582 | # export common proxies variables from datastore to environment |
1562 | def export_proxies(d): | 1583 | def export_proxies(d): |
1563 | import os | 1584 | """ export common proxies variables from datastore to environment """ |
1564 | 1585 | ||
1565 | variables = ['http_proxy', 'HTTP_PROXY', 'https_proxy', 'HTTPS_PROXY', | 1586 | variables = ['http_proxy', 'HTTP_PROXY', 'https_proxy', 'HTTPS_PROXY', |
1566 | 'ftp_proxy', 'FTP_PROXY', 'no_proxy', 'NO_PROXY', | 1587 | 'ftp_proxy', 'FTP_PROXY', 'no_proxy', 'NO_PROXY', |
1567 | 'GIT_PROXY_COMMAND'] | 1588 | 'GIT_PROXY_COMMAND', 'SSL_CERT_FILE', 'SSL_CERT_DIR'] |
1568 | exported = False | 1589 | exported = False |
1569 | 1590 | ||
1570 | for v in variables: | 1591 | origenv = d.getVar("BB_ORIGENV") |
1571 | if v in os.environ.keys(): | 1592 | |
1593 | for name in variables: | ||
1594 | value = d.getVar(name) | ||
1595 | if not value and origenv: | ||
1596 | value = origenv.getVar(name) | ||
1597 | if value: | ||
1598 | os.environ[name] = value | ||
1572 | exported = True | 1599 | exported = True |
1573 | else: | ||
1574 | v_proxy = d.getVar(v) | ||
1575 | if v_proxy is not None: | ||
1576 | os.environ[v] = v_proxy | ||
1577 | exported = True | ||
1578 | 1600 | ||
1579 | return exported | 1601 | return exported |
1580 | 1602 | ||
@@ -1584,7 +1606,9 @@ def load_plugins(logger, plugins, pluginpath): | |||
1584 | logger.debug(1, 'Loading plugin %s' % name) | 1606 | logger.debug(1, 'Loading plugin %s' % name) |
1585 | spec = importlib.machinery.PathFinder.find_spec(name, path=[pluginpath] ) | 1607 | spec = importlib.machinery.PathFinder.find_spec(name, path=[pluginpath] ) |
1586 | if spec: | 1608 | if spec: |
1587 | return spec.loader.load_module() | 1609 | mod = importlib.util.module_from_spec(spec) |
1610 | spec.loader.exec_module(mod) | ||
1611 | return mod | ||
1588 | 1612 | ||
1589 | logger.debug(1, 'Loading plugins from %s...' % pluginpath) | 1613 | logger.debug(1, 'Loading plugins from %s...' % pluginpath) |
1590 | 1614 | ||