comparison mx/mx_graal.py @ 21105:db2de6c2bf95

mx create each service file atomically
author Gilles Duboscq <gilles.m.duboscq@oracle.com>
date Thu, 23 Apr 2015 21:26:04 +0200
parents 9690597d7a29
children ae4941602cfa
comparison
equal deleted inserted replaced
21104:9690597d7a29 21105:db2de6c2bf95
662 if classification[className] is True: 662 if classification[className] is True:
663 filtered.append(className) 663 filtered.append(className)
664 return filtered 664 return filtered
665 665
666 def _extractGraalServiceFiles(graalJars, destination, cleanDestination=True): 666 def _extractGraalServiceFiles(graalJars, destination, cleanDestination=True):
667 graalServices = set()
668 if cleanDestination: 667 if cleanDestination:
669 if exists(destination): 668 if exists(destination):
670 shutil.rmtree(destination) 669 shutil.rmtree(destination)
671 os.makedirs(destination) 670 os.makedirs(destination)
671 servicesMap = {}
672 for jar in graalJars: 672 for jar in graalJars:
673 if os.path.isfile(jar): 673 if os.path.isfile(jar):
674 with zipfile.ZipFile(jar) as zf: 674 with zipfile.ZipFile(jar) as zf:
675 services = []
676 for member in zf.namelist(): 675 for member in zf.namelist():
677 if not member.startswith('META-INF/services'): 676 if not member.startswith('META-INF/services'):
678 continue 677 continue
679 serviceName = basename(member) 678 serviceName = basename(member)
680 # we don't handle directories 679 # we don't handle directories
681 assert serviceName and member == 'META-INF/services/' + serviceName 680 assert serviceName and member == 'META-INF/services/' + serviceName
682 services.append(serviceName)
683 services = _filterGraalService(services, graalJars)
684 for serviceName in services:
685 graalServices.add(serviceName)
686 target = join(destination, serviceName)
687 lines = []
688 with zf.open(member) as serviceFile: 681 with zf.open(member) as serviceFile:
689 lines.extend(serviceFile.readlines()) 682 serviceImpls = servicesMap.setdefault(serviceName, [])
690 if exists(target): 683 serviceImpls.extend(serviceFile.readlines())
691 with open(target) as targetFile: 684 graalServices = _filterGraalService(servicesMap.keys(), graalJars)
692 lines.extend(targetFile.readlines()) 685 for serviceName in graalServices:
693 with open(target, "w+") as targetFile: 686 serviceImpls = servicesMap[serviceName]
694 for line in lines: 687 fd, tmp = tempfile.mkstemp(prefix=serviceName)
695 targetFile.write(line.rstrip() + os.linesep) 688 f = os.fdopen(fd, 'w+')
689 for serviceImpl in serviceImpls:
690 f.write(serviceImpl.rstrip() + os.linesep)
691 target = join(destination, serviceName)
692 f.close()
693 shutil.move(tmp, target)
694 if mx.get_os() != 'windows':
695 os.chmod(target, JDK_UNIX_PERMISSIONS_FILE)
696 return graalServices 696 return graalServices
697 697
698 def _updateGraalServiceFiles(jdkDir): 698 def _updateGraalServiceFiles(jdkDir):
699 jreGraalDir = join(jdkDir, 'jre', 'lib', 'graal') 699 jreGraalDir = join(jdkDir, 'jre', 'lib', 'graal')
700 graalJars = [join(jreGraalDir, e) for e in os.listdir(jreGraalDir) if e.startswith('graal') and e.endswith('.jar')] 700 graalJars = [join(jreGraalDir, e) for e in os.listdir(jreGraalDir) if e.startswith('graal') and e.endswith('.jar')]