]> git.lizzy.rs Git - LightOverlay.git/blob - build.gradle
Fix an issue where crosses appear in mushroom biomes (#56)
[LightOverlay.git] / build.gradle
1 buildscript {
2     repositories {
3         mavenCentral()
4     }
5     dependencies {
6         classpath("commons-io:commons-io:2.6")
7     }
8 }
9
10 import org.jetbrains.gradle.ext.ActionDelegationConfig
11
12 import java.nio.file.FileVisitResult
13 import java.nio.file.Files
14 import java.nio.file.Path
15 import java.nio.file.SimpleFileVisitor
16 import java.nio.file.attribute.BasicFileAttributes
17 import java.util.stream.Stream
18 import java.util.zip.ZipEntry
19 import java.util.zip.ZipInputStream
20 import java.util.zip.ZipOutputStream
21
22 plugins {
23     id "org.jetbrains.gradle.plugin.idea-ext" version "0.7"
24 }
25
26 allprojects {
27     apply plugin: "java"
28
29     group "me.shedaniel"
30     archivesBaseName = rootProject.name
31     version = rootProject.mod_version
32
33     sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaVersion.VERSION_1_8
34 }
35
36 idea.project.settings {
37     delegateActions {
38         delegateBuildRunToGradle = false
39         testRunner = ActionDelegationConfig.TestRunner.PLATFORM
40     }
41     runConfigurations {
42         "Fabric: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
43             project = rootProject.project(":fabric")
44             taskNames = Collections.singletonList("runClient")
45         }
46         "Fabric: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
47             project = rootProject.project(":fabric")
48             taskNames = Collections.singletonList("runServer")
49         }
50         "Forge: Minecraft Client"(org.jetbrains.gradle.ext.Gradle) {
51             project = rootProject.project(":forge")
52             taskNames = Collections.singletonList("runClient")
53         }
54         "Forge: Minecraft Server"(org.jetbrains.gradle.ext.Gradle) {
55             project = rootProject.project(":forge")
56             taskNames = Collections.singletonList("runServer")
57         }
58     }
59 }
60
61 task buildMerged {
62     doLast {
63         def folder = file(".gradle/.mergemods")
64         folder.mkdirs()
65         def fabricJar = file("fabric/build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
66         def forgeJar = file("forge/build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
67         def fabricFolder = new File(folder, ".tempFabric")
68         def forgeFolder = new File(folder, ".tempForge")
69         def mergeFolder = new File(folder, ".tempMerge")
70         def policyMap = new HashMap<String, String>()
71         file("merging.policy").eachLine {
72             if (it.isBlank() || it.startsWith("#")) return
73             def env = it.substring(0, it.indexOf(' '))
74             if (env == "FABRIC")
75                 policyMap.put(it.substring(env.length() + 1), "Fabric")
76             else if (env == "FORGE")
77                 policyMap.put(it.substring(env.length() + 1), "Forge")
78             else throw new IllegalStateException("Illegal env $env at $it")
79         }
80         forgeFolder.deleteDir()
81         fabricFolder.deleteDir()
82         mergeFolder.deleteDir()
83         unzip(fabricJar, fabricFolder)
84         unzip(forgeJar, forgeFolder)
85         mergeFolder.mkdirs()
86         Stream.of(forgeFolder, fabricFolder).each { useFolder ->
87             try {
88                 Files.walkFileTree(useFolder.toPath(), new SimpleFileVisitor<Path>() {
89                     @Override
90                     FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
91                         try {
92                             File ogFile = file.toFile()
93                             File outFile = new File(mergeFolder, ogFile.getAbsolutePath().replace(useFolder.getAbsolutePath(), ""))
94                             outFile.getParentFile().mkdirs()
95                             if (outFile.exists()) {
96                                 def env = useFolder.getName().substring(5)
97                                 def fileName = outFile.getAbsolutePath().replace(mergeFolder.getAbsolutePath(), "")
98                                 def policyEnv = policyMap.get(fileName)
99                                 if (policyEnv == null) {
100                                     throw new IllegalStateException("Unhandled duplicate file: $fileName")
101                                 }
102                                 println "Chose env ${policyEnv.toUpperCase(Locale.ROOT)} for duplicate file: $fileName"
103                                 if (policyEnv != env)
104                                     return FileVisitResult.CONTINUE
105                             }
106                             if (!ogFile.isDirectory()) {
107                                 org.apache.commons.io.FileUtils.copyFile(ogFile, outFile)
108                             } else {
109                                 org.apache.commons.io.FileUtils.copyDirectory(ogFile, outFile)
110                             }
111                         } catch (IOException e) {
112                             e.printStackTrace()
113                             System.exit(0)
114                         }
115                         return FileVisitResult.CONTINUE
116                     }
117                 })
118             } catch (IOException e) {
119                 e.printStackTrace()
120                 System.exit(0)
121             }
122         }
123         File finalMerge = file("build/libs/${rootProject.name}-${rootProject.mod_version}.jar")
124         finalMerge.parentFile.mkdirs()
125         finalMerge.delete()
126         compress(mergeFolder.toPath(), finalMerge)
127         folder.deleteDir()
128     }
129 }
130
131 rootProject.subprojects.forEach {
132     buildMerged.mustRunAfter it.tasks.getByName("build")
133 }
134
135 static def compress(Path sourceDir, File zipFile) {
136     try {
137         final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFile))
138         Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
139             @Override
140             FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
141                 try {
142                     Path targetFile = sourceDir.relativize(file)
143                     outputStream.putNextEntry(new ZipEntry(targetFile.toString()))
144                     byte[] bytes = Files.readAllBytes(file)
145                     outputStream.write(bytes, 0, bytes.length)
146                     outputStream.closeEntry()
147                 } catch (IOException e) {
148                     e.printStackTrace()
149                 }
150                 return FileVisitResult.CONTINUE
151             }
152         })
153         outputStream.close()
154     } catch (IOException e) {
155         e.printStackTrace()
156     }
157 }
158
159 static def unzip(File zipFile, File destDir) {
160     if (!destDir.exists())
161         destDir.mkdirs()
162     FileInputStream fis
163     byte[] buffer = new byte[1024]
164     try {
165         fis = new FileInputStream(zipFile)
166         ZipInputStream zis = new ZipInputStream(fis)
167         ZipEntry zipEntry = zis.getNextEntry()
168         while (zipEntry != null) {
169             if (!zipEntry.isDirectory()) {
170                 File newFile = new File(destDir, zipEntry.getName())
171                 new File(newFile.getParent()).mkdirs()
172                 FileOutputStream fos = new FileOutputStream(newFile)
173                 int len
174                 while ((len = zis.read(buffer)) > 0) {
175                     fos.write(buffer, 0, len)
176                 }
177                 fos.close()
178             }
179             zis.closeEntry()
180             zipEntry = zis.getNextEntry()
181         }
182         zis.closeEntry()
183         zis.close()
184         fis.close()
185     } catch (IOException e) {
186         e.printStackTrace()
187     }
188 }