Merge pull request #13043 from gradle/am/ie/asciidoctor-fix-2

Fix flakiness introduced in fix for generated jars
diff --git a/subprojects/core/src/main/java/org/gradle/internal/classpath/ClasspathBuilder.java b/subprojects/core/src/main/java/org/gradle/internal/classpath/ClasspathBuilder.java
index ddd1aa0..780144b 100644
--- a/subprojects/core/src/main/java/org/gradle/internal/classpath/ClasspathBuilder.java
+++ b/subprojects/core/src/main/java/org/gradle/internal/classpath/ClasspathBuilder.java
@@ -80,21 +80,29 @@
 
         @Override
         public void put(String name, byte[] content) throws IOException {
-            String dir = dir(name);
-            if (dir != null && dirs.add(dir)) {
-                ZipEntry zipEntry = newZipEntryWithFixedTime(dir);
-                outputStream.putNextEntry(zipEntry);
-                outputStream.closeEntry();
-            }
+            maybeAddParent(name);
             ZipEntry zipEntry = newZipEntryWithFixedTime(name);
             outputStream.putNextEntry(zipEntry);
             outputStream.write(content);
             outputStream.closeEntry();
         }
 
+        private void maybeAddParent(String name) throws IOException {
+            String dir = dir(name);
+            if (dir != null && dirs.add(dir)) {
+                maybeAddParent(dir);
+                ZipEntry zipEntry = newZipEntryWithFixedTime(dir);
+                outputStream.putNextEntry(zipEntry);
+                outputStream.closeEntry();
+            }
+        }
+
         @Nullable
         String dir(String name) {
             int pos = name.lastIndexOf('/');
+            if (pos == name.length() - 1) {
+                pos = name.lastIndexOf('/', pos - 1);
+            }
             if (pos >= 0) {
                 return name.substring(0, pos + 1);
             } else {
diff --git a/subprojects/core/src/main/java/org/gradle/internal/classpath/InstrumentingTransformer.java b/subprojects/core/src/main/java/org/gradle/internal/classpath/InstrumentingTransformer.java
index e4fa955..4802f80 100644
--- a/subprojects/core/src/main/java/org/gradle/internal/classpath/InstrumentingTransformer.java
+++ b/subprojects/core/src/main/java/org/gradle/internal/classpath/InstrumentingTransformer.java
@@ -48,7 +48,7 @@
     @Override
     public void applyConfigurationTo(Hasher hasher) {
         hasher.putString(InstrumentingTransformer.class.getSimpleName());
-        hasher.putInt(3); // decoration format, increment this when making changes
+        hasher.putInt(4); // decoration format, increment this when making changes
     }
 
     @Override
diff --git a/subprojects/core/src/test/groovy/org/gradle/internal/classpath/ClasspathBuilderTest.groovy b/subprojects/core/src/test/groovy/org/gradle/internal/classpath/ClasspathBuilderTest.groovy
index df0b824..1f0840d 100644
--- a/subprojects/core/src/test/groovy/org/gradle/internal/classpath/ClasspathBuilderTest.groovy
+++ b/subprojects/core/src/test/groovy/org/gradle/internal/classpath/ClasspathBuilderTest.groovy
@@ -45,12 +45,13 @@
         builder.jar(file) {
             it.put("a.class", "bytes".bytes)
             it.put("dir/b.class", "bytes".bytes)
+            it.put("some/dir/c.class", "bytes".bytes)
         }
 
         then:
         def zip = new ZipTestFixture(file)
-        zip.hasDescendants("a.class", "dir/b.class")
-        zip.hasDirs("dir")
+        zip.hasDescendants("a.class", "dir/b.class", "some/dir/c.class")
+        zip.hasDirs("dir", "some", "some/dir")
     }
 
     def "can construct jar with multiple entries in directory"() {
@@ -61,11 +62,12 @@
             it.put("a.class", "bytes".bytes)
             it.put("dir/b.class", "bytes".bytes)
             it.put("dir/c.class", "bytes".bytes)
+            it.put("dir/sub/d.class", "bytes".bytes)
         }
 
         then:
         def zip = new ZipTestFixture(file)
-        zip.hasDescendants("a.class", "dir/b.class", "dir/c.class")
-        zip.hasDirs("dir")
+        zip.hasDescendants("a.class", "dir/b.class", "dir/c.class", "dir/sub/d.class")
+        zip.hasDirs("dir", "dir/sub")
     }
 }
diff --git a/subprojects/core/src/test/groovy/org/gradle/internal/classpath/DefaultCachedClasspathTransformerTest.groovy b/subprojects/core/src/test/groovy/org/gradle/internal/classpath/DefaultCachedClasspathTransformerTest.groovy
index ba44b98..adb6fb0 100644
--- a/subprojects/core/src/test/groovy/org/gradle/internal/classpath/DefaultCachedClasspathTransformerTest.groovy
+++ b/subprojects/core/src/test/groovy/org/gradle/internal/classpath/DefaultCachedClasspathTransformerTest.groovy
@@ -176,7 +176,7 @@
         def file = testDir.file("thing.jar")
         jar(file)
         def classpath = DefaultClassPath.of(file)
