commit: e7b4bfaf66f3a07ed7f32f852e297e45b79382d7 Author: Magnus Granberg <zorry <AT> gentoo <DOT> org> AuthorDate: Thu Jun 11 16:09:22 2015 +0000 Commit: Magnus Granberg <zorry <AT> gentoo <DOT> org> CommitDate: Thu Jun 11 16:09:22 2015 +0000 URL: https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=e7b4bfaf
use git-python instead of pygit2 tbc/pym/sync.py | 81 ++++++++++++++++++++------------------------------------- 1 file changed, 28 insertions(+), 53 deletions(-) diff --git a/tbc/pym/sync.py b/tbc/pym/sync.py index cc29f8e..e9a2aca 100644 --- a/tbc/pym/sync.py +++ b/tbc/pym/sync.py @@ -8,54 +8,30 @@ import errno import sys import time import re -from pygit2 import Repository, GIT_MERGE_ANALYSIS_FASTFORWARD, GIT_MERGE_ANALYSIS_NORMAL, \ - GIT_MERGE_ANALYSIS_UP_TO_DATE +import git from tbc.sqlquerys import get_config_id, add_logs, get_config_all_info, get_configmetadata_info from tbc.readconf import read_config_settings -def git_repos_list(session, myportdb): - # get repo tree from portage +def git_repos_list(myportdb): repo_trees_list = myportdb.porttrees repo_dir_list = [] - # append repo dirs to a list for repo_dir in repo_trees_list: repo_dir_list.append(repo_dir) return repo_dir_list -def git_fetch(session, git_repo, config_id): - # setup repo, fetch it and return repo - repo = Repository(git_repo) - remote = repo.remotes["origin"] - remote.fetch() - return repo +def git_fetch(repo): + repouptodate = True + remote = git.remote.Remote(repo, 'origin') + info_list = remote.fetch() + local_commit = repo.commit() + remote_commit = info_list[0].commit + if local_commit.hexsha != remote_commit.hexsha: + repouptodate = False + return info_list, repouptodate -def git_merge(session, repo, config_id): - # check what of type merge we need to do and do it - remote_master_id = repo.lookup_reference('refs/remotes/origin/master').target - merge_result, _ = repo.merge_analysis(remote_master_id) - if merge_result & GIT_MERGE_ANALYSIS_UP_TO_DATE: - log_msg = "Repo is up to date" - add_zobcs_logs(session, log_msg, "info", config_id) - elif merge_result & GIT_MERGE_ANALYSIS_FASTFORWARD: - repo.checkout_tree(repo.get(remote_master_id)) - master_ref = repo.lookup_reference('refs/heads/master') - master_ref.set_target(remote_master_id) - repo.head.set_target(remote_master_id) - elif merge_result & GIT_MERGE_ANALYSIS_NORMAL: - repo.merge(remote_master_id) - assert repo.index.conflicts is None, 'Conflicts, ahhhh!' - user = repo.default_signature - tree = repo.index.write_tree() - commit = repo.create_commit('HEAD', - user, - user, - 'Merge!', - tree, - [repo.head.target, remote_master_id]) - repo.state_cleanup() - else: - raise AssertionError('Unknown merge analysis result') +def git_merge(repo, info): + repo.git.merge(info.commit) def git_sync_main(session): tbc_settings_dict = read_config_settings() @@ -93,18 +69,15 @@ def git_sync_main(session): # check git diffs witch Manifests get updated and pass that to a dict # fetch and merge the repo repo_cp_dict = {} - for repo_dir in git_repos_list(session, myportdb): + for repo_dir in git_repos_list(myportdb): + reponame = myportdb.getRepositoryName(repo_dir) attr = {} - repo = git_fetch(session, repo_dir, config_id) - remote_master_id = repo.lookup_reference('refs/remotes/origin/master').target - merge_result, _ = repo.merge_analysis(remote_master_id) - if not merge_result & GIT_MERGE_ANALYSIS_UP_TO_DATE: - git_merge(session, repo, config_id) - repo_diff = repo.diff('HEAD', 'HEAD^') + repo = git.Repo(repo_dir) + info_list, repouptodate = git_fetch(repo) + if not repouptodate: cp_list = [] - reponame = myportdb.getRepositoryName(repo_dir) - for diff_line in repo_diff.patch.splitlines(): - if re.search("Manifest", diff_line) and re.search("^diff --git", diff_line): + for diff_line in repo.git.diff('HEAD^').splitlines(): + if re.search("^diff --git.*/Manifest", diff_line): diff_line2 = re.split(' b/', re.sub('diff --git', '', diff_line)) diff_line3 = re.sub(' a/', '', diff_line2[0]) if diff_line3 == diff_line2[1] or "Manifest" in diff_line3: @@ -115,8 +88,9 @@ def git_sync_main(session): cp_list.append(cp) attr['cp_list'] = cp_list repo_cp_dict[reponame] = attr + git_merge(repo, info_list[0]) else: - log_msg = "Repo is up to date" + log_msg = "Repo %s is up to date" % (reponame) add_logs(session, log_msg, "info", config_id) # Need to add a clone of profiles/base for reading the tree @@ -130,14 +104,15 @@ def git_sync_main(session): log_msg = "Repo sync ... Done." add_logs(session, log_msg, "info", config_id) - return repo_cp_dict + return repo_cp_dict -def git_pull(session, git_repo, config_id): - # do a gitt pull +def git_pull(session, repo_dir, config_id): log_msg = "Git pull" add_logs(session, log_msg, "info", config_id) - repo = git_fetch(session, git_repo, config_id) - git_merge(session, repo, config_id) + repo = git.Repo(repo_dir) + info_list, repouptodate = git_fetch(repo) + if not repouptodate: + git_merge(repo, info_list[0]) log_msg = "Git pull ... Done" add_logs(session, log_msg, "info", config_id) return True