Small refactor. Remove tabs.

This commit is contained in:
Alberto Planas 2014-06-05 16:50:31 +02:00
parent f8c7f05e6f
commit 560007734a

View File

@ -6,55 +6,66 @@
# Then try to run 'osc checker --help' to see the usage. # Then try to run 'osc checker --help' to see the usage.
import socket
import os import os
import traceback import re
import shutil
import subprocess import subprocess
import urllib2 import urllib2
from xml.etree import cElementTree as ET
def _checker_parse_name(self, apiurl, project, package, revision=None, brief=False, verbose=False): from osc.core import checkout_package
from osc.core import http_GET
from osc.core import http_POST
from osc.core import makeurl
def _checker_parse_name(self, apiurl, project, package,
revision=None, brief=False, verbose=False):
query = {'view': 'info', 'parse': 1}
if revision: if revision:
url = makeurl(apiurl, ['source', project, package], { 'view':'info', 'parse':1, 'rev':revision}) query['rev'] = revision
else: url = makeurl(apiurl, ['source', project, package], query)
url = makeurl(apiurl, ['source', project, package], { 'view':'info', 'parse':1 } )
try: try:
f = http_GET(url) xml = ET.parse(http_GET(url))
except urllib2.HTTPError, err: name = xml.find('name')
except urllib2.HTTPError, e:
print('ERROR in URL %s [%s]' % (url, e))
return None return None
xml = ET.parse(f)
name = xml.find('name')
if name is None or not name.text: if name is None or not name.text:
return None return None
return name.text return name.text
def _checker_change_review_state(self, opts, id, newstate, by_group='', by_user='', message='', supersed=None): def _checker_change_review_state(self, opts, id, newstate, by_group='', by_user='', message='', supersed=None):
""" taken from osc/osc/core.py, improved: """ taken from osc/osc/core.py, improved:
- verbose option added, - verbose option added,
- empty by_user=& removed. - empty by_user=& removed.
- numeric id can be int(). - numeric id can be int().
""" """
query = {'cmd': 'changereviewstate', 'newstate': newstate } query = {'cmd': 'changereviewstate', 'newstate': newstate}
if by_group: query['by_group'] = by_group if by_group:
if by_user: query['by_user'] = by_user query['by_group'] = by_group
if supersed: query['superseded_by'] = supersed if by_user:
# if message: query['comment'] = message query['by_user'] = by_user
u = makeurl(opts.apiurl, ['request', str(id)], query=query) if supersed:
f = http_POST(u, data=message) query['superseded_by'] = supersed
root = ET.parse(f).getroot() url = makeurl(opts.apiurl, ['request', str(id)], query=query)
root = ET.parse(http_POST(url, data=message)).getroot()
return root.attrib['code'] return root.attrib['code']
def _checker_prepare_dir(self, dir): def _checker_prepare_dir(self, dir):
olddir=os.getcwd() olddir = os.getcwd()
os.chdir(dir) os.chdir(dir)
shutil.rmtree(".osc") shutil.rmtree(".osc")
os.chdir(olddir) os.chdir(olddir)
def _checker_add_review(self, opts, id, by_group=None, by_user=None, msg=None): def _checker_add_review(self, opts, id, by_group=None, by_user=None, msg=None):
query = { 'cmd': 'addreview' } query = {'cmd': 'addreview'}
if by_group: if by_group:
query['by_group'] = by_group query['by_group'] = by_group
elif by_user: elif by_user:
@ -65,7 +76,7 @@ def _checker_add_review(self, opts, id, by_group=None, by_user=None, msg=None):
url = makeurl(opts.apiurl, ['request', str(id)], query) url = makeurl(opts.apiurl, ['request', str(id)], query)
try: try:
r = http_POST(url, data=msg) r = http_POST(url, data=msg)
except urllib2.HTTPError, err: except urllib2.HTTPError:
return 1 return 1
code = ET.parse(r).getroot().attrib['code'] code = ET.parse(r).getroot().attrib['code']
@ -73,12 +84,15 @@ def _checker_add_review(self, opts, id, by_group=None, by_user=None, msg=None):
raise Exception(r) raise Exception(r)
return 0 return 0
def _checker_forward_to_staging(self, opts, id): def _checker_forward_to_staging(self, opts, id):
return self._checker_add_review(opts, id, by_group='factory-staging', msg="Pick Staging Project") return self._checker_add_review(opts, id, by_group='factory-staging', msg="Pick Staging Project")
def _checker_add_review_team(self, opts, id): def _checker_add_review_team(self, opts, id):
return self._checker_add_review(opts, id, by_group='opensuse-review-team', msg="Please review sources") return self._checker_add_review(opts, id, by_group='opensuse-review-team', msg="Please review sources")
def _checker_accept_request(self, opts, id, msg, diff=10000): def _checker_accept_request(self, opts, id, msg, diff=10000):
if diff > 12: if diff > 12:
self._checker_add_review_team(opts, id) self._checker_add_review_team(opts, id)
@ -92,37 +106,38 @@ def _checker_accept_request(self, opts, id, msg, diff=10000):
self._checker_change_review_state(opts, id, 'accepted', by_group='factory-auto', message=msg) self._checker_change_review_state(opts, id, 'accepted', by_group='factory-auto', message=msg)
print("accepted " + msg) print("accepted " + msg)
def _checker_one_request(self, rq, opts): def _checker_one_request(self, rq, opts):
if (opts.verbose): if (opts.verbose):
ET.dump(rq) ET.dump(rq)
print(opts) print(opts)
id = int(rq.get('id')) id = int(rq.get('id'))
act_id = 0 act_id = 0
approved_actions = 0
actions = rq.findall('action') actions = rq.findall('action')
if len(actions) > 1: if len(actions) > 1:
msg = "2 actions in one SR is not supported - https://github.com/openSUSE/osc-plugin-factory/fork_select" msg = "2 actions in one SR is not supported - https://github.com/openSUSE/osc-plugin-factory/fork_select"
self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg) self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg)
print("declined " + msg) print("declined " + msg)
return return
for act in actions: for act in actions:
act_id += 1 act_id += 1
_type = act.get('type'); _type = act.get('type')
if (_type == "submit"): if _type == "submit":
pkg = act.find('source').get('package') pkg = act.find('source').get('package')
prj = act.find('source').get('project') prj = act.find('source').get('project')
rev = act.find('source').get('rev') rev = act.find('source').get('rev')
tprj = act.find('target').get('project') tprj = act.find('target').get('project')
tpkg = act.find('target').get('package') tpkg = act.find('target').get('package')
src = { 'package': pkg, 'project': prj, 'rev':rev, 'error': None } src = {'package': pkg, 'project': prj, 'rev': rev, 'error': None}
e = [] e = []
if not pkg: if not pkg:
e.append('no source/package in request %d, action %d' % (id, act_id)) e.append('no source/package in request %d, action %d' % (id, act_id))
if not prj: if not prj:
e.append('no source/project in request %d, action %d' % (id, act_id)) e.append('no source/project in request %d, action %d' % (id, act_id))
if len(e): src.error = '; '.join(e) if e:
src.error = '; '.join(e)
e = [] e = []
if not tpkg: if not tpkg:
@ -133,21 +148,21 @@ def _checker_one_request(self, rq, opts):
subm_id = "SUBMIT(%d):" % id subm_id = "SUBMIT(%d):" % id
print ("\n%s %s/%s -> %s/%s" % (subm_id, print ("\n%s %s/%s -> %s/%s" % (subm_id,
prj, pkg, prj, pkg,
tprj, tpkg)) tprj, tpkg))
dpkg = self._checker_check_devel_package(opts, tprj, tpkg) dpkg = self._checker_check_devel_package(opts, tprj, tpkg)
# white list # white list
self._devel_projects['KDE:Frameworks5/'] = 'x2go' self._devel_projects['KDE:Frameworks5/'] = 'x2go'
if dpkg: if dpkg:
[dprj, dpkg] = dpkg.split('/') [dprj, dpkg] = dpkg.split('/')
else: else:
dprj = None dprj = None
if dprj and (dprj != prj or dpkg != pkg) and (not os.environ.has_key("IGNORE_DEVEL_PROJECTS")): if dprj and (dprj != prj or dpkg != pkg) and ("IGNORE_DEVEL_PROJECTS" not in os.environ):
msg = "'%s/%s' is the devel package, submission is from '%s'" % (dprj, dpkg, prj) msg = "'%s/%s' is the devel package, submission is from '%s'" % (dprj, dpkg, prj)
self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg) self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg)
print("declined " + msg) print("declined " + msg)
continue continue
if not dprj and not self._devel_projects.has_key(prj + "/"): if not dprj and (prj + "/") not in self._devel_projects:
msg = "'%s' is not a valid devel project of %s - please pick one of the existent" % (prj, tprj) msg = "'%s' is not a valid devel project of %s - please pick one of the existent" % (prj, tprj)
self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg) self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg)
print("declined " + msg) print("declined " + msg)
@ -165,18 +180,18 @@ def _checker_one_request(self, rq, opts):
self._checker_prepare_dir(tpkg) self._checker_prepare_dir(tpkg)
os.rename(tpkg, "_old") os.rename(tpkg, "_old")
except urllib2.HTTPError: except urllib2.HTTPError:
print("failed to checkout %s/%s" % (tprj, tpkg)) print("failed to checkout %s/%s" % (tprj, tpkg))
pass
checkout_package(opts.apiurl, prj, pkg, revision=rev, checkout_package(opts.apiurl, prj, pkg, revision=rev,
pathname=dir, server_service_files=True, expand_link=True) pathname=dir, server_service_files=True, expand_link=True)
os.rename(pkg, tpkg) os.rename(pkg, tpkg)
self._checker_prepare_dir(tpkg) self._checker_prepare_dir(tpkg)
r=self._checker_parse_name(opts.apiurl, prj, pkg, revision=rev) r = self._checker_parse_name(opts.apiurl, prj, pkg, revision=rev)
if r != tpkg: if r != tpkg:
msg = "A pkg submitted as %s has to build as 'Name: %s' - found Name '%s'" % (tpkg, tpkg, r) msg = "A pkg submitted as %s has to build as 'Name: %s' - found Name '%s'" % (tpkg, tpkg, r)
self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg) self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg)
continue continue
sourcechecker = os.path.dirname(os.path.realpath(os.path.expanduser('~/.osc-plugins/osc-check_source.py'))) sourcechecker = os.path.dirname(os.path.realpath(os.path.expanduser('~/.osc-plugins/osc-check_source.py')))
sourcechecker = os.path.join(sourcechecker, 'source-checker.pl') sourcechecker = os.path.join(sourcechecker, 'source-checker.pl')
@ -192,22 +207,22 @@ def _checker_one_request(self, rq, opts):
msg = "Output of check script:\n" + output msg = "Output of check script:\n" + output
self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg) self._checker_change_review_state(opts, id, 'declined', by_group='factory-auto', message=msg)
print("declined " + msg) print("declined " + msg)
shutil.rmtree(dir) shutil.rmtree(dir)
continue continue
shutil.rmtree(dir) shutil.rmtree(dir)
msg="Check script succeeded" msg = 'Check script succeeded'
if len(checked) and checked[-1].startswith('DIFFCOUNT'): if len(checked) and checked[-1].startswith('DIFFCOUNT'):
# this is a major break through in perl<->python communication! # this is a major break through in perl<->python communication!
diff = int(checked.pop().split(' ')[1]) diff = int(checked.pop().split(' ')[1])
else: # e.g. new package else: # e.g. new package
diff = 10000 diff = 10000
if len(checked): if len(checked):
msg = msg + "\n\nOutput of check script (non-fatal):\n" + output msg = msg + "\n\nOutput of check script (non-fatal):\n" + output
if self._checker_accept_request(opts, id, msg, diff=diff): if self._checker_accept_request(opts, id, msg, diff=diff):
continue continue
else: else:
self._checker_forward_to_staging(opts, id) self._checker_forward_to_staging(opts, id)
@ -215,15 +230,15 @@ def _checker_one_request(self, rq, opts):
by_group='factory-auto', by_group='factory-auto',
message="Unchecked request type %s" % _type) message="Unchecked request type %s" % _type)
def _checker_check_devel_package(self, opts, project, package): def _checker_check_devel_package(self, opts, project, package):
if not self._devel_projects.has_key(project): if project not in self._devel_projects:
url = makeurl(opts.apiurl, ['search','package'], "match=[@project='%s']" % project) url = makeurl(opts.apiurl, ['search', 'package'], "match=[@project='%s']" % project)
f = http_GET(url) root = ET.parse(http_GET(url)).getroot()
root = ET.parse(f).getroot()
for p in root.findall('package'): for p in root.findall('package'):
name = p.attrib['name'] name = p.attrib['name']
d = p.find('devel') d = p.find('devel')
if d != None: if d is not None:
dprj = d.attrib['project'] dprj = d.attrib['project']
self._devel_projects["%s/%s" % (project, name)] = "%s/%s" % (dprj, d.attrib['package']) self._devel_projects["%s/%s" % (project, name)] = "%s/%s" % (dprj, d.attrib['package'])
# for new packages to check # for new packages to check
@ -237,6 +252,7 @@ def _checker_check_devel_package(self, opts, project, package):
except KeyError: except KeyError:
return None return None
def do_check_source(self, subcmd, opts, *args): def do_check_source(self, subcmd, opts, *args):
"""${cmd_name}: checker review of submit requests. """${cmd_name}: checker review of submit requests.
@ -250,29 +266,23 @@ def do_check_source(self, subcmd, opts, *args):
self._devel_projects = {} self._devel_projects = {}
opts.verbose = False opts.verbose = False
from pprint import pprint
opts.apiurl = self.get_api_url() opts.apiurl = self.get_api_url()
tmphome = None
if len(args) and args[0] == 'skip': if len(args) and args[0] == 'skip':
for id in args[1:]: for id in args[1:]:
self._checker_accept_request(opts, id, "skip review") self._checker_accept_request(opts, id, 'skip review')
return return
ids = {} ids = {}
for a in args: for a in args:
if (re.match('\d+', a)): if re.match('\d+', a):
ids[a] = 1 ids[a] = 1
if (not len(ids)): if (not len(ids)):
where = "@by_group='factory-auto'+and+@state='new'" where = "@by_group='factory-auto'+and+@state='new'"
url = makeurl(opts.apiurl, ['search','request'], "match=state/@name='review'+and+review["+where+"]") url = makeurl(opts.apiurl, ['search', 'request'], "match=state/@name='review'+and+review[" + where + "]")
f = http_GET(url) root = ET.parse(http_GET(url)).getroot()
root = ET.parse(f).getroot()
for rq in root.findall('request'): for rq in root.findall('request'):
tprj = rq.find('action/target').get('project')
self._checker_one_request(rq, opts) self._checker_one_request(rq, opts)
else: else:
# we have a list, use them. # we have a list, use them.
@ -282,9 +292,3 @@ def do_check_source(self, subcmd, opts, *args):
xml = ET.parse(f) xml = ET.parse(f)
root = xml.getroot() root = xml.getroot()
self._checker_one_request(root, opts) self._checker_one_request(root, opts)
#Local Variables:
#mode: python
#py-indent-offset: 4
#tab-width: 8
#End: