diff --git a/abichecker/abichecker.py b/abichecker/abichecker.py index 3f62ac63..c19b312c 100755 --- a/abichecker/abichecker.py +++ b/abichecker/abichecker.py @@ -32,6 +32,7 @@ import subprocess import sys import time import abichecker_dbmodel as DB +import sqlalchemy.orm.exc try: from xml.etree import cElementTree as ET @@ -103,6 +104,17 @@ class MissingDebugInfo(Exception): def __str__(self): return self.msg +class LogToDB(logging.Filter): + def __init__(self, session): + self.session = session + self.request_id = None + + def filter(self, record): + if self.request_id is not None and record.levelno >= logging.INFO: + logentry = DB.Log(request_id = self.request_id, line = record.getMessage()) + self.session.add(logentry) + return True + class ABIChecker(ReviewBot.ReviewBot): """ check ABI of library packages """ @@ -123,10 +135,16 @@ class ABIChecker(ReviewBot.ReviewBot): # reports of source submission self.reports = [] + # textual report summary for use in accept/decline message + # or comments self.text_summary = '' self.session = DB.db_session() + self.dblogger = LogToDB(self.session) + + self.logger.addFilter(self.dblogger) + self.commentapi = CommentAPI(self.apiurl) def check_source_submission(self, src_project, src_package, src_rev, dst_project, dst_package): @@ -278,7 +296,7 @@ class ABIChecker(ReviewBot.ReviewBot): reportfn = os.path.join(CACHEDIR, htmlreport) r = self.run_abi_checker(m.group(1), old_dump, new_dump, reportfn) if r is not None: - self.logger.info('report saved to %s, compatible: %d', reportfn, r) + self.logger.debug('report saved to %s, compatible: %d', reportfn, r) libresults.append(LibResult(mr.srcrepo, os.path.basename(old), mr.dstrepo, os.path.basename(new), mr.arch, htmlreport, r)) if overall is None: overall = r @@ -313,6 +331,8 @@ class ABIChecker(ReviewBot.ReviewBot): def check_one_request(self, req): + self.dblogger.request_id = req.reqid + self.review_messages = ReviewBot.ReviewBot.DEFAULT_REVIEW_MESSAGES commentid, state, result = self.find_abichecker_comment(req) @@ -347,18 +367,21 @@ class ABIChecker(ReviewBot.ReviewBot): if self.no_review: ret = None + self.dblogger.request_id = None + return ret def save_reports_to_db(self, req, state, result): - request = self.session.query(DB.Request).filter(DB.Request.id == req.reqid).one() - if request: - self.session.query(DB.ABICheck).filter(DB.ABICheck.request_id == req.reqid).delete() - else: + try: + request = self.session.query(DB.Request).filter(DB.Request.id == req.reqid).one() + self.session.query(DB.ABICheck).filter(DB.ABICheck.request_id == request.id).delete() + self.session.flush() + except sqlalchemy.orm.exc.NoResultFound, e: request = DB.Request(id = req.reqid, state = state, result = result, ) - self.session.add(request) + self.session.add(request) self.session.commit() for r in self.reports: abicheck = DB.ABICheck( @@ -372,7 +395,6 @@ class ABIChecker(ReviewBot.ReviewBot): ) self.session.add(abicheck) self.session.commit() - self.logger.info("id %d"%abicheck.id) if r.result: self.text_summary += "%s seems to be ABI [compatible](%s/%d):\n\n"%(r.dst_package, WEB_URL, abicheck.id) else: @@ -448,7 +470,6 @@ class ABIChecker(ReviewBot.ReviewBot): if not fetchlist: msg = "no libraries found in %s/%s %s/%s"%(project, package, repo, arch) self.logger.info(msg) - self.text_summary += msg +"\n" return None # mtimes in cpio are not the original ones, so we need to fetch diff --git a/abichecker/abichecker_dbmodel.py b/abichecker/abichecker_dbmodel.py index 4501315d..b5c481e6 100644 --- a/abichecker/abichecker_dbmodel.py +++ b/abichecker/abichecker_dbmodel.py @@ -35,15 +35,23 @@ class Request(Base): id = Column(Integer, primary_key=True) state = Column(String(32), nullable=False) result = Column(String(32), nullable=True) - log = Column(Text(), nullable=True) t_created = Column(DateTime, default=datetime.now) t_updated = Column(DateTime, default=datetime.now, onupdate=datetime.now) +class Log(Base): + __tablename__ = 'log' + id = Column(Integer, primary_key=True) + request_id = Column(Integer, ForeignKey('request.id'), nullable=False) + request = relationship(Request, backref=backref('log', order_by=id, cascade="all, delete-orphan")) + line = Column(Text(), nullable=True) + + t_created = Column(DateTime, default=datetime.now) + class ABICheck(Base): __tablename__ = 'abicheck' id = Column(Integer, primary_key=True) - request_id = Column(Integer, ForeignKey('request.id')) + request_id = Column(Integer, ForeignKey('request.id'), nullable=False) request = relationship(Request, backref=backref('abichecks', order_by=id, cascade="all, delete-orphan")) src_project = Column(String(255), nullable=False) @@ -59,7 +67,7 @@ class ABICheck(Base): class LibReport(Base): __tablename__ = 'libreport' id = Column(Integer, primary_key=True) - submission_id = Column(Integer, ForeignKey('abicheck.id')) + submission_id = Column(Integer, ForeignKey('abicheck.id'), nullable=False) abicheck = relationship(ABICheck, backref=backref('reports', order_by=id, cascade="all, delete-orphan")) src_repo = Column(String(255), nullable=False) diff --git a/abichecker/templates/request.html b/abichecker/templates/request.html index a543d992..cca211e9 100644 --- a/abichecker/templates/request.html +++ b/abichecker/templates/request.html @@ -42,6 +42,13 @@ {% endfor %} + {% if request.log %} +
+{% for entry in request.log %} +{{ entry.t_created }} {{ entry.line }}{% endfor %} ++ {% endif %} {% endblock %}