source: 2011/31/build_games.py @ 2567

Revision 2492, 4.6 KB checked in by tekrjant, 8 years ago (diff)

Viikonpäivä näkyy suomeksi.

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 datetime import *
10import re
11
12
13output_dir = abspath("pelit")
14build_result_dir = abspath("build")
15lib_dir_x86 = abspath('lib\\x86')
16personal_dirs = [d for d in os.listdir(".") if isdir(d) and d not in ("lib", basename(output_dir), ".svn")]
17projects_that_did_not_build = []
18msbuild = "msbuild"
19
20
21
22def check_requirements():
23        global msbuild
24        if not exists("lib\\x86\\Jypeli4.dll"):
25                raise Exception("lib\\x86\\Jypeli4.dll expected")
26        return_code = call(msbuild + " /? 1> NUL 2> NUL", shell=True)
27        if return_code != 0:
28                msbuild = join(os.getenv("SystemRoot"), "Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe")
29                if not exists(msbuild):
30                        raise Exception("MSBuild not found in " + msbuild)
31
32
33def create_output_directory():
34        if not exists(output_dir):
35                os.mkdir(output_dir)
36        for d in personal_dirs:
37                if not exists(join(output_dir, d)):
38                        os.mkdir(join(output_dir, d))
39
40def create_build_result_directory():
41        if not exists(build_result_dir):
42                os.mkdir(build_result_dir)
43
44
45def parse_last_changed_date(svn_info_output):
46    match = re.search("Last Changed Date: (\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d) (\\d\\d):(\\d\\d)", svn_info_output)
47    if not match:
48        raise Exception("Last Changed Date not found from svn info output!")
49    year = int(match.group(1))
50    month = int(match.group(2))
51    day = int(match.group(3))
52    hour = int(match.group(4))
53    minute = int(match.group(5))
54    return datetime(year=year, month=month, day=day, hour=hour, minute=minute)
55
56
57def build_games():
58        for d in personal_dirs:
59                path = abspath(d)
60                if exists(join(path, ".svn")):
61                        call("svn update " + path, shell=True)
62                        outputs = Popen("svn info " + path, stdout=PIPE).communicate()
63                        time = parse_last_changed_date(outputs[0])
64                build_games_in_personal_dir(path, time)
65
66
67counter = 1
68
69
70def get_weekday_name(n):
71        if n == 0: return "Maanantai"
72        if n == 1: return "Tiistai"
73        if n == 2: return "Keskiviikko"
74        if n == 3: return "Torstai"
75        if n == 4: return "Perjantai"
76        if n == 5: return "Lauantai"
77        if n == 6: return "Sunnuntai"
78        raise Exception("Invalid weekday number")
79
80def write_result(author, name, success, last_changed_date):
81        global counter
82        with open(join(build_result_dir, str(counter)+".txt"), "w") as f:
83                f.write(author+"\n")
84                f.write(name+"\n")
85                result = "success"
86                if not success:
87                        result = "fail"
88                f.write(result+"\n")
89                formatted_time = get_weekday_name(last_changed_date.weekday()) + last_changed_date.strftime(" %H:%M")
90                f.write(formatted_time+"\n")
91        counter += 1
92
93
94def build_games_in_personal_dir(personal_dir, last_changed_date):
95        for root, dirs, files in os.walk(personal_dir):
96                if '.svn' in dirs:
97                        dirs.remove('.svn')
98                projects = glob(join(root, '*.csproj'))
99                if projects:
100                        if len(projects) > 1:
101                                print "NOTE: There is more than one project file in", root
102
103                        project_name = splitext(basename(projects[0]))[0]
104                        author = basename(personal_dir)
105
106                        success = build(projects[0])
107                        write_result(author, project_name, success, last_changed_date)
108
109                        if success:
110                                dst_dir = join(output_dir, author)
111                                copy_game(project_name, root, dst_dir)
112                                print author + ": " + project_name
113                        else:
114                                projects_that_did_not_build.append(projects[0])
115
116
117def build(project_file_path):
118        build_cmd = msbuild + ' /nologo /verbosity:quiet /p:XnaProfile=Reach /p:Configuration=Release /p:"ReferencePath=%s" /t:Build "%s"' % (lib_dir_x86, project_file_path)
119        return call(build_cmd, shell=True) == 0
120
121
122def copy_game(project_name, project_dir, dst_dir):
123        bin = join(project_dir, "bin\\x86\\Release")
124        if not exists(bin):
125                print "NO BIN DIR FOUND IN", project_dir
126        dst = join(dst_dir, project_name)
127        if exists(dst):
128                rmtree(dst)
129        copytree(bin, dst, ignore=shutil.ignore_patterns('.svn', '*.pdb', 'jypeli4.xml'))
130
131
132
133def main():
134        try:
135                check_requirements()
136                create_output_directory()
137                create_build_result_directory()
138                build_games()
139        except KeyboardInterrupt:
140                print "BUILD CANCELLED"
141        except Exception, e:
142                print
143                print "NOT SUCCESSFUL:", e
144                return 1
145
146        print
147        print 'Projects that did not build (%d):' % len(projects_that_did_not_build)
148        for p in projects_that_did_not_build:
149                print p
150
151
152if __name__ == '__main__':
153        sys.exit(main())
Note: See TracBrowser for help on using the repository browser.