summaryrefslogtreecommitdiffstats
path: root/website/convert-to-static.py
diff options
context:
space:
mode:
Diffstat (limited to 'website/convert-to-static.py')
-rw-r--r--website/convert-to-static.py281
1 files changed, 281 insertions, 0 deletions
diff --git a/website/convert-to-static.py b/website/convert-to-static.py
new file mode 100644
index 00000000..50293ba2
--- /dev/null
+++ b/website/convert-to-static.py
@@ -0,0 +1,281 @@
+#! /usr/bin/env python
+
+import xml.dom.minidom
+import os
+import stat
+import re
+from cStringIO import StringIO
+import sys
+
+import ezt
+
+base_template = ezt.Template()
+base_template.parse(file('templates/base.ezt').read())
+buildlog_template = ezt.Template()
+buildlog_template.parse(file('templates/buildlog.ezt').read())
+changelog_template = ezt.Template()
+changelog_template.parse(file('templates/changelog.ezt').read())
+tests_template = ezt.Template()
+tests_template.parse(file('templates/tests.ezt').read())
+
+def getText(nodelist):
+ if not nodelist:
+ return None
+ rc = ''
+ for node in nodelist:
+ if node.nodeType == node.TEXT_NODE:
+ rc = rc + node.data
+ return rc.encode('utf-8')
+
+
+class ChangelogFile:
+ def __init__(self, node):
+ for attr in ('name', 'revision'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+
+
+class ChangelogEntry:
+ def __init__(self, node):
+ for attr in ('date', 'weekday', 'time', 'isoDate', 'msg', 'author'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+ self.file = [ChangelogFile(x) for x in node.getElementsByTagName('file')]
+
+
+class TestTest:
+ def __init__(self, node):
+ for attr in ('id', 'description'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+ self.result = node.attributes['result'].value
+
+class TestSuite:
+ def __init__(self, node):
+ for attr in ('title', 'duration'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+ if self.duration:
+ self.duration = '%.4f' % float(self.duration)
+ self.test = [TestTest(x) for x in node.getElementsByTagName('test')]
+ self.len_tests = len(self.test)
+
+
+class Build:
+ def __init__(self, node):
+ for attr in ('date', 'hostname', 'duration', 'buildlog', 'buildlog295', 'changelog'):
+ try:
+ setattr(self, attr, getText(node.getElementsByTagName(attr)[0].childNodes))
+ except IndexError:
+ setattr(self, attr, None)
+
+ self.display_date = '%s-%s-%s' % (self.date[:4], self.date[4:6], self.date[6:8])
+ self.display_hour = '%s:%s' % (self.date[9:11], self.date[11:13])
+
+ for component in ('liblasso', 'java', 'python', 'php', 'perl', 'csharp', 'liblasso295'):
+ try:
+ cnode = [x for x in node.getElementsByTagName(component) if \
+ x.attributes.has_key('buildlog')][0]
+ except IndexError:
+ setattr(self, component + '_status', None)
+ continue
+ setattr(self, component + '_status', getText(cnode.childNodes))
+ setattr(self, component + '_href', cnode.attributes['buildlog'].value.replace('.xml',''))
+
+ for test in ('c', 'python', 'souk'):
+ try:
+ cnode = [x for x in node.getElementsByTagName(test) if \
+ x.attributes.has_key('href')][0]
+ except IndexError:
+ setattr(self, 'tests_' + test + '_status', None)
+ continue
+ setattr(self, 'tests_' + test + '_status', getText(cnode.childNodes))
+ setattr(self, 'tests_' + test + '_href', cnode.attributes['href'].value.replace('.xml', ''))
+
+ if self.changelog:
+ self.changelog = self.changelog.replace('.xml', '')
+ dom_cl = xml.dom.minidom.parse(file('web' + self.changelog + '.xml'))
+ self.last_commit_author = getText(dom_cl.getElementsByTagName('author')[0].childNodes)
+ self.nb_commits = len(dom_cl.getElementsByTagName('entry'))
+
+
+
+re_body = re.compile('<body(.*?)>(.*)</body>', re.DOTALL)
+re_div = re.compile('<div(.*?)>(.*)</div>', re.DOTALL)
+re_title = re.compile('<title>(.*)</title>', re.DOTALL)
+re_summary = re.compile('[a-z]+\.[0-9]{4}.xml')
+
+if not os.path.exists('web-static'):
+ os.mkdir('web-static')
+
+
+for BUILDLOGS_DIR in ('build-logs', 'build-logs-wsf'):
+ if not os.path.exists('web/%s' % BUILDLOGS_DIR):
+ continue
+ if not os.path.exists('web-static/%s' % BUILDLOGS_DIR):
+ os.mkdir('web-static/%s' % BUILDLOGS_DIR)
+
+ for base, dirs, files in os.walk('web/%s' % BUILDLOGS_DIR):
+ if base.endswith('/CVS'):
+ continue
+ for dirname in dirs:
+ src_file = os.path.join(base, dirname)
+ dst_file = 'web-static/' + src_file[4:]
+ if not os.path.exists(dst_file):
+ os.mkdir(dst_file)
+ for filename in files:
+ if filename[0] == '.':
+ continue
+ src_file = os.path.join(base, filename)
+ dst_file = 'web-static/' + src_file[4:].replace('.xml', '.html')
+ if os.path.exists(dst_file) and \
+ os.stat(dst_file)[stat.ST_MTIME] >= os.stat(src_file)[stat.ST_MTIME]:
+ continue
+ if src_file.endswith('.log'):
+ os.link(src_file, dst_file)
+ continue
+ if src_file.endswith('.html'):
+ try:
+ body = re_body.findall(file(src_file).read())[0][1].strip()
+ except IndexError:
+ raise "no body found"
+ fd = StringIO()
+ base_template.generate(fd, {'body': body, 'title': 'Build Log', 'section': 'buildbox'})
+ open(dst_file, 'w').write(fd.getvalue())
+ continue
+
+ try:
+ dom = xml.dom.minidom.parse(file(src_file))
+ except:
+ continue
+ type = dom.childNodes[0].nodeName
+ if type == 'changelog':
+ entries = [ChangelogEntry(x) for x in dom.getElementsByTagName('entry')]
+ fd = StringIO()
+ changelog_template.generate(fd, {'entry': entries})
+ body = fd.getvalue()
+ fd = StringIO()
+ base_template.generate(fd, {'body': body, 'title': 'ChangeLog', 'section': 'buildbox'})
+ open(dst_file, 'w').write(fd.getvalue())
+
+ if type == 'testsuites':
+ datetime = getText(dom.getElementsByTagName('datetime')[0].childNodes)
+ title = getText(dom.getElementsByTagName('title')[0].childNodes)
+ suites = [TestSuite(x) for x in dom.getElementsByTagName('suite')]
+ fd = StringIO()
+ tests_template.generate(fd, {'datetime': datetime, 'title': title,
+ 'suite': suites})
+ body = fd.getvalue()
+ fd = StringIO()
+ base_template.generate(fd, {'body': body,
+ 'title': 'Test Suite - %s' % title, 'section': 'buildbox'})
+ open(dst_file, 'w').write(fd.getvalue())
+
+
+ day_dirs = os.listdir('web/%s/' % BUILDLOGS_DIR)
+ day_dirs.sort()
+ day_dirs.reverse()
+ day_dirs = day_dirs[:20]
+
+ main_page = []
+
+ for base, dirs, files in os.walk('web/%s' % BUILDLOGS_DIR):
+ for dirname in dirs:
+ if dirname in day_dirs:
+ for t in [x for x in os.listdir(os.path.join(base, dirname)) if re_summary.match(x)]:
+ main_page.append(os.path.join(base, dirname, t))
+
+ main_page.sort()
+ main_page.reverse()
+ main_page = main_page[:20]
+ builds = []
+ for filename in main_page:
+ builds.append( Build(xml.dom.minidom.parse(filename)) )
+ if len(builds) > 1 and builds[-2].date[:8] == builds[-1].date[:8]:
+ builds[-1].display_date = ''
+
+ fd = StringIO()
+ buildlog_template.generate(fd, {'build': builds})
+ body = fd.getvalue()
+ fd = StringIO()
+ base_template.generate(fd, {'body': body, 'title': 'Build Box', 'section': 'buildbox'})
+ if BUILDLOGS_DIR == 'build-logs':
+ open('web-static/buildbox.html', 'w').write(fd.getvalue())
+ elif BUILDLOGS_DIR == 'build-logs-wsf':
+ open('web-static/buildbox-wsf.html', 'w').write(fd.getvalue())
+
+for base, dirs, files in os.walk('web'):
+ if '/build-logs' in base or '/news/' in base:
+ continue
+ if base.endswith('CVS'):
+ continue
+ for dirname in dirs:
+ if dirname in ('CVS', 'news'):
+ continue
+ src_file = os.path.join(base, dirname)
+ dst_file = 'web-static/' + src_file[4:]
+ if not os.path.exists(dst_file):
+ os.mkdir(dst_file)
+ for filename in files:
+ if filename in ('.cvsignore', 'buildbox.xml'):
+ continue
+ if filename[0] == '.':
+ continue
+ basename, ext = os.path.splitext(filename)
+ src_file = os.path.join(base, filename)
+ dst_file = 'web-static/' + src_file[4:]
+
+ if os.path.exists(dst_file) and \
+ os.stat(dst_file)[stat.ST_MTIME] >= os.stat(src_file)[stat.ST_MTIME]:
+ continue
+
+ if ext not in ('.html', '.xml') or filename.startswith('doap.') or \
+ 'api-reference' in src_file:
+ if os.path.exists(dst_file):
+ os.unlink(dst_file)
+ os.link(src_file, dst_file)
+ continue
+
+ type = None
+ if ext == '.xml':
+ try:
+ dom = xml.dom.minidom.parse(file(src_file))
+ except:
+ print src_file
+ raise
+ type = dom.childNodes[0].nodeName
+ dst_file = dst_file.replace('.xml', '.html')
+
+ news = None
+ if dst_file == 'web-static/index.html':
+ news_files = [x for x in os.listdir('web/news/') if x.endswith('.xml') and x[2] == '-']
+ news_files.sort()
+ news_files.reverse()
+ news_files = news_files[:3]
+ news = []
+ for f in news_files:
+ news.append('<div>%s</div>' % re_div.findall(file(os.path.join('web/news/', f)).read())[0][1].strip())
+ news = '\n'.join(news)
+
+ section = src_file.split('/')[1].replace('.xml', '')
+ if ext == '.html' or type == 'html':
+ content = file(src_file).read()
+ try:
+ body = re_body.findall(content)[0][1].strip()
+ except IndexError:
+ raise "no body found"
+ title = re_title.findall(content)[0]
+ fd = StringIO()
+ base_template.generate(fd, {'body': body, 'title': title, 'section': section,
+ 'news': news})
+ open(dst_file, 'w').write(fd.getvalue())
+ continue
+