Improve check phase in staging plugin

It now checks not only for changed packages but also for changes in build
state.
This commit is contained in:
Michal Hrusecky 2013-12-10 14:59:26 +01:00
parent ab06ddf6e0
commit deecc15713

View File

@ -49,6 +49,56 @@ def _staging_check(self, project, check_everything, opts):
print >>sys.stderr, 'Error: Has local modifications: %s/%s'%(project, pkg)
ret = 1
continue
if ret == 1:
print >>sys.stderr, "Error: Check for local changes failed"
else:
print "Check for local changes passed"
# Check for regressions
print "Getting build status"
# Get staging project results
f = show_prj_results_meta(apiurl, project)
root = ET.fromstring(''.join(f))
# Get parent project results
f = show_prj_results_meta(apiurl, re.sub(r":Staging:[^:]*$", "", project))
p_root = ET.fromstring(''.join(f))
print "Comparing build statuses"
# Iterate through all repos/archs
if root.find('result') != None:
for results in root.findall('result'):
if results.get("state") not in [ "published", "unpublished" ]:
print >>sys.stderr, "Warning: Building not finished yet for %s/%s (%s)!"%(results.get("repository"),results.get("arch"),results.get("state"))
ret |= 2
# Find coresponding set of results in parent project
p_results = p_root.find("result[@repository='%s'][@arch='%s']"%(results.get("repository"),results.get("arch")))
if p_results == None:
print >>sys.stderr, "Error: Inconsistent setup!"
ret |= 4
else:
# Iterate through packages
for node in results:
result = node.get("code")
# Skip not rebuilt
if result in [ "blocked", "building", "disabled" "excluded", "finished", "unpublished", "published" ]:
next
# Get status of package in parent project
p_node = p_results.find("status[@package='%s']"%(node.get("package")))
if p_node == None:
p_result = None
else:
p_result = p_node.get("code")
# Skip packages not built in parent project
if p_result in [ None, "disabled", "excluded" ]:
next
# Find regressions
if result in [ "broken", "failed", "unresolvable" ] and result != p_result:
print >>sys.stderr, "Error: Regression (%s -> %s) in package '%s' in %s/%s!"%(p_result, result, node.get("package"),results.get("repository"),results.get("arch"))
ret |= 8
# Find fixed builds
if result in [ "succeeded" ] and result != p_result:
print "Package '%s' fixed (%s -> %s) in staging for %s/%s."%(node.get("package"), p_result, result, results.get("repository"),results.get("arch"))
return ret
def _staging_create(self, sr, opts):
@ -276,7 +326,7 @@ def do_staging(self, subcmd, opts, *args):
self._staging_create(sr, opts)
elif cmd in ['check']:
project = args[1]
self._staging_check(project, staging_check_everything, opts)
return self._staging_check(project, staging_check_everything, opts)
elif cmd in ['remove', 'r']:
project = args[1]
self._staging_remove(project, opts)