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 notReturns
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