Source code for pyscaffold.repo

# -*- coding: utf-8 -*-
"""
Functionality for working with a git repository
"""

from os.path import isdir
from os.path import join as join_path

from . import shell, utils
from .exceptions import ShellCommandException


[docs]def git_tree_add(struct, prefix="", **kwargs): """Adds recursively a directory structure to git Args: struct (dict): directory structure as dictionary of dictionaries prefix (str): prefix for the given directory structure Additional keyword arguments are passed to the :obj:`git <pyscaffold.shell.ShellCommand>` callable object. """ for name, content in struct.items(): if isinstance(content, str): shell.git("add", join_path(prefix, name), **kwargs) elif isinstance(content, dict): git_tree_add(struct[name], prefix=join_path(prefix, name), **kwargs) elif content is None: shell.git("add", join_path(prefix, name), **kwargs) else: raise RuntimeError( "Don't know what to do with content type " "{type}.".format(type=type(content)) )
[docs]def add_tag(project, tag_name, message=None, **kwargs): """Add an (annotated) tag to the git repository. Args: project (str): path to the project tag_name (str): name of the tag message (str): optional tag message Additional keyword arguments are passed to the :obj:`git <pyscaffold.shell.ShellCommand>` callable object. """ with utils.chdir(project): if message is None: shell.git("tag", tag_name, **kwargs) else: shell.git("tag", "-a", tag_name, "-m", message, **kwargs)
[docs]def init_commit_repo(project, struct, **kwargs): """Initialize a git repository Args: project (str): path to the project struct (dict): directory structure as dictionary of dictionaries Additional keyword arguments are passed to the :obj:`git <pyscaffold.shell.ShellCommand>` callable object. """ with utils.chdir(project, pretend=kwargs.get("pretend")): shell.git("init", **kwargs) git_tree_add(struct[project], **kwargs) shell.git("commit", "-m", "Initial commit", **kwargs)
[docs]def is_git_repo(folder): """Check if a folder is a git repository Args: folder (str): path """ if not isdir(folder): return False with utils.chdir(folder): try: shell.git("rev-parse", "--git-dir") except ShellCommandException: return False return True
[docs]def get_git_root(default=None): """Return the path to the top-level of the git repository or *default*. Args: default (str): if no git root is found, default is returned Returns: str: top-level path or *default* """ if shell.git is None: return default try: return next(shell.git("rev-parse", "--show-toplevel")) except ShellCommandException: return default