def is_patch(location, include_extracted=False): """ Test if a file is a possible patch file. May return True for some files that are not patches. Extracted patch files are ignored by default. """ T = typecode.contenttype.get_type(location) file_name = fileutils.file_name(location) patch_like = "diff " in T.filetype_file.lower() or ".diff" in file_name or ".patch" in file_name if not patch_like: return False if extractcode.is_extraction_path(file_name) and not include_extracted: return False return True
def is_patch(location, include_extracted=False): """ Test if a file is a possible patch file. May return True for some files that are not patches. Extracted patch files are ignored by default. """ T = typecode.contenttype.get_type(location) file_name = fileutils.file_name(location) patch_like = ('diff ' in T.filetype_file.lower() or '.diff' in file_name or '.patch' in file_name) if not patch_like: return False if extractcode.is_extraction_path(file_name) and not include_extracted: return False return True
def extract(location, kinds=extractcode.default_kinds, recurse=False): """ Walk and extract any archives found at `location` (either a file or directory). Extract only archives of a kind listed in the `kinds` kind tuple. Return an iterable of ExtractEvent tuples for each extracted archive. This can be used to track extraction progress: - one event is emitted just before extracting an archive. The ExtractEvent warnings and errors are empty. The `done` flag is False. - one event is emitted right after extracting an archive. The ExtractEvent warnings and errors contains warnings and errors if any. The `done` flag is True. If `recurse` is True, extract recursively archives nested inside other archives If `recurse` is false, then do not extract further an already extracted archive identified by the corresponding extract suffix location. Note that while the original file system is walked top-down, breadth-first, if recurse and a nested archive is found, it is extracted to full depth first before resuming the file system walk. """ ignored = partial(ignore.is_ignored, ignores=ignore.default_ignores, unignores={}) if TRACE: logger.debug('extract:start: %(location)r recurse: %(recurse)r\n' % locals()) abs_location = abspath(expanduser(location)) for top, dirs, files in fileutils.walk(abs_location, ignored): if TRACE: logger.debug( 'extract:walk: top: %(top)r dirs: %(dirs)r files: r(files)r' % locals()) if not recurse: if TRACE: drs = set(dirs) for d in dirs[:]: if extractcode.is_extraction_path(d): dirs.remove(d) if TRACE: logger.debug('extract:walk: not recurse: removed dirs:' + repr(drs.symmetric_difference(set(dirs)))) for f in files: loc = join(top, f) if not recurse and extractcode.is_extraction_path(loc): if TRACE: logger.debug( 'extract:walk not recurse: skipped file: %(loc)r' % locals()) continue if not archive.should_extract(loc, kinds): if TRACE: logger.debug( 'extract:walk: skipped file: not should_extract: %(loc)r' % locals()) continue target = join(abspath(top), extractcode.get_extraction_path(loc)) if TRACE: logger.debug('extract:target: %(target)r' % locals()) for xevent in extract_file(loc, target, kinds): if TRACE: logger.debug('extract:walk:extraction event: %(xevent)r' % locals()) yield xevent if recurse: if TRACE: logger.debug( 'extract:walk: recursing on target: %(target)r' % locals()) for xevent in extract(target, kinds, recurse): if TRACE: logger.debug( 'extract:walk:recurse:extraction event: %(xevent)r' % locals()) yield xevent
def extract_files( location, kinds=extractcode.default_kinds, recurse=False, ignore_pattern=(), ): """ Extract the files found at `location`. Extract only archives of a kind listed in the `kinds` kind tuple. If `recurse` is True, extract recursively archives nested inside other archives. If `recurse` is false, then do not extract further an already extracted archive identified by the corresponding extract suffix location. """ ignored = partial(ignore.is_ignored, ignores=ignore.default_ignores, unignores={}) if TRACE: logger.debug('extract:start: %(location)r recurse: %(recurse)r\n' % locals()) abs_location = abspath(expanduser(location)) for top, dirs, files in fileutils.walk(abs_location, ignored): if TRACE: logger.debug( 'extract:walk: top: %(top)r dirs: %(dirs)r files: r(files)r' % locals()) if not recurse: if TRACE: drs = set(dirs) for d in dirs[:]: if extractcode.is_extraction_path(d): dirs.remove(d) if TRACE: logger.debug('extract:walk: not recurse: removed dirs:' + repr(drs.symmetric_difference(set(dirs)))) for f in files: loc = join(top, f) if not recurse and extractcode.is_extraction_path(loc): if TRACE: logger.debug( 'extract:walk not recurse: skipped file: %(loc)r' % locals()) continue if not archive.should_extract(loc, kinds, ignore_pattern): if TRACE: logger.debug( 'extract:walk: skipped file: not should_extract: %(loc)r' % locals()) continue target = join(abspath(top), extractcode.get_extraction_path(loc)) if TRACE: logger.debug('extract:target: %(target)r' % locals()) # extract proper for xevent in extract_file(loc, target, kinds): if TRACE: logger.debug('extract:walk:extraction event: %(xevent)r' % locals()) yield xevent if recurse: if TRACE: logger.debug( 'extract:walk: recursing on target: %(target)r' % locals()) for xevent in extract( location=target, kinds=kinds, recurse=recurse, ignore_pattern=ignore_pattern, ): if TRACE: logger.debug( 'extract:walk:recurse:extraction event: %(xevent)r' % locals()) yield xevent
def extract(location, kinds=extractcode.default_kinds, recurse=False): """ Walk and extract any archives found at `location` (either a file or directory). Extract only archives of a kind listed in the `kinds` kind tuple. Return an iterable of ExtractEvent tuples for each extracted archive. This can be used to track extraction progress: - one event is emitted just before extracting an archive. The ExtractEvent warnings and errors are empty. The `done` flag is False. - one event is emitted right after extracting an archive. The ExtractEvent warnings and errors contains warnings and errors if any. The `done` flag is True. If `recurse` is True, extract recursively archives nested inside other archives If `recurse` is false, then do not extract further an already extracted archive identified by the corresponding extract suffix location. Note that while the original file system is walked top-down, breadth-first, if recurse and a nested archive is found, it is extracted to full depth first before resuming the file system walk. """ ignored = partial(ignore.is_ignored, ignores=ignore.default_ignores, unignores={}) if TRACE: logger.debug('extract:start: %(location)r recurse: %(recurse)r\n' % locals()) abs_location = abspath(expanduser(location)) for top, dirs, files in fileutils.walk(abs_location, ignored): if TRACE: logger.debug('extract:walk: top: %(top)r dirs: %(dirs)r files: r(files)r' % locals()) if not recurse: if TRACE: drs = set(dirs) for d in dirs[:]: if extractcode.is_extraction_path(d): dirs.remove(d) if TRACE: logger.debug('extract:walk: not recurse: removed dirs:' + repr(drs.symmetric_difference(set(dirs)))) for f in files: loc = join(top, f) if not recurse and extractcode.is_extraction_path(loc): if TRACE: logger.debug('extract:walk not recurse: skipped file: %(loc)r' % locals()) continue if not archive.should_extract(loc, kinds): if TRACE: logger.debug('extract:walk: skipped file: not should_extract: %(loc)r' % locals()) continue target = join(abspath(top), extractcode.get_extraction_path(loc)) if TRACE: logger.debug('extract:target: %(target)r' % locals()) for xevent in extract_file(loc, target, kinds): if TRACE: logger.debug('extract:walk:extraction event: %(xevent)r' % locals()) yield xevent if recurse: if TRACE: logger.debug('extract:walk: recursing on target: %(target)r' % locals()) for xevent in extract(target, kinds, recurse): if TRACE: logger.debug('extract:walk:recurse:extraction event: %(xevent)r' % locals()) yield xevent