示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
 def api(self):
     return buildservice.BuildService(apiurl=self.apiurl)
示例#5
0
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)
示例#6
0
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)