def sync_repos(self, sync_all=False): if sync_all: for deployment_name, repolist in Helper.sorted_dict(self).items(): for repo_name, repo in Helper.sorted_dict(repolist).items(): for branch_name, branch_settings in Helper.sorted_dict(repo.get('branches')).items(): pass # TODO else: pending_updates = [] for deployment_name, repolist in Helper.sorted_dict(self).items(): for repo_name, repo in Helper.sorted_dict(repolist).items(): if repo.get('updates').get('updated_refs'): pending_updates.append(repo.get('updates')) if pending_updates: for pending_update in pending_updates: cache_name = pending_update.get('cache').name for updated_ref in pending_update.get('updated_refs'): repo_name = updated_ref.get('repo') repo_url = updated_ref.get('url') repo_ref = updated_ref.get('ref') for deployment_name, repolist in Helper.sorted_dict(self).items(): for repo_name, repo in Helper.sorted_dict(repolist).items(): for branch_name, branch_settings in Helper.sorted_dict(repo.get('branches')).items(): if repo_url == branch_settings.get('url') and \ repo_ref == branch_settings.get('ref') and \ cache_name == branch_settings.get('cache', repo.get('defaults').get('cache')): repo.sync(branch_name, repo_ref, branch_settings.get('root', ''))
def update(self, repo): """ Update the cache, e.g. the Git repository in the file system """ self.repo = repo branches = self.repo.get('branches') changed_refs = [] for branch_name, branch_settings in Helper.sorted_dict(branches).items(): repo_path = '{}/{}'.format(self.path, branch_settings.get('repo')) repo['remotes'] = {'origin': {'url': branch_settings.get('url')}} self.repo.git.set_path(repo_path) self.repo.git.init() self.repo.git.add_remotes(repo['remotes']) update_info = self.repo.git.update_ref(branch_settings.get('ref'), 'origin', branch_settings.get('repo')) if update_info.get('updated'): changed_refs.append(update_info) return changed_refs
def main(): version = '0.0.1' program_name = 'gathergit' parser = argparse.ArgumentParser(prog=program_name, description='A description') # general args parser.add_argument('-V', action='version', version='%(prog)s {version}'.format(version=version)) parser.add_argument('--confdir', action='store', dest='confdir', help='directory to search for configuration files (default: config/)', default='config/') parser.add_argument('--all', action='store_true', dest='sync_all', help='Initialize, update and synchronize ALL repositories', default=False) parser_results = parser.parse_args() confdir = parser_results.confdir sync_all = parser_results.sync_all # config parsing cfg_parser = ConfigParser(confdir) config = cfg_parser.dump() # logging logconfig = config.get('settings', {}).get('logging', {}) logger = Helper().create_logger(program_name, logconfig) # let's start working now logger.debug('Starting new instance of %s', program_name) logger.debug('Raw configuration: %s', config) # collecting deployment configuration deployments = {} repolists = {} repoindex = Repoindex() for deployment_name, deployment_settings in config.get('deployments', {}).items(): repos = deployment_settings.get('repos') if repos is None: continue deployments[deployment_name] = {'target': deployment_settings.get('target'), 'defaults': deployment_settings.get('defaults', {})} if deployment_name not in repolists.keys(): repolists[deployment_name] = {} repolists[deployment_name].update(repos) # updating caches for deployment_name, repolist in Helper.sorted_dict(repolists).items(): for repoid, repo_settings in Helper.sorted_dict(repolist).items(): repo_name = repo_settings.get('name', repoid) repo_defaults = repo_settings.get('defaults', {}) branches = repo_settings.get('branches') if branches is None: logger.info('Skipping repo %s of deployment definition %s, is doesn\'t have any branches defined', repo_name, deployment_name) continue # adding repo to repoindex repo = Repo() repo['name'] = repo_name repo['defaults'] = repo_defaults repo['target'] = deployments[deployment_name].get('target') repo.add_branches(branches, deployments[deployment_name]) repoindex.add_repo(deployment_name, repoid, repo) cache_name = repoindex[deployment_name][repoid].get('defaults').get('cache') cache_settings = config.get('settings').get('caches').get(cache_name) cache = Cache(name=cache_name, settings=cache_settings) cache.init() updated_refs = cache.update(repoindex[deployment_name][repoid]) if updated_refs: repoindex[deployment_name][repoid]['updates'] = {'updated_refs': updated_refs, 'cache': cache} elif sync_all: repoindex[deployment_name][repoid]['updates'] = {'cache': cache} repoindex.sync_repos(sync_all) # Everything is done, closing now logger.debug('Shutting down..')