# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-from buildfarm.sqldb import distinct_builds, Cast, StormBuild, setup_schema, StormCachingBuildResultStore, StormHostDatabase
+from buildfarm.build import BuildStatus
+from buildfarm.sqldb import distinct_builds, Cast, StormBuild, setup_schema, StormHostDatabase
from buildfarm.tree import Tree
from storm.database import create_database
from storm.expr import Desc
def lcov_extract_percentage(f):
"""Extract the coverage percentage from the lcov file."""
- m = re.search('\<td class="headerItem".*?\>Code\ \;covered\:\<\/td\>.*?\n.*?\<td class="headerValue".*?\>([0-9.]+) \%', f.read())
+ m = re.search('\<td class="headerCovTableEntryLo".*?\>([0-9.]+) \%', f.read())
if m:
return m.group(1)
else:
class BuildFarm(object):
- LCOVHOST = "magni"
+ LCOVHOST = "coverage"
OLDAGE = 60*60*4,
DEADAGE = 60*60*24*4
def _open_build_results(self):
path = os.path.join(self.path, "data", "oldrevs")
- return StormCachingBuildResultStore(path, self._get_store())
+ from buildfarm.build import BuildResultStore
+ return BuildResultStore(path, self._get_store())
def _open_upload_build_results(self):
from buildfarm.build import UploadBuildResultStore
finally:
lcov_html.close()
+ def unused_fns(self, tree):
+ """get status of build"""
+ from buildfarm.build import NoSuchBuildError
+ file = os.path.join(self.lcovdir, self.LCOVHOST, tree, "unused-fns.txt")
+ try:
+ unused_fns_file = open(file, 'r')
+ except (OSError, IOError):
+ # File does not exist
+ raise NoSuchBuildError(tree, self.LCOVHOST, "unused_fns")
+ try:
+ return "unused-fns.txt"
+ finally:
+ unused_fns_file.close()
+
def get_build(self, tree, host, compiler, rev=None, checksum=None):
if rev is not None:
return self.builds.get_build(tree, host, compiler, rev,
result = self._get_store().find(StormBuild)
return distinct_builds(result.order_by(Desc(StormBuild.upload_time)))
+ def get_summary_builds(self, min_age=0):
+ """Return last build age, status for each tree/host/compiler.
+
+ :param min_age: Minimum timestamp of builds to report
+ :return: iterator over tree, status
+ """
+ store = self._get_store()
+ return ((tree, BuildStatus.__deserialize__(status_str))
+ for (tree, status_str) in store.execute("""
+SELECT obd.tree, obd.status AS status_str
+FROM build obd
+INNER JOIN(
+ SELECT MAX(age) age, tree, host, compiler
+ FROM build
+ WHERE age > ?
+ GROUP BY tree, host, compiler
+) ibd ON obd.age = ibd.age AND
+ obd.tree = ibd.tree AND
+ obd.host = ibd.host AND
+ obd.compiler = ibd.compiler;
+""", (min_age, )))
+
def get_tree_builds(self, tree):
result = self._get_store().find(StormBuild,
Cast(StormBuild.tree, "TEXT") == Cast(tree, "TEXT"))
def _get_store(self):
if self.store is not None:
return self.store
- db_path = os.path.join(self.path, "db", "hostdb.sqlite")
+ db_dir_path = os.path.join(self.path, "db")
+ if not os.path.isdir(db_dir_path):
+ os.mkdir(db_dir_path)
+ db_path = os.path.join(db_dir_path, "hostdb.sqlite")
db = create_database("sqlite:%s?timeout=%f" % (db_path, self.timeout))
self.store = Store(db)
setup_schema(self.store)