Rework long path warning
This commit is contained in:
parent
90616d74fa
commit
f99621dd65
3 changed files with 51 additions and 29 deletions
|
@ -29,7 +29,6 @@ import io.papermc.paperweight.util.*
|
||||||
import io.papermc.paperweight.util.constants.*
|
import io.papermc.paperweight.util.constants.*
|
||||||
import io.papermc.paperweight.util.data.*
|
import io.papermc.paperweight.util.data.*
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.nio.charset.Charset
|
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
@ -319,9 +318,6 @@ abstract class GenerateDevBundle : DefaultTask() {
|
||||||
return asString(outBytes)
|
return asString(outBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun asString(out: ByteArrayOutputStream) = String(out.toByteArray(), Charset.defaultCharset())
|
|
||||||
.replace(System.getProperty("line.separator"), "\n")
|
|
||||||
|
|
||||||
@Suppress("SameParameterValue")
|
@Suppress("SameParameterValue")
|
||||||
private fun createBundleConfig(dataTargetDir: String, patchTargetDir: String): DevBundleConfig {
|
private fun createBundleConfig(dataTargetDir: String, patchTargetDir: String): DevBundleConfig {
|
||||||
return DevBundleConfig(
|
return DevBundleConfig(
|
||||||
|
|
|
@ -50,7 +50,7 @@ fun Project.setupServerProject(
|
||||||
packagesToFix: Provider<List<String>?>,
|
packagesToFix: Provider<List<String>?>,
|
||||||
reobfMappings: Provider<RegularFile>,
|
reobfMappings: Provider<RegularFile>,
|
||||||
): ServerTasks? {
|
): ServerTasks? {
|
||||||
testPathLength(layout)
|
testPathLength(providers)
|
||||||
|
|
||||||
if (!projectDir.exists()) {
|
if (!projectDir.exists()) {
|
||||||
return null
|
return null
|
||||||
|
|
|
@ -29,6 +29,7 @@ import io.papermc.paperweight.DownloadService
|
||||||
import io.papermc.paperweight.PaperweightException
|
import io.papermc.paperweight.PaperweightException
|
||||||
import io.papermc.paperweight.tasks.*
|
import io.papermc.paperweight.tasks.*
|
||||||
import io.papermc.paperweight.util.constants.*
|
import io.papermc.paperweight.util.constants.*
|
||||||
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
|
@ -36,6 +37,7 @@ import java.lang.management.ManagementFactory
|
||||||
import java.lang.reflect.Type
|
import java.lang.reflect.Type
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
import java.nio.charset.Charset
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
import java.security.MessageDigest
|
import java.security.MessageDigest
|
||||||
|
@ -45,6 +47,7 @@ import java.util.Locale
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
import java.util.concurrent.CompletableFuture
|
import java.util.concurrent.CompletableFuture
|
||||||
import java.util.concurrent.ThreadLocalRandom
|
import java.util.concurrent.ThreadLocalRandom
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
import java.util.concurrent.atomic.AtomicLong
|
import java.util.concurrent.atomic.AtomicLong
|
||||||
import kotlin.io.path.*
|
import kotlin.io.path.*
|
||||||
import org.cadixdev.lorenz.merge.MergeResult
|
import org.cadixdev.lorenz.merge.MergeResult
|
||||||
|
@ -57,6 +60,7 @@ import org.gradle.api.file.RegularFile
|
||||||
import org.gradle.api.file.RegularFileProperty
|
import org.gradle.api.file.RegularFileProperty
|
||||||
import org.gradle.api.invocation.Gradle
|
import org.gradle.api.invocation.Gradle
|
||||||
import org.gradle.api.logging.LogLevel
|
import org.gradle.api.logging.LogLevel
|
||||||
|
import org.gradle.api.logging.Logging
|
||||||
import org.gradle.api.plugins.JavaPluginExtension
|
import org.gradle.api.plugins.JavaPluginExtension
|
||||||
import org.gradle.api.provider.Property
|
import org.gradle.api.provider.Property
|
||||||
import org.gradle.api.provider.Provider
|
import org.gradle.api.provider.Provider
|
||||||
|
@ -348,35 +352,57 @@ fun FileCollection.toJarClassProviderRoots(): List<ClassProviderRoot> = files.as
|
||||||
.map { p -> ClassProviderRoot.fromJar(p) }
|
.map { p -> ClassProviderRoot.fromJar(p) }
|
||||||
.toList()
|
.toList()
|
||||||
|
|
||||||
// Longest path as of 1.20.4
|
fun asString(out: ByteArrayOutputStream) = String(out.toByteArray(), Charset.defaultCharset())
|
||||||
private const val longestPath: String =
|
.replace(System.lineSeparator(), "\n")
|
||||||
"paperweight/mc-dev-sources/data/minecraft/datapacks/update_1_21/data/minecraft/advancements/" +
|
|
||||||
"recipes/building_blocks/waxed_weathered_chiseled_copper_from_waxed_weathered_cut_copper_stonecutting.json"
|
|
||||||
|
|
||||||
fun testPathLength(projectLayout: ProjectLayout) {
|
fun testPathLength(providers: ProviderFactory) {
|
||||||
|
if (!providers.gradleProperty("paperweight.windowsLongPathWarning").map { it.toBoolean() }.orElse(true).get()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
if (System.getProperty("os.name").lowercase().contains("win")) {
|
if (System.getProperty("os.name").lowercase().contains("win")) {
|
||||||
val tmpProjDir = projectLayout.projectDirectory.path.resolveSibling(
|
val registryQuery =
|
||||||
projectLayout.projectDirectory.path.name + "_"
|
"reg query HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FileSystem /v LongPathsEnabled"
|
||||||
)
|
val proc = ProcessBuilder()
|
||||||
val cache = tmpProjDir.resolve(".gradle/$CACHE_PATH")
|
.command(registryQuery.split(" "))
|
||||||
val testFile = cache.resolve(longestPath)
|
.redirectErrorStream(true)
|
||||||
|
.start()
|
||||||
|
val outBytes = ByteArrayOutputStream()
|
||||||
|
val outFuture = redirect(proc.inputStream, outBytes)
|
||||||
|
if (!proc.waitFor(10L, TimeUnit.SECONDS)) {
|
||||||
|
proc.destroyForcibly()
|
||||||
|
throw PaperweightException("Command '$registryQuery' did not finish after 10 seconds, killed process")
|
||||||
|
}
|
||||||
|
outFuture.get(500L, TimeUnit.MILLISECONDS)
|
||||||
|
val out = asString(outBytes)
|
||||||
|
|
||||||
try {
|
val gitQuery = "git config --global --get core.longpaths"
|
||||||
testFile.parent.createDirectories()
|
val gitProc = ProcessBuilder()
|
||||||
testFile.writeText("test")
|
.command(gitQuery.split(" "))
|
||||||
} catch (e: Exception) {
|
.redirectErrorStream(true)
|
||||||
throw PaperweightException(
|
.start()
|
||||||
"""The directory this project is cloned in is too nested. Possible solutions:
|
val gitOutBytes = ByteArrayOutputStream()
|
||||||
1) Move the project to a less nested directory (i.e. C:\Paper)
|
val gitOutFuture = redirect(gitProc.inputStream, gitOutBytes)
|
||||||
2) Enable long paths in Windows and Git:
|
if (!gitProc.waitFor(10L, TimeUnit.SECONDS)) {
|
||||||
|
gitProc.destroyForcibly()
|
||||||
|
throw PaperweightException("Command '$gitQuery' did not finish after 10 seconds, killed process")
|
||||||
|
}
|
||||||
|
gitOutFuture.get(500L, TimeUnit.MILLISECONDS)
|
||||||
|
val gitOut = asString(gitOutBytes)
|
||||||
|
|
||||||
|
if (out.contains("LongPathsEnabled REG_DWORD 0x1") && gitOut.contains("true")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val logger = Logging.getLogger("paperweight-path-length-warning")
|
||||||
|
logger.warn(
|
||||||
|
"""paperweight uses long paths that may exceed the Windows MAX_PATH limit depending on where the project is located.
|
||||||
|
To avoid build failures and disable this warning, do one of the following:
|
||||||
|
1) Enable long paths in Windows and Git:
|
||||||
Windows documentation: https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation
|
Windows documentation: https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation
|
||||||
Git command: git config --global core.longpaths true
|
Git command: git config --global core.longpaths true
|
||||||
3) Clone and build the project in WSL (this will also improve build speed)""",
|
2) Clone and build the project in WSL (this will also improve build speed)
|
||||||
e
|
|
||||||
)
|
This warning can also be disabled by setting the gradle property 'paperweight.windowsLongPathWarning' to 'false'."""
|
||||||
} finally {
|
)
|
||||||
tmpProjDir.deleteRecursive()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue