def _get_project_dot(apiurl, projectname, done, cache): if projectname in done: return [] done.add(projectname) bs = buildservice.BuildService(apiurl=str(apiurl)) if projectname in cache: project = cache[projectname] else: project = _get_project(bs, projectname) cache[projectname] = project dot = [] for repository in project.iter('repository'): parent_node = '"%s~%s"' % (project.attrib['name'], repository.attrib['name']) for child in repository: if child.tag == "arch": arch = child.text dot.append( parent_node + ' [label="%s\\n%s\\n%s"];' % (project.attrib['name'], repository.attrib['name'], arch)) elif child.tag == "path": dep_project = child.attrib['project'] dot.extend(_get_project_dot(apiurl, dep_project, done, cache)) child_node = '"%s~%s"' % (child.attrib['project'], child.attrib['repository']) dot.append("%s -> %s;" % (parent_node, child_node)) return dot
def _get_submit_reqs(new_prjs, old_prjs): reqs = { "incoming": [], "in progress": [], "outgoing": [], } for apiurl, prjs in new_prjs: bs = buildservice.BuildService(apiurl=str(apiurl)) actions = ["(action/target/@project='%s'" % prj for prj in prjs] reqs["incoming"] = core.search( bs.apiurl, request="(state/@name='new' or state/@name='review') and %s)" % "or".join(actions)) for apiurl, prjs in old_prjs: bs = buildservice.BuildService(apiurl=str(apiurl)) actions = ["(action/source/@project='%s'" % prj for prj in prjs] reqs["outgoing"] = core.search( bs.apiurl, request="(state/@name='new' or state/@name='review') and %s)" % "or".join(actions)) return reqs
def _get_submit_reqs(old_repo_ts, new_repo_ts, projects, apiurl, cache=False): reqs = [] #if not live and cache exists and not empty if cache and os.path.exists(cache) and os.path.getsize(cache) > 0: infile = open(cache, 'rb') reqs = pickle.load(infile) infile.close() else: bs = buildservice.BuildService(apiurl=str(apiurl)) reqs = bs.getSubmitRequests("accepted", old_repo_ts, new_repo_ts, list(projects)) if cache: ofile = open(cache, 'wb') pickle.dump(reqs, ofile) ofile.close() return reqs
def api(self): return buildservice.BuildService(apiurl=self.apiurl)
def _creq(new_repo, old_repo, submit, delete, comment): messages = [] options = defaultdict(list) apiurl = str(new_repo.server.buildservice.apiurl) weburl = str(new_repo.server.buildservice.weburl) bs = buildservice.BuildService(apiurl=apiurl) old_prjsack = old_repo.prjsack for pkg_repoid in submit: pkg, repoid = pkg_repoid.split("@") src_repo = Repo.objects.get(id=repoid) src_prj = src_repo.prjsack[0] src_prj_pkgs = bs.getPackageList(str(src_prj.name)) tgt_prj = src_prj.request_target if not tgt_prj or tgt_prj not in old_prjsack: try: tgt_prj = src_prj.request_source.get() except ObjectDoesNotExist: tgt_prj = None if not tgt_prj or tgt_prj not in old_prjsack: messages.append("No target project for SR from %s to %s" % (src_prj, old_repo)) continue tgt_prj_pkgs = bs.getPackageList(str(tgt_prj.name)) if pkg not in src_prj_pkgs: print pkg print src_prj pkg = _find_obs_pkg(bs, pkg, src_prj.name) if not pkg: messages.append("OBS package for %s was not found in %s" % (pkg, src_prj)) continue options[tgt_prj.name].append({ 'action': "submit", 'src_project': src_prj.name, 'src_package': pkg, 'tgt_project': tgt_prj.name, 'tgt_package': pkg, }) for pkg_repoid in delete: pkg, repoid = pkg_repoid.split("@") tgt_repo = Repo.objects.get(id=repoid) tgt_prj = tgt_repo.prjsack[0] tgt_prj_pkgs = bs.getPackageList(tgt_prj.name) if pkg not in tgt_prj_pkgs: pkg = _find_obs_pkg(bs, pkg, tgt_prj.name) if not pkg: messages.append("OBS package for %s was not found in %s" % (pkg, tgt_prj.name)) continue options[tgt_prj.name].append({ 'action': "delete", 'tgt_project': tgt_prj.name, 'tgt_package': pkg, }) print options all_actions = [] tgts = [] for tgt, actions in options.items(): all_actions.extend(actions) tgts.append(tgt) messages = [] errors = [] try: req = bs.createRequest(options_list=all_actions, description=comment, comment="Automated request") messages.append( mark_safe('Created <a href="%s/request/show/%s">SR#%s</a> for %s' % (weburl, req.reqid, req.reqid, ", ".join(tgts)))) except HTTPError, err: status = etree.fromstring(err.read()) errors.append("Error while creating request: %s" % status.find( ("summary")).text)
class MainWindow(QtGui.QMainWindow): """ MainWindow() YABSC main window widget """ def __init__(self): QtGui.QMainWindow.__init__(self) # Configuration self.cfgfilename = os.path.expanduser('~/.yabscrc') self.cfg = ConfigParser.ConfigParser() if os.path.exists(self.cfgfilename): try: f = open(self.cfgfilename) self.cfg.readfp(f) f.close() except IOError, e: QtGui.QMessageBox.critical( self, "Configuration File Error", "Could not read configuration file %s: %s" % (self.cfgfilename, e)) # Set configuration defaults for section in defaultconfig: if not self.cfg.has_section(section): self.cfg.add_section(section) for (key, val) in defaultconfig[section].items(): if not self.cfg.has_option(section, key): self.cfg.set(section, key, str(val)) # Window size size = [int(v) for v in self.cfg.get('persistence', 'size').split(',')] self.resize(*size) # Initial window title self.setWindowTitle('Yabsc') # Actions exit = QtGui.QAction('Exit', self) exit.setShortcut('Ctrl+Q') exit.setStatusTip('Exit yabsc') self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()')) # Status bar self.statslabel = QtGui.QLabel() self.statusBar().addPermanentWidget(self.statslabel) # BuildService object self.bs = buildservice.BuildService() if self.cfg.has_option('persistence', 'apiurl'): self.bs.apiurl = self.cfg.get('persistence', 'apiurl') # Wait stats self.waitstatstimer = QtCore.QTimer() QtCore.QObject.connect(self.waitstatstimer, QtCore.SIGNAL("timeout()"), self.refreshWaitStats) self.waitstatsthread = WaitStatsThread(self.bs) QtCore.QObject.connect(self.waitstatsthread, QtCore.SIGNAL("finished()"), self.updateWaitStats) self.waitstatstimer.start( self.cfg.getint('general', 'refreshinterval') * 1000) # Central widgets self.maintabwidget = QtGui.QTabWidget() self.rw = results.ResultWidget(self, self.bs, self.cfg) self.maintabwidget.addTab(self.rw, "Projects") self.ww = workers.WorkerWidget(self, self.bs, self.cfg) self.maintabwidget.addTab(self.ww, "Workers") self.srw = submitrequests.SubmitRequestWidget(self, self.bs, self.cfg) self.maintabwidget.addTab(self.srw, "Submit Requests") self.setCentralWidget(self.maintabwidget) self.connect(self.maintabwidget, QtCore.SIGNAL('currentChanged(int)'), self.mainTabSelected) self.rw.viewable = True self.rw.enableRefresh() # Menu bar menubar = self.menuBar() file = menubar.addMenu('&File') exportaction = QtGui.QAction("&Export ...", self) exportaction.setStatusTip("Export current view to file") file.addAction(exportaction) self.connect(exportaction, QtCore.SIGNAL('triggered()'), self.export) file.addAction(exit) server = menubar.addMenu('&Server') self.apiselections = [] for apiurl in conf.config['api_host_options'].keys(): if not apiurl.startswith('http'): apiurl = "%s://%s" % (conf.config['scheme'], apiurl) action = QtGui.QAction(apiurl, self) action.setStatusTip('Set server to %s' % apiurl) server.addAction(action) apiselection = ApiSelection(apiurl, self.rw, self.ww) self.apiselections.append(apiselection) self.connect(action, QtCore.SIGNAL('triggered()'), apiselection.selected) settings = menubar.addMenu('S&ettings') configureaction = QtGui.QAction("&Configure Yabsc...", self) configureaction.setStatusTip("Configure Yabsc options") settings.addAction(configureaction) self.connect(configureaction, QtCore.SIGNAL('triggered()'), self.configure)