|
|
"""
|
|
|
A path/directory class.
|
|
|
"""
|
|
|
|
|
|
import os
|
|
|
import shutil
|
|
|
import logging
|
|
|
|
|
|
from rhodecode.lib.dbmigrate.migrate import exceptions
|
|
|
from rhodecode.lib.dbmigrate.migrate.versioning.config import *
|
|
|
from rhodecode.lib.dbmigrate.migrate.versioning.util import KeyedInstance
|
|
|
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
class Pathed(KeyedInstance):
|
|
|
"""
|
|
|
A class associated with a path/directory tree.
|
|
|
|
|
|
Only one instance of this class may exist for a particular file;
|
|
|
__new__ will return an existing instance if possible
|
|
|
"""
|
|
|
parent = None
|
|
|
|
|
|
@classmethod
|
|
|
def _key(cls, path):
|
|
|
return str(path)
|
|
|
|
|
|
def __init__(self, path):
|
|
|
self.path = path
|
|
|
if self.__class__.parent is not None:
|
|
|
self._init_parent(path)
|
|
|
|
|
|
def _init_parent(self, path):
|
|
|
"""Try to initialize this object's parent, if it has one"""
|
|
|
parent_path = self.__class__._parent_path(path)
|
|
|
self.parent = self.__class__.parent(parent_path)
|
|
|
log.debug("Getting parent %r:%r", self.__class__.parent, parent_path)
|
|
|
self.parent._init_child(path, self)
|
|
|
|
|
|
def _init_child(self, child, path):
|
|
|
"""Run when a child of this object is initialized.
|
|
|
|
|
|
Parameters: the child object; the path to this object (its
|
|
|
parent)
|
|
|
"""
|
|
|
|
|
|
@classmethod
|
|
|
def _parent_path(cls, path):
|
|
|
"""
|
|
|
Fetch the path of this object's parent from this object's path.
|
|
|
"""
|
|
|
# os.path.dirname(), but strip directories like files (like
|
|
|
# unix basename)
|
|
|
#
|
|
|
# Treat directories like files...
|
|
|
if path[-1] == '/':
|
|
|
path = path[:-1]
|
|
|
ret = os.path.dirname(path)
|
|
|
return ret
|
|
|
|
|
|
@classmethod
|
|
|
def require_notfound(cls, path):
|
|
|
"""Ensures a given path does not already exist"""
|
|
|
if os.path.exists(path):
|
|
|
raise exceptions.PathFoundError(path)
|
|
|
|
|
|
@classmethod
|
|
|
def require_found(cls, path):
|
|
|
"""Ensures a given path already exists"""
|
|
|
if not os.path.exists(path):
|
|
|
raise exceptions.PathNotFoundError(path)
|
|
|
|
|
|
def __str__(self):
|
|
|
return self.path
|
|
|
|