Module jumpscale.clients.git.git

Expand source code
import git
from jumpscale.clients.base import Client
from jumpscale.core.base import fields
from jumpscale.loader import j


class GitClient(Client):
    path = fields.String()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.__repo = None

    @property
    def repo(self):
        if not self.__repo:
            self.__repo = git.Repo(self.path)
        return self.__repo

    def set_remote_url(self, url, remote_name="origin"):
        remote = self.repo.remote(remote_name)
        remote.set_url(url)

    @property
    def remote_url(self):
        return self.repo.remote().url

    @property
    def branch_name(self):
        return self.repo.active_branch.name

    def get_modified_files(self):
        """returns local changes in the repo

        Returns:
            dict: dict containing different types of changes(check git status man)
        """
        modified_files = self.repo.git.status(porcelain=True).splitlines()
        result_format = {}
        for mod_file in modified_files:
            if "??" in mod_file:
                continue
            state, file_name = mod_file.split()
            result_format.setdefault(state, [])
            result_format[state].append(file_name)
        untracked_files = self.repo.untracked_files
        if untracked_files:
            result_format["N"] = untracked_files
        return result_format

    def pull(self):
        """Pulls from origin

        Raises:
            j.exceptions.Input: if there is locaal changes
        """
        if self.get_modified_files():
            raise j.exceptions.Input(message="Cannot pull:{}, files waiting to commit".format(self.path))
        self.repo.git.pull()

    def commit(self, message, add_all=True):
        """adds a commit

        Args:
            message (str): commit message
            add_all (bool, optional): will add all changes before commiting. Defaults to True.

        Returns:
            [type]: [description]
        """
        if add_all and self.get_modified_files():
            self.repo.git.add("-A")
        if self.repo.index.diff("HEAD"):
            return self.repo.index.commit(message)

Classes

class GitClient (*args, **kwargs)

A simple attribute-based namespace.

SimpleNamespace(**kwargs)

base class implementation for any class with fields which supports getting/setting raw data for any instance fields.

any instance can have an optional name and a parent.

class Person(Base):
    name = fields.String()
    age = fields.Float()

p = Person(name="ahmed", age="19")
print(p.name, p.age)

Args

parent_ : Base, optional
parent instance. Defaults to None.
instance_name_ : str, optional
instance name. Defaults to None.
**values
any given field values to initiate the instance with
Expand source code
class GitClient(Client):
    path = fields.String()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.__repo = None

    @property
    def repo(self):
        if not self.__repo:
            self.__repo = git.Repo(self.path)
        return self.__repo

    def set_remote_url(self, url, remote_name="origin"):
        remote = self.repo.remote(remote_name)
        remote.set_url(url)

    @property
    def remote_url(self):
        return self.repo.remote().url

    @property
    def branch_name(self):
        return self.repo.active_branch.name

    def get_modified_files(self):
        """returns local changes in the repo

        Returns:
            dict: dict containing different types of changes(check git status man)
        """
        modified_files = self.repo.git.status(porcelain=True).splitlines()
        result_format = {}
        for mod_file in modified_files:
            if "??" in mod_file:
                continue
            state, file_name = mod_file.split()
            result_format.setdefault(state, [])
            result_format[state].append(file_name)
        untracked_files = self.repo.untracked_files
        if untracked_files:
            result_format["N"] = untracked_files
        return result_format

    def pull(self):
        """Pulls from origin

        Raises:
            j.exceptions.Input: if there is locaal changes
        """
        if self.get_modified_files():
            raise j.exceptions.Input(message="Cannot pull:{}, files waiting to commit".format(self.path))
        self.repo.git.pull()

    def commit(self, message, add_all=True):
        """adds a commit

        Args:
            message (str): commit message
            add_all (bool, optional): will add all changes before commiting. Defaults to True.

        Returns:
            [type]: [description]
        """
        if add_all and self.get_modified_files():
            self.repo.git.add("-A")
        if self.repo.index.diff("HEAD"):
            return self.repo.index.commit(message)

Ancestors

Instance variables

var branch_name
Expand source code
@property
def branch_name(self):
    return self.repo.active_branch.name
var path

getter method this property

will call _get_value, which would if the value is already defined and will get the default value if not

Returns

any
the field value
Expand source code
def getter(self):
    """
    getter method this property

    will call `_get_value`, which would if the value is already defined
    and will get the default value if not

    Returns:
        any: the field value
    """
    return self._get_value(name, field)
var remote_url
Expand source code
@property
def remote_url(self):
    return self.repo.remote().url
var repo
Expand source code
@property
def repo(self):
    if not self.__repo:
        self.__repo = git.Repo(self.path)
    return self.__repo

Methods

def commit(self, message, add_all=True)

adds a commit

Args

message : str
commit message
add_all : bool, optional
will add all changes before commiting. Defaults to True.

Returns

[type]
[description]
Expand source code
def commit(self, message, add_all=True):
    """adds a commit

    Args:
        message (str): commit message
        add_all (bool, optional): will add all changes before commiting. Defaults to True.

    Returns:
        [type]: [description]
    """
    if add_all and self.get_modified_files():
        self.repo.git.add("-A")
    if self.repo.index.diff("HEAD"):
        return self.repo.index.commit(message)
def get_modified_files(self)

returns local changes in the repo

Returns

dict
dict containing different types of changes(check git status man)
Expand source code
def get_modified_files(self):
    """returns local changes in the repo

    Returns:
        dict: dict containing different types of changes(check git status man)
    """
    modified_files = self.repo.git.status(porcelain=True).splitlines()
    result_format = {}
    for mod_file in modified_files:
        if "??" in mod_file:
            continue
        state, file_name = mod_file.split()
        result_format.setdefault(state, [])
        result_format[state].append(file_name)
    untracked_files = self.repo.untracked_files
    if untracked_files:
        result_format["N"] = untracked_files
    return result_format
def pull(self)

Pulls from origin

Raises

j.exceptions.Input
if there is locaal changes
Expand source code
def pull(self):
    """Pulls from origin

    Raises:
        j.exceptions.Input: if there is locaal changes
    """
    if self.get_modified_files():
        raise j.exceptions.Input(message="Cannot pull:{}, files waiting to commit".format(self.path))
    self.repo.git.pull()
def set_remote_url(self, url, remote_name='origin')
Expand source code
def set_remote_url(self, url, remote_name="origin"):
    remote = self.repo.remote(remote_name)
    remote.set_url(url)

Inherited members