Source code for pkgcore.util.file_type
__all__ = ("file_identifier",)
from snakeoil.compatibility import IGNORED_EXCEPTIONS
from snakeoil.klass import jit_attr
from snakeoil.process.spawn import spawn_get_output
[docs]
class file_identifier:
def __init__(self, force_binary=False):
if force_binary:
self.func = self._fallback_file
def __call__(self, obj):
if not isinstance(obj, str):
obj = obj.path
return self.func(obj)
@jit_attr
def func(self):
try:
import magic
except ImportError:
return self._fallback_file
if hasattr(magic, "MAGIC_NONE"):
# <5.05 of file
magic_const = magic.MAGIC_NONE
else:
magic_const = magic.NONE
try:
obj = magic.open(magic_const)
ret = obj.load()
if ret == 0:
return obj.file
except IGNORED_EXCEPTIONS:
raise
except Exception:
pass # POS of library.
return self._fallback_file
@staticmethod
def _fallback_file(path):
ret, out = spawn_get_output(["file", path])
if ret != 0:
raise ValueError(f"file output was non zero- ret:{ret!r} out:{out!r}")
out = "".join(out)
if out.startswith(path):
out = out[len(path) :]
if out.startswith(":"):
out = out[1:]
return out