# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+"""Buildservice API with osc API invoked"""
+
import base64
import os
-import string
import shutil
import urllib2
import M2Crypto
from osc import conf, core
+
def encode_passwd(passwd):
'''encode passwd by bz2 and base64'''
return base64.b64encode(passwd.encode('bz2'))
passx=%(passwdx)s
"""
+
class BuildService(OSC):
"""Interface to Build Service API"""
"debug": 0,
"apiurl": apiurl,
"user": apiuser,
- "passwdx": encode_passwd(apipasswd)
- }
+ "passwdx": encode_passwd(apipasswd)}
self.apiurl = apiurl
tmpf = Temp(prefix='.oscrc', content=oscrc)
self.oscrcpath = tmpf.path
OSC.__init__(self, apiurl, self.oscrcpath)
- def getSrcFileList(self, project, package, revision=None):
+ def get_src_file_list(self, project, package, revision=None):
""" get source file list of prj/pac
"""
- return core.meta_get_filelist(self.apiurl, project, package, expand=True, revision=revision)
+ return core.meta_get_filelist(self.apiurl, project, package,
+ expand=True, revision=revision)
- def getSrcFileContent(self, project, package, path, revision=None):
+ def get_src_file_content(self, project, package, path, revision=None):
""" Cat remote file
"""
- rev = core.show_upstream_xsrcmd5(self.apiurl, project, package, revision=revision)
+ rev = core.show_upstream_xsrcmd5(self.apiurl, project, package,
+ revision=revision)
if rev:
- query = { 'rev': rev }
+ query = {'rev': rev}
else:
query = None
- u = core.makeurl(self.apiurl, ['source', project, package, core.pathname2url(path)], query=query)
+ url = core.makeurl(self.apiurl, ['source', project, package,
+ core.pathname2url(path)], query=query)
content = ''
- for buf in core.streamfile(u, core.http_GET, core.BUFSIZE):
+ for buf in core.streamfile(url, core.http_GET, core.BUFSIZE):
content += buf
# return unicode str
return content.decode('utf8')
- def isNewPackage(self, dst_project, dst_package):
+ def is_new_package(self, dst_project, dst_package):
"""Check whether the dst pac is a new one
"""
new_pkg = False
try:
core.meta_exists(metatype = 'pkg',
- path_args = (core.quote_plus(dst_project), core.quote_plus(dst_package)),
+ path_args = (core.quote_plus(dst_project),
+ core.quote_plus(dst_package)),
create_new = False,
apiurl = self.apiurl)
- except urllib2.HTTPError, e:
- if e.code == 404:
+ except urllib2.HTTPError, err:
+ if err.code == 404:
new_pkg = True
else:
- raise e
+ raise err
return new_pkg
- def isNewProject(self, project):
+ def is_new_project(self, project):
"""Check whether the specified prject is a new one
"""
path_args = (core.quote_plus(project)),
create_new = False,
apiurl = self.apiurl)
- except urllib2.HTTPError, e:
- if e.code == 404:
+ except urllib2.HTTPError, err:
+ if err.code == 404:
new_prj = True
else:
- raise ObsError("%s" % e)
+ raise ObsError("%s" % err)
except (urllib2.URLError, M2Crypto.m2urllib2.URLError, \
- M2Crypto.SSL.SSLError), e:
- raise ObsError("%s" % e)
+ M2Crypto.SSL.SSLError), err:
+ raise ObsError("%s" % err)
return new_prj
- def genRequestInfo(self, reqid, show_detail = True):
+ def gen_request_info(self, reqid, show_detail = True):
"""Generate formated diff info for request,
mainly used by notification mails from BOSS
"""
def _gen_request_diff():
- """ Recommanded getter: request_diff can get req diff info even if req is accepted/declined
+ """
+ Recommanded getter: request_diff can get req diff info even if
+ req is accepted/declined
"""
reqdiff = ''
except UnicodeDecodeError:
pass
- except (AttributeError, urllib2.HTTPError), e:
+ except (AttributeError, urllib2.HTTPError), err:
+ print err
return None
return reqdiff
def _gen_server_diff(req):
- """ Reserved getter: get req diff, if and only if the recommanded getter failed
+ """
+ Reserved getter: get req diff, if and only if the Recommanded
+ getter failed
"""
reqdiff = ''
new_pkg = False
try:
core.meta_exists(metatype = 'pkg',
- path_args = (core.quote_plus(dst_project), core.quote_plus(dst_package)),
+ path_args = (core.quote_plus(dst_project),
+ core.quote_plus(dst_package)),
create_new = False,
apiurl = self.apiurl)
- except urllib2.HTTPError, e:
- if e.code == 404:
+ except urllib2.HTTPError, err:
+ if err.code == 404:
new_pkg = True
else:
- raise e
+ raise err
if new_pkg:
- src_fl = self.getSrcFileList(src_project, src_package, src_rev)
+ src_fl = self.get_src_file_list(src_project, src_package, \
+ src_rev)
spec_file = None
yaml_file = None
- for f in src_fl:
- if f.endswith(".spec"):
- spec_file = f
- elif f.endswith(".yaml"):
- yaml_file = f
+ for _file in src_fl:
+ if _file.endswith(".spec"):
+ spec_file = _file
+ elif _file.endswith(".yaml"):
+ yaml_file = _file
- reqdiff += 'This is a NEW package in %s project.\n' % dst_project
+ reqdiff += 'This is a NEW package in %s project.\n' % \
+ dst_project
reqdiff += 'The files in the new package:\n'
reqdiff += '%s/\n' % src_package
reqdiff += ' |__ ' + '\n |__ '.join(src_fl)
+ sep_line = '=' * 67
+
if yaml_file:
- reqdiff += '\n\nThe content of the YAML file, %s:\n' % (yaml_file)
- reqdiff += '===================================================================\n'
- reqdiff += self.getSrcFileContent(src_project, src_package, yaml_file, src_rev)
- reqdiff += '\n===================================================================\n'
+ reqdiff += '\n\nThe content of the YAML file, %s:\n' % \
+ yaml_file
+ reqdiff += '%s\n' % sep_line
+ reqdiff += self.get_src_file_content(src_project, \
+ src_package, yaml_file, src_rev)
+ reqdiff += '\n%s\n' % sep_line
if spec_file:
- reqdiff += '\n\nThe content of the spec file, %s:\n' % (spec_file)
- reqdiff += '===================================================================\n'
- reqdiff += self.getSrcFileContent(src_project, src_package, spec_file, src_rev)
- reqdiff += '\n===================================================================\n'
+ reqdiff += '\n\nThe content of the spec file, %s:\n' % \
+ spec_file
+ reqdiff += '%s\n' % sep_line
+ reqdiff += self.get_src_file_content(src_project, \
+ src_package, spec_file, src_rev)
+ reqdiff += '\n%s\n' % sep_line
else:
reqdiff += '\n\nspec file NOT FOUND!\n'
try:
diff = core.server_diff(self.apiurl,
dst_project, dst_package, None,
- src_project, src_package, src_rev, False)
+ src_project, src_package, src_rev, \
+ False)
try:
reqdiff += diff.decode('utf-8')
except UnicodeDecodeError:
pass
- except urllib2.HTTPError, e:
- e.osc_msg = 'Diff not possible'
+ except urllib2.HTTPError, err:
+ err.osc_msg = 'Diff not possible'
return ''
return reqdiff
# the result, in unicode string
return reqinfo
- def getRequestList(self, dst_prj, dst_pkg, user='', req_type='submit', req_state=['new','review']):
+ def get_request_list(self, dst_prj, dst_pkg, user='', req_type='submit', \
+ req_state=['new','review']):
"""Get already existing request list to the same obs project
"""
if not user:
user = conf.get_apiurl_usr(self.apiurl)
- return core.get_request_list(self.apiurl, dst_prj, dst_pkg, user, req_type=req_type, req_state=req_state)
+ return core.get_request_list(self.apiurl, dst_prj, dst_pkg, user, \
+ req_type=req_type, req_state=req_state)
- def submitReq(self, src_prj, src_pkg, dst_prj, dst_pkg, msg='', orev=None, src_update='cleanup'):
+ def submit_req(self, src_prj, src_pkg, dst_prj, dst_pkg, msg='', orev=None,
+ src_update='cleanup'):
"""Submit request to obs dest project
"""
return core.create_submit_request(self.apiurl,
dst_prj, dst_pkg,
msg, orev=orev, src_update=src_update)
- def reqDecline(self, reqid, msg=''):
+ def req_decline(self, reqid, msg=''):
""" This method is called to decline a request
Success: return None
Failed: return string of error message
"""
try:
- core.change_request_state(self.apiurl, reqid, 'declined', message=msg, supersed=None)
- except Exception, e:
- return str(e)
+ core.change_request_state(self.apiurl, reqid, 'declined', \
+ message=msg, supersed=None)
+ except Exception, err:
+ return str(err)
return None
- def reqSupersede(self, reqid, msg='', supersed=None):
+ def req_supersede(self, reqid, msg='', supersed=None):
""" This method is called to supersede a request
Success: return None
Failed: return string of error message
"""
try:
- core.change_request_state(self.apiurl, reqid, 'superseded', msg, supersed)
- except Exception, e:
- return str(e)
+ core.change_request_state(self.apiurl, reqid, 'superseded', msg, \
+ supersed)
+ except Exception, err:
+ return str(err)
return None
- def getRepoState(self, project):
+ def get_repo_state(self, project):
+ """Get repo's state of the project"""
targets = {}
- print "==%s= %s=" %(self.apiurl, project)
+ print "==%s= %s=" % self.apiurl, project
try:
- tree = ElementTree.fromstring(''.join(core.show_prj_results_meta(self.apiurl, project)))
+ tree = ElementTree.fromstring(''.join(core.show_prj_results_meta( \
+ self.apiurl, project)))
except ElementTree.ParseError:
- raise ElementTree.ParseError, ''.join(core.show_prj_results_meta(self.apiurl, project))
+ raise ElementTree.ParseError, ''.join(core.show_prj_results_meta( \
+ self.apiurl, project))
for result in tree.findall('result'):
- targets[('/'.join((result.get('repository'), result.get('arch'))))] = result.get('state')
+ targets[('/'.join((result.get('repository'), result.get('arch')))) \
+ ] = result.get('state')
return targets
- def getTargets(self, project):
+ def get_targets(self, project):
"""
- getTargets(project) -> list
+ get_targets(project) -> list
Get a list of targets for a project
"""
targets = []
- tree = ElementTree.fromstring(''.join(core.show_project_meta(self.apiurl, project)))
+ tree = ElementTree.fromstring(''.join(core.show_project_meta( \
+ self.apiurl, project)))
for repo in tree.findall('repository'):
for arch in repo.findall('arch'):
targets.append('%s/%s' % (repo.get('name'), arch.text))
return targets
- def getPackageList(self, prj, deleted=None):
+ def get_package_list(self, prj, deleted=None):
+ """Get package list of the project"""
query = {}
if deleted:
- query['deleted'] = 1
+ query['deleted'] = 1
- u = core.makeurl(self.apiurl, ['source', prj], query)
- f = core.http_GET(u)
- root = ElementTree.parse(f).getroot()
- return [ node.get('name') for node in root.findall('entry') ]
+ url = core.makeurl(self.apiurl, ['source', prj], query)
+ _file = core.http_GET(url)
+ root = ElementTree.parse(_file).getroot()
+ return [node.get('name') for node in root.findall('entry')]
- def getBuildLog(self, project, target, package, offset=0):
+ def get_build_log(self, project, target, package, offset=0):
"""
- getBuildLog(project, target, package, offset=0) -> str
+ get_build_log(project, target, package, offset=0) -> str
Returns the build log of a package for a particular target.
- If offset is greater than 0, return only text after that offset. This allows live streaming
+ If offset is greater than 0, return only text after that offset.
+ This allows live streaming
"""
(repo, arch) = target.split('/')
- u = core.makeurl(self.apiurl, ['build', project, repo, arch, package, '_log?nostream=1&start=%s' % offset])
- return core.http_GET(u).read()
+ url = core.makeurl(self.apiurl, ['build', project, repo, arch, package,
+ '_log?nostream=1&start=%s' % offset])
+ return core.http_GET(url).read()
- def getProjectConfig(self, project):
+ def get_project_config(self, project):
"""
- getProjectConfig(project) -> string
+ get_project_config(project) -> string
Get buliding config of project
"""
return ''.join(core.show_project_conf(self.apiurl, project))
- def deleteProject(self, project):
+ def delete_project(self, project):
"""
- deleteProject(project)
+ delete_project(project)
Delete the specific project
"""
return True
- def getPackageMeta(self, project, package):
+ def get_package_meta(self, project, package):
"""
- getPackageMeta(project, package) -> string
+ get_package_meta(project, package) -> string
Get XML metadata for package in project
"""
return ''.join(core.show_package_meta(self.apiurl, project, package))
- def getPackageRealProjectName(self, project, package):
+ def get_package_real_project_name(self, project, package):
"""
- getPackageRealProjectName(project, package) -> string
+ get_package_real_project_name(project, package) -> string
Get real project name in metadata of this package
"""
try:
- root = ElementTree.fromstring(self.getPackageMeta(project, package))
+ root = ElementTree.fromstring(self.get_package_meta(project, \
+ package))
if root.attrib.has_key('project'):
realprj = root.attrib['project']
except Exception, exc:
return realprj
- def deletePackage(self, project, package):
+ def delete_package(self, project, package):
"""
- deletePackage(project, package)
+ delete_package(project, package)
Delete the specific package in project
"""
""" checkout the package to current dir with link expanded
"""
- core.checkout_package(self.apiurl, prj, pkg, rev, prj_dir=prj, expand_link=True)
+ core.checkout_package(self.apiurl, prj, pkg, rev, prj_dir=prj, \
+ expand_link=True)
- def findPac(self, wd='.'):
+ def find_pac(self, work_dir='.'):
"""Get the single Package object for specified dir
- the 'wd' should be a working dir for one single pac
+ the 'work_dir' should be a working dir for one single pac
"""
- if core.is_package_dir(wd):
- return core.findpacs([wd])[0]
+ if core.is_package_dir(work_dir):
+ return core.findpacs([work_dir])[0]
else:
return None
- def mkPac(self, prj, pkg):
+ def mk_pac(self, prj, pkg):
"""Create empty package for new one under CWD
"""
os.chdir(prj)
core.createPackageDir(pkg)
- def submit(self, msg, wd='.'):
- if not core.is_package_dir(wd):
+ def submit(self, msg, work_dir='.'):
+ """Submit to obs"""
+ if not core.is_package_dir(work_dir):
# TODO show some error message
return
- pac = core.findpacs([wd])[0]
+ pac = core.findpacs([work_dir])[0]
prj = os.path.normpath(os.path.join(pac.dir, os.pardir))
pac_path = os.path.basename(os.path.normpath(pac.absdir))
files = {}
files[pac_path] = pac.todo
try:
core.Project(prj).commit(tuple([pac_path]), msg=msg, files=files)
- except urllib2.HTTPError, e:
- raise ObsError('%s' % e)
+ except urllib2.HTTPError, err:
+ raise ObsError('%s' % err)
core.store_unlink_file(pac.absdir, '_commit_msg')
- def branchPkg(self, src_project, src_package, rev=None, target_project=None, target_package=None):
+ def branch_pkg(self, src_project, src_package, rev=None, \
+ target_project=None, target_package=None):
"""Create branch package from `src_project/src_package`
arguments:
rev: revision of src project/package