commit: 6eeb75c0327219634379666ebe534a71810132a9
Author: Magnus Granberg <zorry <AT> gentoo <DOT> org>
AuthorDate: Tue May 12 18:37:17 2015 +0000
Commit: Magnus Granberg <zorry <AT> gentoo <DOT> org>
CommitDate: Tue May 12 18:37:17 2015 +0000
URL:
https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=6eeb75c0
Use git to sync instead of emerge --sync
tbc/pym/jobs.py | 6 +--
tbc/pym/sync.py | 142 +++++++++++++++++++++++++++++++---------------------
tbc/pym/updatedb.py | 84 ++++++++++++++++++-------------
3 files changed, 137 insertions(+), 95 deletions(-)
diff --git a/tbc/pym/jobs.py b/tbc/pym/jobs.py
index b75e344..a805a22 100644
--- a/tbc/pym/jobs.py
+++ b/tbc/pym/jobs.py
@@ -2,7 +2,7 @@
# Distributed under the terms of the GNU General Public License v2
from __future__ import print_function
-from tbc.sync import sync_tree
+from tbc.sync import git_repo_sync_main
#from tbc.buildquerydb import add_buildquery_main, del_buildquery_main
from tbc.updatedb import update_db_main
from tbc.sqlquerys import get_config_id, add_tbc_logs, get_jobs,
update_job_list
@@ -47,7 +47,7 @@ def jobs_main(session, config_id):
update_job_list(session, "Runing", job_id)
log_msg = "Job %s is runing." % (job_id,)
add_tbc_logs(session, log_msg, "info", config_id)
- if sync_tree(session) and update_db_main(session,
config_id):
+ if update_db_main(session, git_repo_sync_main(session),
config_id):
update_job_list(session, "Done", job_id)
log_msg = "Job %s is done.." % (job_id,)
add_tbc_logs(session, log_msg, "info",
config_id)
@@ -59,7 +59,7 @@ def jobs_main(session, config_id):
update_job_list(session, "Runing", job_id)
log_msg = "Job %s is runing." % (job_id,)
add_tbc_logs(session, log_msg, "info", config_id)
- if update_db_main(session, config_id):
+ if update_db_main(session, None, config_id):
update_job_list(session, "Done", job_id)
log_msg = "Job %s is done.." % (job_id,)
add_tbc_logs(session, log_msg, "info",
config_id)
diff --git a/tbc/pym/sync.py b/tbc/pym/sync.py
index f1bc56a..2622b25 100644
--- a/tbc/pym/sync.py
+++ b/tbc/pym/sync.py
@@ -10,12 +10,49 @@ import time
from pygit2 import Repository, GIT_MERGE_ANALYSIS_FASTFORWARD,
GIT_MERGE_ANALYSIS_NORMAL, \
GIT_MERGE_ANALYSIS_UP_TO_DATE
-from _emerge.main import emerge_main
from tbc.sqlquerys import get_config_id, add_tbc_logs, get_config_all_info,
get_configmetadata_info
-from tbc.updatedb import update_db_main
from tbc.readconf import read_config_settings
-def sync_tree(session):
+def git_repos_list(session, myportdb):
+ repo_trees_list = myportdb.porttrees
+ for repo_dir in repo_trees_list:
+ repo_dir_list = []
+ repo_dir_list.append(repo_dir)
+ return repo_dir_list
+
+def git_fetch(session, git_repo, config_id):
+ repo = Repository(git_repo)
+ remote = repo.remotes["origin"]
+ remote.fetch()
+ return repo
+
+def git_merge(session, repo, config_id):
+ 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_sync_main(session):
tbc_settings_dict = read_config_settings()
_hostname = tbc_settings_dict['hostname']
_config = tbc_settings_dict['tbc_config']
@@ -23,6 +60,7 @@ def sync_tree(session):
host_config = _hostname +"/" + _config
default_config_root = tbc_settings_dict['tbc_gitrepopath'] + "/" +
host_config + "/"
mysettings = portage.config(config_root = default_config_root)
+ myportdb = portage.portdbapi(mysettings=mysettings)
GuestBusy = True
log_msg = "Waiting for Guest to be idel"
add_tbc_logs(session, log_msg, "info", config_id)
@@ -37,67 +75,59 @@ def sync_tree(session):
Status_list.append(ConfigMetadata.Status)
if not 'Runing' in Status_list:
GuestBusy = False
- time.sleep(30)
+ else:
+ time.sleep(30)
try:
os.remove(mysettings['PORTDIR'] + "/profiles/config/parent")
os.rmdir(mysettings['PORTDIR'] + "/profiles/config")
except:
pass
- tmpcmdline = []
- tmpcmdline.append("--sync")
- tmpcmdline.append("--quiet")
- tmpcmdline.append("--config-root=" + default_config_root)
- log_msg = "Emerge --sync"
+
+ repo_cp_dict = {}
+ for repo_dir in git_repos_list(session, myportdb):
+ 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)
+ out = repo.diff('HEAD', 'HEAD^')
+ repo_diff = out.patch
+ cp_list = []
+ reponame = myportdb.getRepositoryName(repo_dir)
+ for diff_line in repo_diff.splitlines():
+ if re.search("Manifest", diff_line) and
re.search("^diff --git", diff_line):
+ diff_line2 = re.split(' ',
re.sub('[a-b]/', '', re.sub('diff --git ', '', diff_line)))
+ if diff_line2[0] == diff_line2[1] or
"Manifest" in diff_line2[0]:
+ cp = re.sub('/Manifest', '',
diff_line2[0])
+ cp_list.append(cp)
+ else:
+ cp = re.sub('/Manifest', '',
diff_line2[1])
+ cp_list.append(cp)
+ attr['cp_list'] = cp_list
+ repo_cp_dict[reponame] = attr
+ else:
+ log_msg = "Repo is up to date"
+ add_tbc_logs(session, log_msg, "info", config_id)
+
+ # Need to add a config dir so we can use profiles/base for reading the
tree.
+ # We may allready have the dir on local repo when we sync.
+ try:
+ os.mkdir(mysettings['PORTDIR'] + "/profiles/config", 0o777)
+ with open(mysettings['PORTDIR'] + "/profiles/config/parent",
"w") as f:
+ f.write("../base\n")
+ f.close()
+ except:
+ pass
+ log_msg = "Repo sync ... Done."
add_tbc_logs(session, log_msg, "info", config_id)
- fail_sync = emerge_main(args=tmpcmdline)
- if fail_sync:
- log_msg = "Emerge --sync fail!"
- add_tbc_logs(session, log_msg, "error", config_id)
- return False
- else:
- # Need to add a config dir so we can use profiles/base for
reading the tree.
- # We may allready have the dir on local repo when we sync.
- try:
- os.mkdir(mysettings['PORTDIR'] + "/profiles/config",
0o777)
- with open(mysettings['PORTDIR'] +
"/profiles/config/parent", "w") as f:
- f.write("../base\n")
- f.close()
- except:
- pass
- log_msg = "Emerge --sync ... Done."
- add_tbc_logs(session, log_msg, "info", config_id)
- return True
+ return repo_cp_dict
def git_pull(session, git_repo, config_id):
log_msg = "Git pull"
- add_zobcs_logs(session, log_msg, "info", config_id)
- repo = Repository(git_repo + ".git")
- remote = repo.remotes["origin"]
- remote.fetch()
- 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')
+ add_tbc_logs(session, log_msg, "info", config_id)
+ reop = git_fetch(session, git_repo, config_id)
+ git_merge(session, repo, config_id)
log_msg = "Git pull ... Done"
- add_zobcs_logs(session, log_msg, "info", config_id)
+ add_tbc_logs(session, log_msg, "info", config_id)
return True
diff --git a/tbc/pym/updatedb.py b/tbc/pym/updatedb.py
index 90a9e0a..3cbe495 100644
--- a/tbc/pym/updatedb.py
+++ b/tbc/pym/updatedb.py
@@ -15,7 +15,7 @@ from tbc.sqlquerys import add_tbc_logs, get_package_info,
update_repo_db, \
from tbc.check_setup import check_make_conf
from tbc.package import tbc_package
# Get the options from the config file set in tbc.readconf
-from tbc.readconf import get_conf_settings
+from tbc.readconf import read_config_settings
def init_portage_settings(session, config_id, tbc_settings_dict):
# check config setup
@@ -74,44 +74,56 @@ def update_cpv_db(session, config_id, tbc_settings_dict):
break
time.sleep(30)
- mysettings = init_portage_settings(session, config_id,
tbc_settings_dict)
log_msg = "Checking categories, package, ebuilds"
add_tbc_logs(session, log_msg, "info", config_id)
new_build_jobs_list = []
- # Setup portdb, package
+ # Setup settings, portdb and pool
+ mysettings = init_portage_settings(session, config_id,
tbc_settings_dict)
myportdb = portage.portdbapi(mysettings=mysettings)
- repo_list = ()
- repos_trees_list = []
-
+
# Use all cores when multiprocessing
- pool_cores= multiprocessing.cpu_count()
- pool = multiprocessing.Pool(processes=pool_cores)
-
- # Will run some update checks and update package if needed
-
- # Get the repos and update the repos db
- repo_list = myportdb.getRepositories()
- update_repo_db(session, repo_list)
-
- # Close the db for the multiprocessing pool will make new ones
- # and we don't need this one for some time.
-
- # Get the rootdirs for the repos
- repo_trees_list = myportdb.porttrees
- for repo_dir in repo_trees_list:
- repo = myportdb.getRepositoryName(repo_dir)
- repo_dir_list = []
- repo_dir_list.append(repo_dir)
+ pool_cores = multiprocessing.cpu_count()
+ pool = multiprocessing.Pool(processes = pool_cores)
+
+ # Get packages and repo
+ if repo_cp_dict is None:
+ repo_list = []
+ repos_trees_list = []
+
+ # Get the repos and update the repos db
+ repo_list = myportdb.getRepositories()
+ update_repo_db(session, repo_list)
+
+ # Get the rootdirs for the repos
+ repo_trees_list = myportdb.porttrees
+ for repo_dir in repo_trees_list:
+ repo = myportdb.getRepositoryName(repo_dir)
+ repo_dir_list = []
+ repo_dir_list.append(repo_dir)
+
+ # Get the package list from the repo
+ package_list_tree = myportdb.cp_all(trees=repo_dir_list)
+
+ # Run the update package for all package in the list
and in a multiprocessing pool
+ for cp in sorted(package_list_tree):
+ pool.apply_async(update_cpv_db_pool,
(mysettings, myportdb, cp, repo, zobcs_settings_dict, config_id,))
+ # use this when debuging
+ #update_cpv_db_pool(mysettings, myportdb, cp,
repo, zobcs_settings_dict, config_id)
+ else:
+ # Update needed repos and packages in the dict
+ for repo, v in repo_cp_dict.items():
+ # Get the repos and update the repos db
+ repo_list = []
+ repo_list.append(repo)
+ update_repo_db(session, repo_list)
- # Get the package list from the repo
- package_list_tree = myportdb.cp_all(trees=repo_dir_list)
+ # Run the update package for all package in the list
and in a multiprocessing pool
+ for cp in v['cp_list']:
+ pool.apply_async(update_cpv_db_pool,
(mysettings, myportdb, cp, repo, zobcs_settings_dict, config_id,))
+ # use this when debuging
+ #update_cpv_db_pool(mysettings, myportdb, cp,
repo, zobcs_settings_dict, config_id)
- # Run the update package for all package in the list and in a
multiprocessing pool
- for cp in sorted(package_list_tree):
- pool.apply_async(update_cpv_db_pool, (mysettings,
myportdb, cp, repo, tbc_settings_dict, config_id,))
- # use this when debuging
- #update_cpv_db_pool(mysettings, myportdb, cp, repo,
tbc_settings_dict, config_id)
#close and join the multiprocessing pools
pool.close()
@@ -119,17 +131,17 @@ def update_cpv_db(session, config_id, tbc_settings_dict):
log_msg = "Checking categories, package and ebuilds ... done"
add_tbc_logs(session, log_msg, "info", config_id)
-def update_db_main(session, config_id):
+def update_db_main(session, repo_cp_dict, config_id):
# Main
-
+ if repo_cp_dict == {}:
+ return True
# Logging
- reader = get_conf_settings()
- tbc_settings_dict=reader.read_tbc_settings_all()
+ tbc_settings_dict = reader. read_config_settings()
log_msg = "Update db started."
add_tbc_logs(session, log_msg, "info", config_id)
# Update the cpv db
- update_cpv_db(session, config_id, tbc_settings_dict)
+ update_cpv_db(session, repo_cp_dict, config_id, tbc_settings_dict)
log_msg = "Update db ... Done."
add_tbc_logs(session, log_msg, "info", config_id)
return True