| import os |
| import shutil |
| |
| |
| # Repo() |
| # |
| # Abstract class providing scaffolding for |
| # generating data to be used with various sources |
| # |
| # Args: |
| # directory (str): The base temp directory for the test |
| # subdir (str): The subdir for the repo, in case there is more than one |
| # |
| class Repo(): |
| |
| def __init__(self, directory, subdir='repo'): |
| |
| # The working directory for the repo object |
| # |
| self.directory = os.path.abspath(directory) |
| |
| # The directory the actual repo will be stored in |
| self.repo = os.path.join(self.directory, subdir) |
| |
| os.makedirs(self.repo, exist_ok=True) |
| |
| # create(): |
| # |
| # Create a repository in self.directory and add the initial content |
| # |
| # Args: |
| # directory: A directory with content to commit |
| # |
| # Returns: |
| # (smth): A new ref corresponding to this commit, which can |
| # be passed as the ref in the Repo.source_config() API. |
| # |
| def create(self, directory): |
| pass |
| |
| # source_config() |
| # |
| # Args: |
| # ref (smth): An optional abstract ref object, usually a string. |
| # |
| # Returns: |
| # (dict): A configuration which can be serialized as a |
| # source when generating an element file on the fly |
| # |
| def source_config(self, ref=None): |
| pass |
| |
| # copy_directory(): |
| # |
| # Copies the content of src to the directory dest |
| # |
| # Like shutil.copytree(), except dest is expected |
| # to exist. |
| # |
| # Args: |
| # src (str): The source directory |
| # dest (str): The destination directory |
| # |
| def copy_directory(self, src, dest): |
| for filename in os.listdir(src): |
| src_path = os.path.join(src, filename) |
| dest_path = os.path.join(dest, filename) |
| if os.path.isdir(src_path): |
| shutil.copytree(src_path, dest_path) |
| else: |
| shutil.copy2(src_path, dest_path) |
| |
| # copy(): |
| # |
| # Creates a copy of this repository in the specified |
| # destination. |
| # |
| # Args: |
| # dest (str): The destination directory |
| # |
| # Returns: |
| # (Repo): A Repo object for the new repository. |
| def copy(self, dest): |
| subdir = self.repo[len(self.directory):].lstrip(os.sep) |
| new_dir = os.path.join(dest, subdir) |
| os.makedirs(new_dir, exist_ok=True) |
| self.copy_directory(self.repo, new_dir) |
| repo_type = type(self) |
| new_repo = repo_type(dest, subdir) |
| return new_repo |