]> git.lizzy.rs Git - LightOverlay.git/blob - build.gradle
1.16
[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 buildMerged.mustRunAfter project(":fabric").tasks.getByName("build")
132 buildMerged.mustRunAfter project(":forge").tasks.getByName("build")
133
134 static def compress(Path sourceDir, File zipFile) {
135     try {
136         final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFile))
137         Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
138             @Override
139             FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
140                 try {
141                     Path targetFile = sourceDir.relativize(file)
142                     outputStream.putNextEntry(new ZipEntry(targetFile.toString()))
143                     byte[] bytes = Files.readAllBytes(file)
144                     outputStream.write(bytes, 0, bytes.length)
145                     outputStream.closeEntry()
146                 } catch (IOException e) {
147                     e.printStackTrace()
148                 }
149                 return FileVisitResult.CONTINUE
150             }
151         })
152         outputStream.close()
153     } catch (IOException e) {
154         e.printStackTrace()
155     }
156 }
157
158 static def unzip(File zipFile, File destDir) {
159     if (!destDir.exists())
160         destDir.mkdirs()
161     FileInputStream fis
162     byte[] buffer = new byte[1024]
163     try {
164         fis = new FileInputStream(zipFile)
165         ZipInputStream zis = new ZipInputStream(fis)
166         ZipEntry zipEntry = zis.getNextEntry()
167         while (zipEntry != null) {
168             if (!zipEntry.isDirectory()) {
169                 File newFile = new File(destDir, zipEntry.getName())
170                 new File(newFile.getParent()).mkdirs()
171                 FileOutputStream fos = new FileOutputStream(newFile)
172                 int len
173                 while ((len = zis.read(buffer)) > 0) {
174                     fos.write(buffer, 0, len)
175                 }
176                 fos.close()
177             }
178             zis.closeEntry()
179             zipEntry = zis.getNextEntry()
180         }
181         zis.closeEntry()
182         zis.close()
183         fis.close()
184     } catch (IOException e) {
185         e.printStackTrace()
186     }
187 }