Source code for pkgcore.cache.fs_template

"""
template for fs based backends
"""

__all__ = ("FsBased",)

import os

from snakeoil.osutils import ensure_dirs, pjoin

from ..os_data import portage_gid
from . import base


[docs] class FsBased(base): """Template wrapping fs needed options. Provides _ensure_access as a way to attempt to ensure files have the specified owners/perms. """ def __init__(self, location, label=None, **config): """ throws InitializationError if needs args aren't specified :keyword gid: defaults to :obj:`pkgcore.os_data.portage_gid`, gid to force all entries to :keyword perms: defaults to 0665, mode to force all entries to""" for x, y in (("gid", portage_gid), ("perms", 0o664)): if x in config: setattr(self, f"_{x}", config[x]) del config[x] else: setattr(self, f"_{x}", y) super().__init__(**config) if label is not None: location = pjoin(location, label.lstrip(os.path.sep)) self.location = location self._mtime_used = "mtime" == self.chf_type __init__.__doc__ = "\n".join( x.lstrip() for x in __init__.__doc__.split("\n") + [ y.lstrip().replace("@param", "@keyword") for y in base.__init__.__doc__.split("\n") if "@param" in y ] ) def _ensure_access(self, path, mtime=None): """Ensure access to a path. :param mtime: if specified change mtime to this value. :return: C{False} if unable to guarantee access, C{True} otherwise. """ try: os.chown(path, -1, self._gid) os.chmod(path, self._perms) if mtime is not None: mtime = int(mtime) os.utime(path, (mtime, mtime)) except EnvironmentError: return False return True def _ensure_dirs(self, path=None): """Make sure a path relative to C{self.location} exists.""" if path is not None: path = pjoin(self.location, os.path.dirname(path)) else: path = self.location return ensure_dirs(path, mode=0o775, minimal=False)