コード例 #1
0
ファイル: repo.py プロジェクト: gitter-badger/GatherGit
class Repo(dict):
    """Represents a repository/ module
    """

    def __init__(self):
        """
        Constructor initializing instance variables
        """
        dict.__init__(self)
        self['name'] = ''
        self['defaults'] = {}
        self['branches'] = {}
        self['updates'] = {}
        self['target'] = '/tmp/gitgather-deployment'
        self.git = GitRepo()

    def add_branches(self, branches, deployment_settings):
        """
        Add branches to our Repo object
        """
        for branch, _branch_settings in branches.items():
            branch_name = str(branch)
            branch_settings = _branch_settings

            # REF
            if isinstance(_branch_settings, str) or isinstance(_branch_settings, float) or isinstance(_branch_settings, int):
                branch_settings = {'ref': str(_branch_settings)}
            if not isinstance(branch_settings.get('ref'), str):
                branch_settings['ref'] = str(branch_settings['ref'])

            if branch_name not in self['branches'].keys():
                self['branches'][branch_name] = branch_settings
            else:
                self['branches'][branch_name].update(branch_settings)

            # REPO
            if 'repo' not in self['branches'][branch_name].keys():
                self['branches'][branch_name]['repo'] = self.get('defaults').get('repo', self['name'])

            # URL
            if 'url' not in self['branches'][branch_name].keys():
                url = self.get('defaults').get('url', deployment_settings.get('defaults', {}).get('url'))
                if url is None:
                    base_url = self['branches'][branch_name].get('base_url', self.get('defaults').get(
                        'base_url', deployment_settings.get('defaults', {}).get('base_url')))
                    url = '{}/{}'.format(base_url, self['branches'][branch_name]['repo'])

                self['branches'][branch_name]['url'] = url

    def sync(self, local_branch, remote_branch, root=''):
        """
        Sync/ update/ deploy a repository
        """
        src_path = '{}/{}'.format(self.git.get_path(), root)
        dst_path = '{}/{}/{}/'.format(self.get('target'), local_branch, self.get('name'))

        if not os.path.isdir(dst_path):
            os.makedirs(dst_path)
        if not src_path.endswith('/'):
            src_path += '/'
        if not dst_path.endswith('/'):
            dst_path += '/'

        self.git.checkout(remote_branch)

        print(rsync('--verbose', '--archive', '--checksum', '--delete', '--exclude=.git/', src_path, dst_path))  # TODO