2012-07-18 14:36:07 +04:00
|
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
2012-11-04 12:00:06 +04:00
|
|
|
from __future__ import print_function, unicode_literals
|
|
|
|
|
|
|
|
import collections
|
2012-07-18 14:36:07 +04:00
|
|
|
import json
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
2013-02-26 00:46:50 +04:00
|
|
|
import writeBuildFiles
|
2012-07-18 14:36:07 +04:00
|
|
|
|
|
|
|
def extractLines(fp):
|
|
|
|
lines = []
|
|
|
|
watch = False
|
|
|
|
for line in fp:
|
2012-12-02 12:52:18 +04:00
|
|
|
line = line.decode('utf-8')
|
2012-07-18 14:36:07 +04:00
|
|
|
if line == '@@@ @@@ Failures\n':
|
|
|
|
watch = True
|
|
|
|
elif watch:
|
|
|
|
watch = False
|
|
|
|
idx = line.index('@@@')
|
|
|
|
lines.append((line[:idx], line[idx + 3:]))
|
|
|
|
return lines
|
|
|
|
|
|
|
|
def ensuredir(path):
|
|
|
|
dir = path[:path.rfind('/')]
|
|
|
|
if not os.path.exists(dir):
|
|
|
|
os.makedirs(dir)
|
|
|
|
|
|
|
|
def dumpFailures(lines):
|
|
|
|
files = []
|
|
|
|
for url, objstr in lines:
|
|
|
|
if objstr == '{}\n':
|
|
|
|
continue
|
|
|
|
|
2012-09-30 11:52:06 +04:00
|
|
|
# Avoid overly large diffs.
|
2012-10-14 11:46:46 +04:00
|
|
|
if 'editing/' in url:
|
2012-09-30 11:52:06 +04:00
|
|
|
sep = ':'
|
|
|
|
else:
|
|
|
|
sep = ': '
|
|
|
|
|
2012-07-18 14:36:07 +04:00
|
|
|
jsonpath = 'failures/' + url + '.json'
|
|
|
|
files.append(jsonpath)
|
|
|
|
ensuredir(jsonpath)
|
2012-09-28 14:25:35 +04:00
|
|
|
obj = json.loads(objstr, object_pairs_hook=collections.OrderedDict)
|
2012-12-02 12:52:18 +04:00
|
|
|
formattedobjstr = json.dumps(obj, indent=2, separators=(',', sep)) + '\n'
|
|
|
|
formattedobj = formattedobjstr.encode('utf-8')
|
|
|
|
fp = open(jsonpath, 'wb')
|
|
|
|
fp.write(formattedobj)
|
2012-07-18 14:36:07 +04:00
|
|
|
fp.close()
|
|
|
|
return files
|
|
|
|
|
2013-02-26 00:46:50 +04:00
|
|
|
def writeFiles(files):
|
2012-07-18 14:36:07 +04:00
|
|
|
pathmap = {}
|
|
|
|
for path in files:
|
|
|
|
dirp, leaf = path.rsplit('/', 1)
|
|
|
|
pathmap.setdefault(dirp, []).append(leaf)
|
|
|
|
|
2012-11-04 12:00:06 +04:00
|
|
|
for k, v in pathmap.items():
|
2013-02-26 00:46:50 +04:00
|
|
|
with open(k + '/Makefile.in', 'wb') as fh:
|
|
|
|
result = writeBuildFiles.substMakefile('parseFailures.py', v)
|
|
|
|
result = result.encode('utf-8')
|
|
|
|
fh.write(result)
|
2012-07-18 14:36:07 +04:00
|
|
|
|
2013-02-26 00:46:50 +04:00
|
|
|
with open(k + '/moz.build', 'wb') as fh:
|
|
|
|
result = writeBuildFiles.substMozbuild('parseFailures.py', [])
|
|
|
|
result = result.encode('utf-8')
|
|
|
|
fh.write(result)
|
2012-07-18 14:36:07 +04:00
|
|
|
|
|
|
|
def main(logPath):
|
2012-12-02 12:52:18 +04:00
|
|
|
fp = open(logPath, 'rb')
|
2012-07-18 14:36:07 +04:00
|
|
|
lines = extractLines(fp)
|
|
|
|
fp.close()
|
|
|
|
|
|
|
|
files = dumpFailures(lines)
|
2013-02-26 00:46:50 +04:00
|
|
|
writeFiles(files)
|
2012-07-18 14:36:07 +04:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
if len(sys.argv) < 2:
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Please pass the path to the logfile from which failures should be extracted.")
|
2012-07-18 14:36:07 +04:00
|
|
|
main(sys.argv[1])
|
2013-02-26 00:46:50 +04:00
|
|
|
|