cb63c1d3ffc3193fc5d76415bc530151afce0b22
[blender.git] / build_files / buildbot / 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     filename_noext, ext = os.path.splitext(filename)
34     if ext in extensions:
35         return strip_extension(filename_noext)  # may have .tar.bz2
36     else:
37         return filename
38
39
40 # extract platform from package name
41 def get_platform(filename):
42     # name is blender-version-platform.extension. we want to get the
43     # platform out, but there may be some variations, so we fiddle a
44     # bit to handle current and hopefully future names
45     filename = strip_extension(filename)
46     filename = strip_extension(filename)
47
48     tokens = filename.split("-")
49     platforms = ('osx', 'mac', 'bsd',
50                  'win', 'linux', 'source',
51                  'irix', 'solaris')
52     platform_tokens = []
53     found = False
54
55     for token in tokens:
56         if not found:
57             for platform in platforms:
58                 if platform in token.lower():
59                     found = True
60                     break
61
62         if found:
63             platform_tokens += [token]
64
65     return '-'.join(platform_tokens)
66
67
68 def get_branch(filename):
69     tokens = filename.split("-")
70     branch = ""
71
72     for token in tokens:
73         if branch == "":
74             branch = token
75         else:
76             branch = branch + "-" + token
77
78         if token == "blender":
79             return branch
80
81     return ""
82
83 # get filename
84 if len(sys.argv) < 2:
85     sys.stderr.write("Not enough arguments, expecting file to unpack\n")
86     sys.exit(1)
87
88 filename = sys.argv[1]
89
90 # open zip file
91 if not os.path.exists(filename):
92     sys.stderr.write("File %r not found.\n" % filename)
93     sys.exit(1)
94
95 try:
96     z = zipfile.ZipFile(filename, "r")
97 except Exception, ex:
98     sys.stderr.write('Failed to open zip file: %s\n' % str(ex))
99     sys.exit(1)
100
101 if len(z.namelist()) != 1:
102     sys.stderr.write("Expected one file in %r." % filename)
103     sys.exit(1)
104
105 package = z.namelist()[0]
106 packagename = os.path.basename(package)
107
108 # detect platform and branch
109 platform = get_platform(packagename)
110 branch = get_branch(packagename)
111
112 if platform == '':
113     sys.stderr.write('Failed to detect platform ' +
114         'from package: %r\n' % packagename)
115     sys.exit(1)
116
117 # extract
118 directory = 'public_html/download'
119
120 try:
121     zf = z.open(package)
122     f = file(os.path.join(directory, packagename), "wb")
123
124     shutil.copyfileobj(zf, f)
125
126     zf.close()
127     z.close()
128
129     os.remove(filename)
130 except Exception, ex:
131     sys.stderr.write('Failed to unzip package: %s\n' % str(ex))
132     sys.exit(1)
133
134 # remove other files from the same platform and branch
135 try:
136     for f in os.listdir(directory):
137         if get_platform(f) == platform and get_branch(f) == branch:
138             if f != packagename:
139                 os.remove(os.path.join(directory, f))
140 except Exception, ex:
141     sys.stderr.write('Failed to remove old packages: %s\n' % str(ex))
142     sys.exit(1)