Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Improve MSG_file_read() and MSG_file_write()
[simgrid.git] / tools / generate-multi-jar.py
1 #!/usr/bin/python
2
3 # Copyright (c) 2013-2014. The SimGrid Team.
4 # All rights reserved.
5
6 # This program is free software; you can redistribute it and/or modify it
7 # under the terms of the license (GNU LGPL) which comes with this package.
8
9 """
10 Tool to generate the simgrid.jar
11 """
12 import urllib2
13 import zipfile
14 import tempfile
15 import os, sys, re
16
17 dists = ['https://ci.inria.fr/simgrid/job/SimGrid-Multi/build_mode=Debug,label=%s/lastSuccessfulBuild/artifact/build/SimGrid-3.11/simgrid_full.jar'%dist
18          for dist in ["small-debian-32"
19                      ,"small-debian-64"
20                      ,"small-freebsd-64-clang"]]
21 dists.append('https://ci.inria.fr/simgrid/job/Simgrid-Mult-Win7/build_mode=Debug,label=windows-64/lastSuccessfulBuild/artifact/build/simgrid_full.jar')
22
23 class SimJar(object):
24   def __init__(self, filename='simgrid.jar'):
25         self.zipfile = zipfile.ZipFile(filename, 'w')
26         self.done = set()
27         self.git_version = None
28
29   def addJar(self, filename):
30     with zipfile.ZipFile(filename) as zf:
31       platform = None
32       arch = None
33       git_version = None
34       for z in zf.infolist():
35         path = filter(None, z.filename.split('/'))
36         if len(path)==3 and path[0] == 'NATIVE':
37           platform, arch = path[1:3]
38         elif z.filename=='META-INF/MANIFEST.MF':
39           zf.read('META-INF/MANIFEST.MF')      
40           git_version = re.findall(r"Implementation-Version: \"(.*?)\"", zf.read('META-INF/MANIFEST.MF'))
41       
42       assert platform is not None and git_version is not None, "Jar file not valid"
43       print "Adding: %s %s"%(platform, arch)
44       if self.git_version is None:
45         self.git_version = git_version
46       elif self.git_version != git_version:
47         print "WARNING: Assembling jar of various commits (%s vs %s)"%(self.git_version, git_version)
48       
49       for info in zf.infolist():
50         if info.filename not in self.done:
51           self.done.add(info.filename)
52           self.zipfile.writestr(info, zf.read(info.filename))
53
54   def addByUrl(self, url):
55     data = urllib2.urlopen(url)
56     f = tempfile.NamedTemporaryFile(delete=False)
57     f.write(data.read())
58     f.close()
59     self.addJar(f.name)
60     os.unlink(f.name)
61
62   def close(self):
63         self.zipfile.close()
64
65 if __name__=="__main__":
66   jar = SimJar()
67   for dist in dists:
68         jar.addByUrl(dist)
69   for a in sys.argv[1:]:
70         jar.addJar(a)
71   jar.close()