Merge pull request #1748 from jberry-suse/repo_checker-arch-filter-state-queries
repo_checker: filter repository state and published checks by relevant architectures.
This commit is contained in:
commit
5558473999
@ -392,31 +392,34 @@ def repository_arch_state(apiurl, project, repository, arch):
|
||||
from osclib.util import sha1_short
|
||||
return sha1_short(http_GET(url).read())
|
||||
|
||||
def repository_state(apiurl, project, repository):
|
||||
def repository_state(apiurl, project, repository, archs=[]):
|
||||
if not len(archs):
|
||||
archs = target_archs(apiurl, project, repository)
|
||||
|
||||
# Unfortunately, the state hash reflects the published state and not the
|
||||
# binaries published in repository. As such request binary list and hash.
|
||||
combined_state = []
|
||||
for arch in target_archs(apiurl, project, repository):
|
||||
for arch in archs:
|
||||
combined_state.append(repository_arch_state(apiurl, project, repository, arch))
|
||||
from osclib.util import sha1_short
|
||||
return sha1_short(combined_state)
|
||||
|
||||
def repositories_states(apiurl, repository_pairs):
|
||||
def repositories_states(apiurl, repository_pairs, archs=[]):
|
||||
states = []
|
||||
|
||||
for project, repository in repository_pairs:
|
||||
states.append(repository_state(apiurl, project, repository))
|
||||
states.append(repository_state(apiurl, project, repository, archs))
|
||||
|
||||
return states
|
||||
|
||||
def repository_published(apiurl, project, repository):
|
||||
def repository_published(apiurl, project, repository, archs=[]):
|
||||
root = ETL.fromstringlist(show_results_meta(
|
||||
apiurl, project, multibuild=True, repository=[repository]))
|
||||
apiurl, project, multibuild=True, repository=[repository], arch=archs))
|
||||
return not len(root.xpath('result[@state!="published" and @state!="unpublished"]'))
|
||||
|
||||
def repositories_published(apiurl, repository_pairs):
|
||||
def repositories_published(apiurl, repository_pairs, archs=[]):
|
||||
for project, repository in repository_pairs:
|
||||
if not repository_published(apiurl, project, repository):
|
||||
if not repository_published(apiurl, project, repository, archs):
|
||||
return (project, repository)
|
||||
|
||||
return True
|
||||
|
@ -64,7 +64,7 @@ class RepoChecker(ReviewBot.ReviewBot):
|
||||
return
|
||||
|
||||
repository_pairs = repository_path_expand(self.apiurl, project, repository)
|
||||
state_hash = self.repository_state(repository_pairs)
|
||||
state_hash = self.repository_state(repository_pairs, False)
|
||||
self.repository_check(repository_pairs, state_hash, False, bool(post_comments))
|
||||
|
||||
def package_comments(self, project, repository):
|
||||
@ -117,6 +117,15 @@ class RepoChecker(ReviewBot.ReviewBot):
|
||||
# Trick to prioritize x86_64.
|
||||
return sorted(archs, reverse=True)
|
||||
|
||||
@memoize(session=True)
|
||||
def target_archs_from_prairs(self, repository_pairs, simulate_merge):
|
||||
if simulate_merge:
|
||||
# Restrict top layer archs to the whitelisted archs from merge layer.
|
||||
return set(target_archs(self.apiurl, repository_pairs[0][0], repository_pairs[0][1])).intersection(
|
||||
set(self.target_archs(repository_pairs[1][0], repository_pairs[1][1])))
|
||||
|
||||
return self.target_archs(repository_pairs[0][0], repository_pairs[0][1])
|
||||
|
||||
@memoize(ttl=60, session=True, add_invalidate=True)
|
||||
def mirror(self, project, repository, arch):
|
||||
"""Call bs_mirrorfull script to mirror packages."""
|
||||
@ -347,24 +356,27 @@ class RepoChecker(ReviewBot.ReviewBot):
|
||||
return filename
|
||||
|
||||
@memoize(ttl=60, session=True)
|
||||
def repository_state(self, repository_pairs):
|
||||
states = repositories_states(self.apiurl, repository_pairs)
|
||||
states.append(str(project_meta_revision(self.apiurl, repository_pairs[0][0])))
|
||||
def repository_state(self, repository_pairs, simulate_merge):
|
||||
archs = self.target_archs_from_prairs(repository_pairs, simulate_merge)
|
||||
states = repositories_states(self.apiurl, repository_pairs, archs)
|
||||
|
||||
if simulate_merge:
|
||||
states.append(str(project_meta_revision(self.apiurl, repository_pairs[0][0])))
|
||||
|
||||
return sha1_short(states)
|
||||
|
||||
@memoize(ttl=60, session=True)
|
||||
def repository_state_last(self, project, repository, pseudometa):
|
||||
if pseudometa:
|
||||
filename = self.project_pseudometa_file_name(project, repository)
|
||||
content = project_pseudometa_file_load(self.apiurl, project, filename)
|
||||
if content:
|
||||
return content.splitlines()[0]
|
||||
else:
|
||||
def repository_state_last(self, project, repository, simulate_merge):
|
||||
if simulate_merge:
|
||||
comments = self.comment_api.get_comments(project_name=project)
|
||||
_, info = self.comment_api.comment_find(comments, '::'.join([self.bot_name, repository]))
|
||||
if info:
|
||||
return info.get('build')
|
||||
else:
|
||||
filename = self.project_pseudometa_file_name(project, repository)
|
||||
content = project_pseudometa_file_load(self.apiurl, project, filename)
|
||||
if content:
|
||||
return content.splitlines()[0]
|
||||
|
||||
return None
|
||||
|
||||
@ -375,10 +387,11 @@ class RepoChecker(ReviewBot.ReviewBot):
|
||||
self.logger.info('checking {}/{}@{}[{}]'.format(
|
||||
project, repository, state_hash, len(repository_pairs)))
|
||||
|
||||
published = repositories_published(self.apiurl, repository_pairs)
|
||||
archs = self.target_archs_from_prairs(repository_pairs, simulate_merge)
|
||||
published = repositories_published(self.apiurl, repository_pairs, archs)
|
||||
|
||||
if not self.force:
|
||||
if state_hash == self.repository_state_last(project, repository, not simulate_merge):
|
||||
if state_hash == self.repository_state_last(project, repository, simulate_merge):
|
||||
self.logger.info('{} build unchanged'.format(project))
|
||||
# TODO keep track of skipped count for cycle summary
|
||||
return None
|
||||
@ -395,14 +408,9 @@ class RepoChecker(ReviewBot.ReviewBot):
|
||||
# Drop non-published repository information and thus reduce to boolean.
|
||||
published = published is True
|
||||
|
||||
if simulate_merge:
|
||||
# Restrict top layer archs to the whitelisted archs from merge layer.
|
||||
archs = set(target_archs(self.apiurl, project, repository)).intersection(
|
||||
set(self.target_archs(repository_pairs[1][0], repository_pairs[1][1])))
|
||||
else:
|
||||
if not simulate_merge:
|
||||
# Top of pseudometa file.
|
||||
comment.append(state_hash)
|
||||
archs = self.target_archs(project, repository)
|
||||
|
||||
if post_comments:
|
||||
# Stores parsed install_check() results grouped by package.
|
||||
@ -561,7 +569,7 @@ class RepoChecker(ReviewBot.ReviewBot):
|
||||
if not isinstance(repository_pairs, list):
|
||||
return repository_pairs
|
||||
|
||||
state_hash = self.repository_state(repository_pairs)
|
||||
state_hash = self.repository_state(repository_pairs, True)
|
||||
if not self.repository_check(repository_pairs, state_hash, True):
|
||||
return None
|
||||
|
||||
@ -603,7 +611,7 @@ class RepoChecker(ReviewBot.ReviewBot):
|
||||
if not isinstance(repository_pairs, list):
|
||||
return repository_pairs
|
||||
|
||||
state_hash = self.repository_state(repository_pairs)
|
||||
state_hash = self.repository_state(repository_pairs, True)
|
||||
if not self.repository_check(repository_pairs, state_hash, True):
|
||||
return None
|
||||
|
||||
@ -618,7 +626,7 @@ class RepoChecker(ReviewBot.ReviewBot):
|
||||
if not isinstance(repository_pairs, list):
|
||||
return repository_pairs
|
||||
|
||||
state_hash = self.repository_state(repository_pairs)
|
||||
state_hash = self.repository_state(repository_pairs, True)
|
||||
if not self.repository_check(repository_pairs, state_hash, True):
|
||||
return None
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user