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