changeset 22079:59b0fd9e6b27

instead of cleaning jvmci/services and jvmci/options directories in a JDK, look for stale entries and offer to delete them if mx is running interactively
author Doug Simon <doug.simon@oracle.com>
date Wed, 24 Jun 2015 12:37:45 +0200
parents 5c50f2f6e913
children 5372cd319bb2
files mx.graal/mx_graal.py
diffstat 1 files changed, 20 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/mx.graal/mx_graal.py	Wed Jun 24 12:30:58 2015 +0200
+++ b/mx.graal/mx_graal.py	Wed Jun 24 12:37:45 2015 +0200
@@ -548,43 +548,35 @@
         os.chmod(dstLib, permissions)
 
 def _extractJVMCIFiles(jdkJars, jvmciJars, servicesDir, optionsDir):
-    if exists(servicesDir):
-        shutil.rmtree(servicesDir, ignore_errors=True)
-    if exists(optionsDir):
-        shutil.rmtree(optionsDir, ignore_errors=True)
-    if not exists(servicesDir):
-        os.makedirs(servicesDir)
-    if not exists(optionsDir):
-        os.makedirs(optionsDir)
+
+    oldServices = os.listdir(servicesDir) if exists(servicesDir) else os.makedirs(servicesDir)
+    oldOptions = os.listdir(optionsDir) if exists(optionsDir) else os.makedirs(optionsDir)
+
     jvmciServices = {}
     optionsFiles = []
     for jar in jvmciJars:
         if os.path.isfile(jar):
             with zipfile.ZipFile(jar) as zf:
                 for member in zf.namelist():
-                    if member.startswith('META-INF/jvmci.services') and member:
+                    if member.startswith('META-INF/jvmci.services/') and member != 'META-INF/jvmci.services/':
                         service = basename(member)
-                        if service == "":
-                            continue # Zip files may contain empty entries for directories (jar -cf ... creates such)
-                        # we don't handle directories
-                        assert service and member == 'META-INF/jvmci.services/' + service
+                        assert service != "", member
                         with zf.open(member) as serviceFile:
                             providers = jvmciServices.setdefault(service, [])
                             for line in serviceFile.readlines():
                                 line = line.strip()
                                 if line:
                                     providers.append(line)
-                    elif member.startswith('META-INF/jvmci.options'):
+                    elif member.startswith('META-INF/jvmci.options/') and member != 'META-INF/jvmci.options/':
                         filename = basename(member)
-                        if filename == "":
-                            continue # Zip files may contain empty entries for directories (jar -cf ... creates such)
-                        # we don't handle directories
-                        assert filename and member == 'META-INF/jvmci.options/' + filename
+                        assert filename != "", member
                         targetpath = join(optionsDir, filename)
                         optionsFiles.append(filename)
                         with zf.open(member) as optionsFile, \
                              file(targetpath, "wb") as target:
                             shutil.copyfileobj(optionsFile, target)
+                            if oldOptions and filename in oldOptions:
+                                oldOptions.remove(filename)
     for service, providers in jvmciServices.iteritems():
         fd, tmp = tempfile.mkstemp(prefix=service)
         f = os.fdopen(fd, 'w+')
@@ -593,9 +585,19 @@
         target = join(servicesDir, service)
         f.close()
         shutil.move(tmp, target)
+        if oldServices and service in oldServices:
+            oldServices.remove(service)
         if mx.get_os() != 'windows':
             os.chmod(target, JDK_UNIX_PERMISSIONS_FILE)
 
+    if mx.is_interactive():
+        for d, files in [(servicesDir, oldServices), (optionsDir, oldOptions)]:
+            if files and mx.ask_yes_no('These files in ' + d + ' look obsolete:\n  ' + '\n  '.join(files) + '\nDelete them', 'n'):
+                for f in files:
+                    path = join(d, f)
+                    os.remove(path)
+                    mx.log('Deleted ' + path)
+
 def _updateJVMCIFiles(jdkDir):
     jreJVMCIDir = join(jdkDir, 'jre', 'lib', 'jvmci')
     jvmciJars = [join(jreJVMCIDir, e) for e in os.listdir(jreJVMCIDir) if e.endswith('.jar')]