Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def __extract(self, test_path, extract_func=None, verbatim=False):
"""
Given an archive file identified by test_path relative
to a test files directory, return a new temp directory where the
archive file has been extracted using extract_func.
If `verbatim` is True preserve the permissions.
"""
assert test_path and test_path != ''
if on_linux and py2:
test_path = fsencode(test_path)
test_path = to_os_native_path(test_path)
target_path = path.basename(test_path)
target_dir = self.get_temp_dir(target_path)
original_archive = self.get_test_loc(test_path)
if on_linux and py2:
target_dir = fsencode(target_dir)
original_archive = fsencode(original_archive)
extract_func(original_archive, target_dir,
verbatim=verbatim)
return target_dir
def extract_tar(location, target_dir, verbatim=False, *args, **kwargs):
"""
Extract a tar archive at location in the target_dir directory.
If `verbatim` is True preserve the permissions.
"""
# always for using bytes for paths on all OSses... tar seems to use bytes internally
# and get confused otherwise
location = fsencode(location)
if on_linux and py2:
target_dir = fsencode(target_dir)
with open(location, 'rb') as input_tar:
tar = None
try:
tar = tarfile.open(fileobj=input_tar)
tarinfos = tar.getmembers()
to_extract = []
for tarinfo in tarinfos:
if tar_can_extract(tarinfo, verbatim):
if not verbatim:
tarinfo.mode = 0o700
to_extract.append(tarinfo)
tar.extractall(target_dir, members=to_extract)
finally:
def __extract(self, test_path, extract_func=None, verbatim=False):
"""
Given an archive file identified by test_path relative
to a test files directory, return a new temp directory where the
archive file has been extracted using extract_func.
If `verbatim` is True preserve the permissions.
"""
assert test_path and test_path != ''
if on_linux and py2:
test_path = fsencode(test_path)
test_path = to_os_native_path(test_path)
target_path = path.basename(test_path)
target_dir = self.get_temp_dir(target_path)
original_archive = self.get_test_loc(test_path)
if on_linux and py2:
target_dir = fsencode(target_dir)
original_archive = fsencode(original_archive)
extract_func(original_archive, target_dir,
verbatim=verbatim)
return target_dir
def get_test_loc(self, test_path, copy=False, debug=False):
"""
Given a `test_path` relative to the self.test_data_dir directory, return the
location to a test file or directory for this path. Copy to a temp
test location if `copy` is True.
"""
test_data_dir = self.test_data_dir
if on_linux and py2:
test_path = fsencode(test_path)
test_data_dir = fsencode(test_data_dir)
if debug:
import inspect
caller = inspect.stack()[1][3]
print('\nself.get_test_loc,%(caller)s,"%(test_path)s"' % locals())
test_loc = get_test_loc(test_path, test_data_dir, debug=debug)
if copy:
base_name = path.basename(test_loc)
if filetype.is_file(test_loc):
# target must be an existing dir
target_dir = self.get_temp_dir()
fileutils.copyfile(test_loc, target_dir)
test_loc = path.join(target_dir, base_name)
else:
# target must be a NON existing dir
if not new_path:
return
new_path = new_path.strip()
if not new_path:
return
path_env = _os_module.environ.get(b'PATH')
if not path_env:
# this is quite unlikely to ever happen, but here for safety
path_env = ''
# ensure we use unicode or bytes depending on OSes
if on_linux:
new_path = fsencode(new_path)
path_env = fsencode(path_env)
sep = _os_module.pathsep
else:
new_path = fsdecode(new_path)
path_env = fsdecode(path_env)
sep = unicode(_os_module.pathsep)
path_segments = path_env.split(sep)
# add lib path to the front of the PATH env var
# this will use bytes on Linux and unicode elsewhere
if new_path not in path_segments:
if not path_env:
new_path_env = new_path
else:
new_path_env = sep.join([new_path, path_env])
path_env = fsdecode(path_env)
sep = unicode(_os_module.pathsep)
path_segments = path_env.split(sep)
# add lib path to the front of the PATH env var
# this will use bytes on Linux and unicode elsewhere
if new_path not in path_segments:
if not path_env:
new_path_env = new_path
else:
new_path_env = sep.join([new_path, path_env])
if not on_linux:
# recode to bytes using FS encoding
new_path_env = fsencode(new_path_env)
# ... and set the variable back as bytes
_os_module.environ[b'PATH'] = new_path_env
logger.debug('get_handlers: processing %(location)s: ftype: %(ftype)s, mtype: %(mtype)s ' % locals())
for handler in archive_handlers:
if not handler.extractors:
continue
extractor_count = len(handler.extractors)
if extractor_count > 2:
raise Exception('Maximum level of archive nesting is two.')
# default to False
type_matched = handler.filetypes and any(t in ftype for t in handler.filetypes)
mime_matched = handler.mimetypes and any(m in mtype for m in handler.mimetypes)
exts = handler.extensions
if exts:
if on_linux and py2:
exts = tuple(fileutils.fsencode(e) for e in exts)
extension_matched = exts and location.lower().endswith(exts)
if TRACE_DEEP:
logger.debug(' get_handlers: matched type: %(type_matched)s, mime: %(mime_matched)s, ext: %(extension_matched)s' % locals())
if handler.strict and not all([type_matched, mime_matched, extension_matched]):
logger.debug(' get_handlers: skip strict' % locals())
continue
if type_matched or mime_matched or extension_matched:
if TRACE_DEEP:
handler_name = handler.name
logger.debug(' get_handlers: yielding handler: %(handler_name)r' % locals())
yield handler, type_matched, mime_matched, extension_matched
def get_codebase_cache_dir(temp_dir):
"""
Return a new, created and unique per-run cache storage directory path rooted
at the `temp_dir` base temp directory in the OS-preferred representation
(either bytes on Linux and Unicode elsewhere).
"""
from commoncode.fileutils import get_temp_dir
from commoncode.timeutils import time2tstamp
prefix = 'scancode-codebase-' + time2tstamp() + '-'
cache_dir = get_temp_dir(base_dir=temp_dir, prefix=prefix)
if on_linux and py2:
cache_dir = fsencode(cache_dir)
else:
cache_dir = fsdecode(cache_dir)
return cache_dir
def get_handlers(location):
"""
Return an iterable of (handler, type_matched, mime_matched,
extension_matched,) for this `location`.
"""
if on_linux and py2:
location = fileutils.fsencode(location)
if filetype.is_file(location):
T = contenttype.get_type(location)
ftype = T.filetype_file.lower()
mtype = T.mimetype_file
if TRACE_DEEP:
logger.debug('get_handlers: processing %(location)s: ftype: %(ftype)s, mtype: %(mtype)s ' % locals())
for handler in archive_handlers:
if not handler.extractors:
continue
extractor_count = len(handler.extractors)
if extractor_count > 2:
raise Exception('Maximum level of archive nesting is two.')
def get_best_handler(location, kinds=all_kinds):
"""
Return the best handler of None for the file at location.
"""
if on_linux and py2:
location = fileutils.fsencode(location)
location = os.path.abspath(os.path.expanduser(location))
if not filetype.is_file(location):
return
handlers = list(get_handlers(location))
if TRACE_DEEP:
logger.debug('get_best_handler: handlers: %(handlers)r ' % locals())
if handlers:
candidates = score_handlers(handlers)
return candidates and pick_best_handler(candidates, kinds)