Variety of fixes all over the place
[blender-buildbot.git] / master_unpack.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # Runs on Buildbot master, to unpack incoming unload.zip into latest
20 # builds directory and remove older builds.
21
22 # <pep8 compliant>
23
24 import os
25 import shutil
26 import sys
27 import zipfile
28
29
30 # extension stripping
31 def strip_extension(filename):
32     extensions = '.zip', '.tar', '.bz2', '.gz', '.tgz', '.tbz', '.exe'
33
34     for ext in extensions:
35         if filename.endswith(ext):
36             filename = filename[:-len(ext)]
37
38     return filename
39
40
41 # extract platform from package name
42 def get_platform(filename):
43     # name is blender-version-platform.extension. we want to get the
44     # platform out, but there may be some variations, so we fiddle a
45     # bit to handle current and hopefully future names
46     filename = strip_extension(filename)
47     filename = strip_extension(filename)
48
49     tokens = filename.split("-")
50     platforms = ('osx', 'mac', 'bsd',
51                  'win', 'linux', 'source',
52                  'irix', 'solaris', 'mingw')
53     platform_tokens = []
54     found = False
55
56     for i, token in enumerate(tokens):
57         if not found:
58             for platform in platforms:
59                 if platform in token.lower():
60                     found = True
61                     break
62
63         if found:
64             platform_tokens += [token]
65
66     return '-'.join(platform_tokens)
67
68
69 def get_branch(filename):
70     tokens = filename.split("-")
71     branch = ""
72
73     for token in tokens:
74         if token == "blender":
75             return branch
76
77         if branch == "":
78             branch = token
79         else:
80             branch = branch + "-" + token
81
82     return ""
83
84 # get filename
85 if len(sys.argv) < 2:
86     sys.stderr.write("Not enough arguments, expecting file to unpack\n")
87     sys.exit(1)
88
89 filename = sys.argv[1]
90
91 # open zip file
92 if not os.path.exists(filename):
93     sys.stderr.write("File %r not found.\n" % filename)
94     sys.exit(1)
95
96 try:
97     z = zipfile.ZipFile(filename, "r")
98 except Exception as ex:
99     sys.stderr.write('Failed to open zip file: %s\n' % str(ex))
100     sys.exit(1)
101
102 if len(z.namelist()) != 1:
103     sys.stderr.write("Expected one file in %r." % filename)
104     sys.exit(1)
105
106 package = z.namelist()[0]
107 packagename = os.path.basename(package)
108
109 # detect platform and branch
110 platform = get_platform(packagename)
111 branch = get_branch(packagename)
112
113 if platform == '':
114     sys.stderr.write('Failed to detect platform ' +
115         'from package: %r\n' % packagename)
116     sys.exit(1)
117
118 # extract
119 if not branch or branch == 'master':
120     directory = 'public_html/download'
121 elif branch == 'experimental-build':
122     directory = 'public_html/download/experimental'
123 else:
124     directory = 'public_html/download'
125
126 try:
127     filename = os.path.join(directory, packagename)
128     zf = z.open(package)
129     f = file(filename, "wb")
130
131     shutil.copyfileobj(zf, f)
132     os.chmod(filename, 0644)
133
134     zf.close()
135     z.close()
136 except Exception as ex:
137     sys.stderr.write('Failed to unzip package: %s\n' % str(ex))
138     sys.exit(1)
139
140 # remove other files from the same platform and branch
141 try:
142     for f in os.listdir(directory):
143         if get_platform(f) == platform and get_branch(f) == branch:
144             if f != packagename:
145                 os.remove(os.path.join(directory, f))
146 except Exception as ex:
147     sys.stderr.write('Failed to remove old packages: %s\n' % str(ex))
148     sys.exit(1)