def test_basic_edit(mgr): """ Verifies that a single leaf can be edited, and that the appropriate sysrepo notifications are emitted """ event_log.clear() # Starts with no value assert get_contact(mgr) == "Not Present" # Set a value change_contact(mgr, "merge", "TestValue") assert get_contact(mgr) == "TestValue" assert (event_log.find_change_in_log( event_log.load(), "SR_EV_VERIFY", { "operation": "SR_OP_CREATED", "new-value": "TestValue", "new-path": "/ietf-system:system/contact", }, ) is not None) event_log.clear() # Clear the value change_contact(mgr, "delete", "TestValue") assert get_contact(mgr) == "Not Present" assert (event_log.find_change_in_log( event_log.load(), "SR_EV_VERIFY", { "operation": "SR_OP_DELETED", "old-path": "/ietf-system:system/contact" }, ) is not None)
def rawentries(subdir="", **map): descend = self.ui.configbool('web', 'descend', True) for name, path in self.repos: if not name.startswith(subdir): continue name = name[len(subdir):] if not descend and '/' in name: continue u = self.ui.copy() try: u.readconfig(os.path.join(path, '.hg', 'hgrc')) except Exception, e: u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) continue def get(section, name, default=None): return u.config(section, name, default, untrusted=True) if u.configbool("web", "hidden", untrusted=True): continue if not self.read_allowed(u, req): continue parts = [name] if 'PATH_INFO' in req.env: parts.insert(0, req.env['PATH_INFO'].rstrip('/')) if req.env['SCRIPT_NAME']: parts.insert(0, req.env['SCRIPT_NAME']) url = re.sub(r'/+', '/', '/'.join(parts) + '/') # update time with local timezone try: r = hg.repository(self.ui, path) except error.RepoError: u.warn(_('error accessing repository at %s\n') % path) continue try: d = (get_mtime(r.spath), util.makedate()[1]) except OSError: continue contact = get_contact(get) description = get("web", "description", "") name = get("web", "name", name) row = dict(contact=contact or "unknown", contact_sort=contact.upper() or "unknown", name=name, name_sort=name, url=url, description=description or "unknown", description_sort=description.upper() or "unknown", lastchange=d, lastchange_sort=d[1] - d[0], archives=archivelist(u, "tip", url)) yield row
def rawentries(subdir="", **map): descend = self.ui.configbool('web', 'descend', True) for name, path in self.repos: if not name.startswith(subdir): continue name = name[len(subdir):] if not descend and '/' in name: continue u = self.ui.copy() try: u.readconfig(os.path.join(path, '.hg', 'hgrc')) except Exception, e: u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) continue def get(section, name, default=None): return u.config(section, name, default, untrusted=True) if u.configbool("web", "hidden", untrusted=True): continue if not self.read_allowed(u, req): continue parts = [name] if 'PATH_INFO' in req.env: parts.insert(0, req.env['PATH_INFO'].rstrip('/')) if req.env['SCRIPT_NAME']: parts.insert(0, req.env['SCRIPT_NAME']) url = re.sub(r'/+', '/', '/'.join(parts) + '/') # update time with local timezone try: r = hg.repository(self.ui, path) except error.RepoError: u.warn(_('error accessing repository at %s\n') % path) continue try: d = (get_mtime(r.spath), util.makedate()[1]) except OSError: continue contact = get_contact(get) description = get("web", "description", "") name = get("web", "name", name) row = dict(contact=contact or "unknown", contact_sort=contact.upper() or "unknown", name=name, name_sort=name, url=url, description=description or "unknown", description_sort=description.upper() or "unknown", lastchange=d, lastchange_sort=d[1]-d[0], archives=archivelist(u, "tip", url)) yield row
def entries(sortcolumn="", descending=False, subdir="", **map): rows = [] parity = paritygen(self.stripecount) for name, path in self.repos: if not name.startswith(subdir): continue name = name[len(subdir):] u = self.ui.copy() try: u.readconfig(os.path.join(path, '.hg', 'hgrc')) except Exception, e: u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) continue def get(section, name, default=None): return u.config(section, name, default, untrusted=True) if u.configbool("web", "hidden", untrusted=True): continue if not self.read_allowed(u, req): continue parts = [name] if 'PATH_INFO' in req.env: parts.insert(0, req.env['PATH_INFO'].rstrip('/')) if req.env['SCRIPT_NAME']: parts.insert(0, req.env['SCRIPT_NAME']) m = re.match('((?:https?://)?)(.*)', '/'.join(parts)) # squish repeated slashes out of the path component url = m.group(1) + re.sub('/+', '/', m.group(2)) + '/' # update time with local timezone try: d = (get_mtime(path), util.makedate()[1]) except OSError: continue contact = get_contact(get) description = get("web", "description", "") name = get("web", "name", name) row = dict(contact=contact or "unknown", contact_sort=contact.upper() or "unknown", name=name, name_sort=name, url=url, description=description or "unknown", description_sort=description.upper() or "unknown", lastchange=d, lastchange_sort=d[1] - d[0], archives=archivelist(u, "tip", url)) if (not sortcolumn or (sortcolumn, descending) == sortdefault): # fast path for unsorted output row['parity'] = parity.next() yield row else: rows.append((row["%s_sort" % sortcolumn], row))
def entries(sortcolumn="", descending=False, subdir="", **map): rows = [] parity = paritygen(self.stripecount) for name, path in self.repos: if not name.startswith(subdir): continue name = name[len(subdir):] u = self.ui.copy() try: u.readconfig(os.path.join(path, '.hg', 'hgrc')) except Exception, e: u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) continue def get(section, name, default=None): return u.config(section, name, default, untrusted=True) if u.configbool("web", "hidden", untrusted=True): continue if not self.read_allowed(u, req): continue parts = [name] if 'PATH_INFO' in req.env: parts.insert(0, req.env['PATH_INFO'].rstrip('/')) if req.env['SCRIPT_NAME']: parts.insert(0, req.env['SCRIPT_NAME']) m = re.match('((?:https?://)?)(.*)', '/'.join(parts)) # squish repeated slashes out of the path component url = m.group(1) + re.sub('/+', '/', m.group(2)) + '/' # update time with local timezone try: d = (get_mtime(path), util.makedate()[1]) except OSError: continue contact = get_contact(get) description = get("web", "description", "") name = get("web", "name", name) row = dict(contact=contact or "unknown", contact_sort=contact.upper() or "unknown", name=name, name_sort=name, url=url, description=description or "unknown", description_sort=description.upper() or "unknown", lastchange=d, lastchange_sort=d[1]-d[0], archives=archivelist(u, "tip", url)) if (not sortcolumn or (sortcolumn, descending) == sortdefault): # fast path for unsorted output row['parity'] = parity.next() yield row else: rows.append((row["%s_sort" % sortcolumn], row))
def summary(web, req, tmpl): i = web.repo.tagslist() i.reverse() def tagentries(**map): parity = paritygen(web.stripecount) count = 0 for k, n in i: if k == "tip": # skip tip continue count += 1 if count > 10: # limit to 10 tags break yield tmpl("tagentry", parity=parity.next(), tag=k, node=hex(n), date=web.repo[n].date()) def branches(**map): parity = paritygen(web.stripecount) b = web.repo.branchtags() l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()] for r,n,t in sorted(l): yield {'parity': parity.next(), 'branch': t, 'node': hex(n), 'date': web.repo[n].date()} def changelist(**map): parity = paritygen(web.stripecount, offset=start-end) l = [] # build a list in forward order for efficiency for i in xrange(start, end): ctx = web.repo[i] n = ctx.node() hn = hex(n) l.insert(0, tmpl( 'shortlogentry', parity=parity.next(), author=ctx.user(), desc=ctx.description(), date=ctx.date(), rev=i, node=hn, tags=webutil.nodetagsdict(web.repo, n), inbranch=webutil.nodeinbranch(web.repo, ctx), branches=webutil.nodebranchdict(web.repo, ctx))) yield l cl = web.repo.changelog count = len(cl) start = max(0, count - web.maxchanges) end = min(count, start + web.maxchanges) return tmpl("summary", desc=web.config("web", "description", "unknown"), owner=get_contact(web.config) or "unknown", lastchange=cl.read(cl.tip())[2], tags=tagentries, branches=branches, shortlog=changelist, node=hex(cl.tip()), archives=web.archivelist("tip"))
def rawentries(subdir="", **map): descend = self.ui.configbool('web', 'descend', True) collapse = self.ui.configbool('web', 'collapse', False) seenrepos = set() seendirs = set() for name, path in self.repos: if not name.startswith(subdir): continue name = name[len(subdir):] directory = False if '/' in name: if not descend: continue nameparts = name.split('/') rootname = nameparts[0] if not collapse: pass elif rootname in seendirs: continue elif rootname in seenrepos: pass else: directory = True name = rootname # redefine the path to refer to the directory discarded = '/'.join(nameparts[1:]) # remove name parts plus accompanying slash path = path[:-len(discarded) - 1] try: r = hg.repository(self.ui, path) directory = False except (IOError, error.RepoError): pass parts = [name] if 'PATH_INFO' in req.env: parts.insert(0, req.env['PATH_INFO'].rstrip('/')) if req.env['SCRIPT_NAME']: parts.insert(0, req.env['SCRIPT_NAME']) url = re.sub(r'/+', '/', '/'.join(parts) + '/') # show either a directory entry or a repository if directory: # get the directory's time information try: d = (get_mtime(path), util.makedate()[1]) except OSError: continue # add '/' to the name to make it obvious that # the entry is a directory, not a regular repository row = {'contact': "", 'contact_sort': "", 'name': name + '/', 'name_sort': name, 'url': url, 'description': "", 'description_sort': "", 'lastchange': d, 'lastchange_sort': d[1]-d[0], 'archives': [], 'isdirectory': True} seendirs.add(name) yield row continue u = self.ui.copy() try: u.readconfig(os.path.join(path, '.hg', 'hgrc')) except Exception as e: u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e)) continue def get(section, name, default=None): return u.config(section, name, default, untrusted=True) if u.configbool("web", "hidden", untrusted=True): continue if not self.read_allowed(u, req): continue # update time with local timezone try: r = hg.repository(self.ui, path) except IOError: u.warn(_('error accessing repository at %s\n') % path) continue except error.RepoError: u.warn(_('error accessing repository at %s\n') % path) continue try: d = (get_mtime(r.spath), util.makedate()[1]) except OSError: continue contact = get_contact(get) description = get("web", "description", "") seenrepos.add(name) name = get("web", "name", name) row = {'contact': contact or "unknown", 'contact_sort': contact.upper() or "unknown", 'name': name, 'name_sort': name, 'url': url, 'description': description or "unknown", 'description_sort': description.upper() or "unknown", 'lastchange': d, 'lastchange_sort': d[1]-d[0], 'archives': archivelist(u, "tip", url), 'isdirectory': None, } yield row
def entries(sortcolumn="", descending=False, subdir="", **map): def sessionvars(**map): fields = [] if 'style' in req.form: style = req.form['style'][0] if style != get('web', 'style', ''): fields.append(('style', style)) separator = url[-1] == '?' and ';' or '?' for name, value in fields: yield dict(name=name, value=value, separator=separator) separator = ';' rows = [] parity = paritygen(self.stripecount) for name, path in self.repos: if not name.startswith(subdir): continue name = name[len(subdir):] u = ui.ui(parentui=self.parentui) try: u.readconfig(os.path.join(path, '.hg', 'hgrc')) except Exception, e: u.warn(_('error reading %s/.hg/hgrc: %s\n' % (path, e))) continue def get(section, name, default=None): return u.config(section, name, default, untrusted=True) if u.configbool("web", "hidden", untrusted=True): continue parts = [name] if 'PATH_INFO' in req.env: parts.insert(0, req.env['PATH_INFO'].rstrip('/')) if req.env['SCRIPT_NAME']: parts.insert(0, req.env['SCRIPT_NAME']) url = ('/'.join(parts).replace("//", "/")) + '/' # update time with local timezone try: d = (get_mtime(path), util.makedate()[1]) except OSError: continue contact = get_contact(get) description = get("web", "description", "") name = get("web", "name", name) row = dict(contact=contact or "unknown", contact_sort=contact.upper() or "unknown", name=name, name_sort=name, url=url, description=description or "unknown", description_sort=description.upper() or "unknown", lastchange=d, lastchange_sort=d[1]-d[0], sessionvars=sessionvars, archives=archivelist(u, "tip", url)) if (not sortcolumn or (sortcolumn, descending) == self.repos_sorted): # fast path for unsorted output row['parity'] = parity.next() yield row else: rows.append((row["%s_sort" % sortcolumn], row))
def summary(web, req, tmpl): i = web.repo.tagslist() i.reverse() def tagentries(**map): parity = paritygen(web.stripecount) count = 0 for k, n in i: if k == "tip": # skip tip continue count += 1 if count > 10: # limit to 10 tags break yield tmpl("tagentry", parity=parity.next(), tag=k, node=hex(n), date=web.repo[n].date()) def branches(**map): parity = paritygen(web.stripecount) b = web.repo.branchtags() l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()] for r, n, t in sorted(l): yield { 'parity': parity.next(), 'branch': t, 'node': hex(n), 'date': web.repo[n].date() } def changelist(**map): parity = paritygen(web.stripecount, offset=start - end) l = [] # build a list in forward order for efficiency for i in xrange(start, end): ctx = web.repo[i] n = ctx.node() hn = hex(n) l.insert( 0, tmpl('shortlogentry', parity=parity.next(), author=ctx.user(), desc=ctx.description(), date=ctx.date(), rev=i, node=hn, tags=webutil.nodetagsdict(web.repo, n), inbranch=webutil.nodeinbranch(web.repo, ctx), branches=webutil.nodebranchdict(web.repo, ctx))) yield l cl = web.repo.changelog count = len(cl) start = max(0, count - web.maxchanges) end = min(count, start + web.maxchanges) return tmpl("summary", desc=web.config("web", "description", "unknown"), owner=get_contact(web.config) or "unknown", lastchange=cl.read(cl.tip())[2], tags=tagentries, branches=branches, shortlog=changelist, node=hex(cl.tip()), archives=web.archivelist("tip"))
def summary(web, req, tmpl): """ /summary -------- Show a summary of repository state. Information about the latest changesets, bookmarks, tags, and branches is captured by this handler. The ``summary`` template is rendered. """ i = reversed(web.repo.tagslist()) def tagentries(**map): parity = paritygen(web.stripecount) count = 0 for k, n in i: if k == "tip": # skip tip continue count += 1 if count > 10: # limit to 10 tags break yield tmpl("tagentry", parity=parity.next(), tag=k, node=hex(n), date=web.repo[n].date()) def bookmarks(**map): parity = paritygen(web.stripecount) marks = [b for b in web.repo._bookmarks.items() if b[1] in web.repo] for k, n in sorted(marks)[:10]: # limit to 10 bookmarks yield { 'parity': parity.next(), 'bookmark': k, 'date': web.repo[n].date(), 'node': hex(n) } def changelist(**map): parity = paritygen(web.stripecount, offset=start - end) l = [] # build a list in forward order for efficiency revs = [] if start < end: revs = web.repo.changelog.revs(start, end - 1) for i in revs: ctx = web.repo[i] n = ctx.node() hn = hex(n) l.append( tmpl('shortlogentry', parity=parity.next(), author=ctx.user(), desc=ctx.description(), extra=ctx.extra(), date=ctx.date(), rev=i, node=hn, tags=webutil.nodetagsdict(web.repo, n), bookmarks=webutil.nodebookmarksdict(web.repo, n), inbranch=webutil.nodeinbranch(web.repo, ctx), branches=webutil.nodebranchdict(web.repo, ctx))) l.reverse() yield l tip = web.repo['tip'] count = len(web.repo) start = max(0, count - web.maxchanges) end = min(count, start + web.maxchanges) return tmpl("summary", desc=web.config("web", "description", "unknown"), owner=get_contact(web.config) or "unknown", lastchange=tip.date(), tags=tagentries, bookmarks=bookmarks, branches=webutil.branchentries(web.repo, web.stripecount, 10), shortlog=changelist, node=tip.hex(), symrev='tip', archives=web.archivelist("tip"))
def summary(web, req, tmpl): i = reversed(web.repo.tagslist()) def tagentries(**map): parity = paritygen(web.stripecount) count = 0 for k, n in i: if k == "tip": # skip tip continue count += 1 if count > 10: # limit to 10 tags break yield tmpl("tagentry", parity=parity.next(), tag=k, node=hex(n), date=web.repo[n].date()) def bookmarks(**map): parity = paritygen(web.stripecount) marks = [b for b in web.repo._bookmarks.items() if b[1] in web.repo] for k, n in sorted(marks)[:10]: # limit to 10 bookmarks yield {'parity': parity.next(), 'bookmark': k, 'date': web.repo[n].date(), 'node': hex(n)} def branches(**map): parity = paritygen(web.stripecount) b = web.repo.branchtags() l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()] for r, n, t in sorted(l): yield {'parity': parity.next(), 'branch': t, 'node': hex(n), 'date': web.repo[n].date()} def changelist(**map): parity = paritygen(web.stripecount, offset=start - end) l = [] # build a list in forward order for efficiency revs = [] if start < end: revs = web.repo.changelog.revs(start, end - 1) for i in revs: ctx = web.repo[i] n = ctx.node() hn = hex(n) l.append(tmpl( 'shortlogentry', parity=parity.next(), author=ctx.user(), desc=ctx.description(), extra=ctx.extra(), date=ctx.date(), rev=i, node=hn, tags=webutil.nodetagsdict(web.repo, n), bookmarks=webutil.nodebookmarksdict(web.repo, n), inbranch=webutil.nodeinbranch(web.repo, ctx), branches=webutil.nodebranchdict(web.repo, ctx))) l.reverse() yield l tip = web.repo['tip'] count = len(web.repo) start = max(0, count - web.maxchanges) end = min(count, start + web.maxchanges) return tmpl("summary", desc=web.config("web", "description", "unknown"), owner=get_contact(web.config) or "unknown", lastchange=tip.date(), tags=tagentries, bookmarks=bookmarks, branches=branches, shortlog=changelist, node=tip.hex(), archives=web.archivelist("tip"))
def summary(web, req, tmpl): i = reversed(web.repo.tagslist()) def tagentries(**map): parity = paritygen(web.stripecount) count = 0 for k, n in i: if k == "tip": # skip tip continue count += 1 if count > 10: # limit to 10 tags break yield tmpl("tagentry", parity=parity.next(), tag=k, node=hex(n), date=web.repo[n].date()) def bookmarks(**map): parity = paritygen(web.stripecount) marks = [b for b in web.repo._bookmarks.items() if b[1] in web.repo] for k, n in sorted(marks)[:10]: # limit to 10 bookmarks yield {'parity': parity.next(), 'bookmark': k, 'date': web.repo[n].date(), 'node': hex(n)} def branches(**map): parity = paritygen(web.stripecount) b = web.repo.branchmap() l = [(-web.repo.changelog.rev(tip), tip, tag) for tag, heads, tip, closed in b.iterbranches()] for r, n, t in sorted(l): yield {'parity': parity.next(), 'branch': t, 'node': hex(n), 'date': web.repo[n].date()} def changelist(**map): parity = paritygen(web.stripecount, offset=start - end) l = [] # build a list in forward order for efficiency revs = [] if start < end: revs = web.repo.changelog.revs(start, end - 1) for i in revs: ctx = web.repo[i] n = ctx.node() hn = hex(n) l.append(tmpl( 'shortlogentry', parity=parity.next(), author=ctx.user(), desc=ctx.description(), extra=ctx.extra(), date=ctx.date(), rev=i, node=hn, tags=webutil.nodetagsdict(web.repo, n), bookmarks=webutil.nodebookmarksdict(web.repo, n), inbranch=webutil.nodeinbranch(web.repo, ctx), branches=webutil.nodebranchdict(web.repo, ctx))) l.reverse() yield l tip = web.repo['tip'] count = len(web.repo) start = max(0, count - web.maxchanges) end = min(count, start + web.maxchanges) return tmpl("summary", desc=web.config("web", "description", "unknown"), owner=get_contact(web.config) or "unknown", lastchange=tip.date(), tags=tagentries, bookmarks=bookmarks, branches=branches, shortlog=changelist, node=tip.hex(), archives=web.archivelist("tip"))
def entries(sortcolumn="", descending=False, subdir="", **map): def sessionvars(**map): fields = [] if 'style' in req.form: style = req.form['style'][0] if style != get('web', 'style', ''): fields.append(('style', style)) separator = url[-1] == '?' and ';' or '?' for name, value in fields: yield dict(name=name, value=value, separator=separator) separator = ';' rows = [] parity = paritygen(self.stripecount) for name, path in self.repos: if not name.startswith(subdir): continue name = name[len(subdir):] u = ui.ui(parentui=self.parentui) try: u.readconfig(os.path.join(path, '.hg', 'hgrc')) except Exception, e: u.warn(_('error reading %s/.hg/hgrc: %s\n' % (path, e))) continue def get(section, name, default=None): return u.config(section, name, default, untrusted=True) if u.configbool("web", "hidden", untrusted=True): continue parts = [name] if 'PATH_INFO' in req.env: parts.insert(0, req.env['PATH_INFO'].rstrip('/')) if req.env['SCRIPT_NAME']: parts.insert(0, req.env['SCRIPT_NAME']) url = ('/'.join(parts).replace("//", "/")) + '/' # update time with local timezone try: d = (get_mtime(path), util.makedate()[1]) except OSError: continue contact = get_contact(get) description = get("web", "description", "") name = get("web", "name", name) row = dict(contact=contact or "unknown", contact_sort=contact.upper() or "unknown", name=name, name_sort=name, url=url, description=description or "unknown", description_sort=description.upper() or "unknown", lastchange=d, lastchange_sort=d[1] - d[0], sessionvars=sessionvars, archives=archivelist(u, "tip", url)) if (not sortcolumn or (sortcolumn, descending) == self.repos_sorted): # fast path for unsorted output row['parity'] = parity.next() yield row else: rows.append((row["%s_sort" % sortcolumn], row))
def get_table(qid, sort_link, cmp_run, cmptype, show_attr): # # this query finds all the test results that are an interesting part of this request # result_table = text_table.text_table() result_table.set_html_table_attributes("border=1") tda_table = text_table.text_table() tda_table.set_html_table_attributes("border=1") tra_table = text_table.text_table() tra_table.set_html_table_attributes("border=1") # note when we last touched this qid now = time.time() pdk_db.execute("UPDATE query_id SET time = :1 WHERE qid = :2", (now, qid)) # bump the expiration maybe expires = now + (pandokia.cfg.default_qid_expire_days * 86400) pdk_db.execute( "UPDATE query_id SET expires = :1 WHERE qid = :2 AND :1 > query_id.expires", (expires, qid)) pdk_db.commit() # c = pdk_db.execute("SELECT key_id FROM query WHERE qid = :1", (qid, )) result_table.define_column("line #", showname=' ') result_table.define_column("runner") result_table.define_column("checkbox", showname=' ') result_table.define_column("attn", link=sort_link + "Uattn") result_table.define_column("test_run", link=sort_link + "Utest_run") result_table.define_column("project", link=sort_link + "Uproject") result_table.define_column("host", link=sort_link + "Uhost") result_table.define_column("context", link=sort_link + "Ucontext") result_table.define_column("test_name", link=sort_link + "Utest_name") result_table.define_column("contact", link=sort_link + "Ucontact") #result_table.define_column("start", link=sort_link+"Ustart") result_table.define_column("duration", link=sort_link + "Uduration") if cmp_run != "": result_table.define_column("diff", link=sort_link + "Udiff") result_table.define_column("other", link=sort_link + "Uother") result_table.define_column("stat", link=sort_link + "Ustat") # these are used to suppress a column when all the results are the same all_test_run = {} all_project = {} all_host = {} all_context = {} different = 0 rowcount = 0 for x in c: (key_id, ) = x # # find the result of this test # c1 = pdk_db.execute( "SELECT test_run, project, host, context, test_name, status, attn, test_runner, start_time, end_time FROM result_scalar WHERE key_id = :1 ", (key_id, )) y = c1.fetchone() # unique index if y is None: # this can only happen if somebody deletes tests from the database after we populate the qid continue (test_run, project, host, context, test_name, status, attn, runner, start_time, end_time) = y # if we are comparing to another run, find the other one; # suppress lines that are different - should be optional if cmp_run != "": c2 = pdk_db.execute( "SELECT status, key_id FROM result_scalar WHERE test_run = :1 AND project = :2 AND host = :3 AND test_name = :4 AND context = :5", (cmp_run, project, host, test_name, context)) other_status = c2.fetchone() # unique index if other_status is None: pass else: (other_status, other_key_id) = other_status # if the other one is the same, go to next row if other_status == status: if cmptype == 'd': continue else: if cmptype == 's': continue result_table.set_value(rowcount, "diff", text=">") other_link = common.selflink({'key_id': other_key_id}, linkmode="detail") if other_status == "P": result_table.set_value(rowcount, "other", other_status, link=other_link) else: result_table.set_value(rowcount, "other", other_status, html="<font color=red>" + str(other_status) + "</font>", link=other_link) result_table.set_html_cell_attributes(rowcount, "other", "bgcolor=lightgray") if other_status != status: different = different + 1 all_test_run[test_run] = 1 all_project[project] = 1 all_host[host] = 1 all_context[context] = 1 detail_query = {"key_id": key_id} result_table.set_value(rowcount, "runner", runner) result_table.set_value(rowcount, "checkbox", '', html='<input type=checkbox name=%s>' % key_id) result_table.set_value(rowcount, "attn", attn) result_table.set_value(rowcount, "test_run", test_run) result_table.set_value(rowcount, "project", project) result_table.set_value(rowcount, "host", host) result_table.set_value(rowcount, "context", context) this_link = common.selflink(detail_query, linkmode="detail") result_table.set_value(rowcount, "test_name", text=test_name, link=this_link) result_table.set_value(rowcount, "contact", common.get_contact(project, test_name, 'str')) start_time = lib.decode_time_float(start_time) end_time = lib.decode_time_float(end_time) #result_table.set_value(rowcount,"start", lib.decode_time_str(start_time)) if start_time is not None and end_time is not None: result_table.set_value(rowcount, "duration", "%.3f" % (end_time - start_time)) if status == "P": result_table.set_value(rowcount, "stat", status, link=this_link) else: result_table.set_value(rowcount, "stat", status, html="<font color=red>" + str(status) + "</font>", link=this_link) if show_attr: c3 = pdk_db.execute( "SELECT name, value FROM result_tda WHERE key_id = :1 ORDER BY name ASC", (key_id, )) load_in_table(tda_table, rowcount, c3, "tda_", sort_link) del c3 c3 = pdk_db.execute( "SELECT name, value FROM result_tra WHERE key_id = :1 ORDER BY name ASC", (key_id, )) load_in_table(tra_table, rowcount, c3, "tra_", sort_link) del c3 rowcount += 1 del c1 if show_attr: result_table.join(tda_table) result_table.join(tra_table) return result_table, all_test_run, all_project, all_host, all_context, rowcount, different