source: 2011/26/build_games.py @ 2365

Revision 2359, 4.1 KB checked in by tekrjant, 8 years ago (diff)

CSS embedded to the web page.

Line 
1from __future__ import with_statement
2import sys
3import os
4from os.path import *
5import shutil
6from shutil import *
7from glob import *
8from subprocess import *
9from xml.dom.minidom import Document
10
11
12report_location = "\\\\eppu.it.jyu.fi\\kurssit\\npo\\temp"
13output_dir = abspath("pelit")
14lib_dir_x86 = abspath('lib\\x86')
15personal_dirs = [d for d in os.listdir(".") if isdir(d) and d not in ("lib", basename(output_dir), ".svn")]
16projects_that_did_not_build = []
17report = Document()
18table = None
19msbuild = "msbuild"
20
21CSS = """
22tr {
23  color: white;
24}
25
26.success {
27  background-color: green;
28}
29
30.fail {
31  background-color: red;
32}
33"""
34
35
36def check_requirements():
37        global msbuild
38        if not exists("lib\\x86\\Jypeli4.dll"):
39                raise Exception("lib\\x86\\Jypeli4.dll expected")
40        return_code = call(msbuild + " /? 1> NUL 2> NUL", shell=True)
41        if return_code != 0:
42                msbuild = join(os.getenv("SystemRoot"), "Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe")
43                if not exists(msbuild):
44                        raise Exception("MSBuild not found in " + msbuild)
45
46
47def create_output_directory():
48        if not exists(output_dir):
49                os.mkdir(output_dir)
50        for d in personal_dirs:
51                if not exists(join(output_dir, d)):
52                        os.mkdir(join(output_dir, d))
53
54def build_games():
55        for d in personal_dirs:
56                build_games_in_personal_dir(abspath(d))
57
58
59def addElement(parent, name):
60        node = report.createElement(name)
61        parent.appendChild(node)
62        return node
63
64
65def addTextElement(parent, name, value):
66        node = report.createElement(name)
67        parent.appendChild(node)
68        node.appendChild(report.createTextNode(str(value)))
69        return node
70
71
72def add_to_report(author, name, success):
73        style = "success"
74        if not success:
75                style = "fail"
76        tr = addElement(table, "tr")
77        tr.setAttribute("class", style)
78        addTextElement(tr, "td", author)
79        addTextElement(tr, "td", name)
80
81
82def build_games_in_personal_dir(personal_dir):
83        for root, dirs, files in os.walk(personal_dir):
84                if '.svn' in dirs:
85                        dirs.remove('.svn')
86                projects = glob(join(root, '*.csproj'))
87                if projects:
88                        if len(projects) > 1:
89                                print "NOTE: There is more than one project file in", root
90
91                        project_name = splitext(basename(projects[0]))[0]
92                        author = basename(personal_dir)
93
94                        success = build(projects[0])
95                        add_to_report(author, project_name, success)
96
97                        if success:
98                                dst_dir = join(output_dir, author)
99                                copy_game(project_name, root, dst_dir)
100                                print author + ": " + project_name
101                        else:
102                                projects_that_did_not_build.append(projects[0])
103
104
105def build(project_file_path):
106        build_cmd = msbuild + ' /nologo /verbosity:quiet /p:XnaProfile=Reach /p:Configuration=Release /p:"ReferencePath=%s" /t:Build "%s"' % (lib_dir_x86, project_file_path)
107        return call(build_cmd, shell=True) == 0
108
109
110def copy_game(project_name, project_dir, dst_dir):
111        bin = join(project_dir, "bin\\x86\\Release")
112        if not exists(bin):
113                print "NO BIN DIR FOUND IN", project_dir
114        dst = join(dst_dir, project_name)
115        if exists(dst):
116                rmtree(dst)
117        copytree(bin, dst, ignore=shutil.ignore_patterns('.svn', '*.pdb', 'jypeli4.xml'))
118
119
120def initialize_report():
121        html = addElement(report, "html")
122
123        refresh_tag = addElement(html, "meta")
124        refresh_tag.setAttribute("http-equiv", "refresh")
125        refresh_tag.setAttribute("content", "30")
126
127        head = addElement(html, "head")
128        style = addTextElement(head, "style", CSS)
129        style.setAttribute("type", "text/css")
130        addTextElement(head, "title", "Build")
131
132        body = addElement(html, "body")
133        global table
134        table = addElement(body, "table")
135
136
137def write_report():
138        with open(join(report_location, "build_report.html"), "w") as f:
139                f.write(report.toprettyxml())
140
141
142def main():
143        try:
144                check_requirements()
145                initialize_report()
146                create_output_directory()
147                build_games()
148                write_report()
149        except KeyboardInterrupt:
150                print "BUILD CANCELLED"
151        except Exception, e:
152                print
153                print "NOT SUCCESSFUL:", e
154                return 1
155
156        print
157        print 'Projects that did not build (%d):' % len(projects_that_did_not_build)
158        for p in projects_that_did_not_build:
159                print p
160
161
162if __name__ == '__main__':
163        sys.exit(main())
Note: See TracBrowser for help on using the repository browser.