# Copyright: 2005 Gentoo Foundation
# Author(s): Brian Harring (ferringb@gentoo.org)
# License: GPL2
# $Id$

class CacheError(Exception):	pass

class InitializationError(CacheError):
	def __init__(self, class_name, error):
		self.error, self.class_name = error, class_name
	def __str__(self):
		return "Creation of instance %s failed due to %s" % \
			(self.class_name, str(self.error))


class CacheCorruption(CacheError):
	def __init__(self, key, ex):
		self.key, self.ex = key, ex
	def __str__(self):
		return "%s is corrupt: %s" % (self.key, str(self.ex))


class GeneralCacheCorruption(CacheError):
	def __init__(self,ex):	self.ex = ex
	def __str__(self):	return "corruption detected: %s" % str(self.ex)


class InvalidRestriction(CacheError):
	def __init__(self, key, restriction, exception=None):
		if exception == None:	exception = ''
		self.key, self.restriction, self.ex = key, restriction, ex
	def __str__(self):
		return "%s:%s is not valid: %s" % \
			(self.key, self.restriction, str(self.ex))


class ReadOnlyRestriction(CacheError):
	def __init__(self, info=''):
		self.info = info
	def __str__(self):
		return "cache is non-modifiable"+str(self.info)

class StatCollision(CacheError):
	"""
	If the content of a cache entry changes and neither the file mtime nor
	size changes, it will prevent rsync from detecting changes. Cache backends
	may raise this exception from _setitem() if they detect this type of stat
	collision. See bug #139134.
	"""
	def __init__(self, key, filename, mtime, size):
		self.key = key
		self.filename = filename
		self.mtime = mtime
		self.size = size

	def __str__(self):
		return "%s has stat collision with size %s and mtime %s" % \
			(self.key, self.size, self.mtime)

	def __repr__(self):
		return "portage.cache.cache_errors.StatCollision(%s)" % \
			(', '.join((repr(self.key), repr(self.filename),
			repr(self.mtime), repr(self.size))),)