-        def cachedFile = testDir.file("cached/d854107bf6795d72eb3eecb15532cda3/thing.jar")
+        def cachedFile = testDir.file("cached/5a39c25ac6680051f529ce5fa49f4179/thing.jar")
 
         when:
         def cachedClasspath = transformer.transform(classpath, BuildLogic)
@@ -204,7 +204,7 @@
         def dir = testDir.file("thing.dir")
         classesDir(dir)
         def classpath = DefaultClassPath.of(dir)
-        def cachedFile = testDir.file("cached/143d06974ecda152527df49229ffee61/thing.dir.jar")
+        def cachedFile = testDir.file("cached/2f97b3a5acd5db44c4e3ea6bedbb9688/thing.dir.jar")
 
         when:
         def cachedClasspath = transformer.transform(classpath, BuildLogic)
@@ -233,7 +233,7 @@
         def file = testDir.file("thing.jar")
         jar(file)
         def classpath = DefaultClassPath.of(file)
-        def cachedFile = testDir.file("cached/87be1fc71f7c88451d22b236c88c2240/thing.jar")
+        def cachedFile = testDir.file("cached/e2045e4f8c5fcd3178f2044a0264529f/thing.jar")
 
         when:
         def cachedClasspath = transformer.transform(classpath, BuildLogic, transform)
diff --git a/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/runtimeshaded/RuntimeShadedJarCreatorTest.groovy b/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/runtimeshaded/RuntimeShadedJarCreatorTest.groovy
index 96a59a3..ef82800 100644
--- a/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/runtimeshaded/RuntimeShadedJarCreatorTest.groovy
+++ b/subprojects/dependency-management/src/test/groovy/org/gradle/api/internal/runtimeshaded/RuntimeShadedJarCreatorTest.groovy
@@ -130,27 +130,42 @@
         handleAsJarFile(outputJar) { JarFile file ->
             List<JarEntry> entries = file.entries() as List
             assert entries*.name == [
+                'org/',
                 'org/gradle/',
                 'org/gradle/MyClass.class',
                 'org/gradle/MySecondClass.class',
+                'net/',
+                'net/rubygrapefruit/',
+                'net/rubygrapefruit/platform/',
                 'net/rubygrapefruit/platform/osx-i386/',
                 'net/rubygrapefruit/platform/osx-i386/libnative-platform.dylib',
                 'org/gradle/reporting/',
                 'org/gradle/reporting/report.js',
+                'org/joda/',
+                'org/joda/time/',
+                'org/joda/time/tz/',
+                'org/joda/time/tz/data/',
                 'org/joda/time/tz/data/Africa/',
                 'org/joda/time/tz/data/Africa/Abidjan',
+                'org/gradle/internal/',
+                'org/gradle/internal/impldep/',
+                'org/gradle/internal/impldep/org/',
+                'org/gradle/internal/impldep/org/joda/',
+                'org/gradle/internal/impldep/org/joda/time/',
+                'org/gradle/internal/impldep/org/joda/time/tz/',
+                'org/gradle/internal/impldep/org/joda/time/tz/data/',
                 'org/gradle/internal/impldep/org/joda/time/tz/data/Africa/',
                 'org/gradle/internal/impldep/org/joda/time/tz/data/Africa/Abidjan',
                 'org/gradle/MyAClass.class',
                 'org/gradle/MyBClass.class',
                 'org/gradle/MyFirstClass.class',
+                'META-INF/',
                 'META-INF/services/',
                 'META-INF/services/org.gradle.internal.service.scopes.PluginServiceRegistry',
                 'META-INF/services/org.gradle.internal.other.Service',
-                'META-INF/',
                 'META-INF/.gradle-runtime-shaded']
         }
-        outputJar.md5Hash == "a31b58b3c4e0e2f29f80f4e6884fc3ed"
+        outputJar.md5Hash == "dee78866d881612695b2875ef948d5d5"
     }
 
     def "excludes module-info.class from jar"() {
@@ -175,6 +190,7 @@
         handleAsJarFile(outputJar) { JarFile file ->
             List<JarEntry> entries = file.entries() as List
             assert entries*.name == [
+                'org/',
                 'org/gradle/',
                 'org/gradle/MyClass.class',
                 'org/gradle/MySecondClass.class',
@@ -370,8 +386,8 @@
 
         handleAsJarFile(relocatedJar) { JarFile jar ->
             assert jar.entries().toList().size() ==
-                noRelocationResources.size() + 2 +
-                (duplicateResources.size() + 1) * 2 +
+                noRelocationResources.size() + 7 +
+                duplicateResources.size() * 2 + 13 +
                 onlyRelocatedResources.size() +
                 generatedFiles.size() + 1
             noRelocationResources.each { resourceName ->