blob: f83c42b842494a186b755f0a0d844bc21e09bb9b [file] [log] [blame]
# Copyright 2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
from portage.exception import PortageException
from portage.util.futures.compat_coroutine import coroutine
class RepoStorageException(PortageException):
"""
Base class for exceptions raise by RepoStorageInterface.
"""
class RepoStorageInterface(object):
"""
Abstract repository storage interface.
Implementations can assume that the repo.location directory already
exists with appropriate permissions (SyncManager handles this).
TODO: Add a method to check of a previous uncommitted update, which
typically indicates a verification failure:
https://bugs.gentoo.org/662386
"""
def __init__(self, repo, spawn_kwargs):
"""
@param repo: repository configuration
@type repo: portage.repository.config.RepoConfig
@param spawn_kwargs: keyword arguments supported by the
portage.process.spawn function
@type spawn_kwargs: dict
"""
raise NotImplementedError
@coroutine
def init_update(self):
"""
Create an update directory as a destination to sync updates to.
The directory will be populated with files from the previous
immutable snapshot, if available. Note that this directory
may contain hardlinks that reference files in the previous
immutable snapshot, so these files should not be modified
(tools like rsync and git normally break hardlinks when
files need to be modified).
@rtype: str
@return: path of directory to update, populated with files from
the previous snapshot if available
"""
raise NotImplementedError
@property
def current_update(self):
"""
Get the current update directory which would have been returned
from the most recent call to the init_update method. This raises
RepoStorageException if the init_update method has not been
called.
@rtype: str
@return: path of directory to update
"""
raise NotImplementedError
@coroutine
def commit_update(self):
"""
Commit the current update directory, so that is becomes the
latest immutable snapshot.
"""
raise NotImplementedError
@coroutine
def abort_update(self):
"""
Delete the current update directory. If there was not an update
in progress, or it has already been committed, then this has
no effect.
"""
raise NotImplementedError
@coroutine
def garbage_collection(self):
"""
Remove expired snapshots.
"""
raise NotImplementedError