Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ class PatchingDir private constructor(val root: File) {
try {
root.resolve("local.yaml").writeText(Yaml.default.encodeToString(LocalConfig.serializer(), local))
root.resolve("main.yaml").writeText(Yaml.default.encodeToString(PatchingMainConfig.serializer(), main))
root.resolve(".gitattributes")
.writeText("*.yml text eol=lf\n" +
".gitattributes text eol=lf\n")
root.resolve(".gitignore").writeText("local.yaml\n.gitignore\n")
yamlFormatter.accept(root.resolve("main.yaml"))
} catch (e: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ import com.anatawa12.modPatching.source.internal.SourceConstants.MAPPING_CONFIGU
import com.anatawa12.modPatching.source.internal.SourceConstants.MOD_PATCHING_SOURCE_UTIL_CLI_CONFIGURATION
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.*
import java.io.File

@Suppress("unused")
Expand Down Expand Up @@ -88,35 +87,17 @@ open class SourcePatchingPlugin : Plugin<Project> {
}

project.afterEvaluate {
val logger = project.logger
if (patches.autoInstallCli) {
installSourceUtilLocally.install()
}
// if specified as true or root project
val noIgnoreWarn = project.providers
.gradleProperty("com.anatawa12.mod-patching.no-ignore-warn")
.forUseAtConfigurationTime().orNull
.equals("true", ignoreCase = true)
?.equals("true", ignoreCase = true)
?: (project == project.rootProject)
if (!noIgnoreWarn) {
val gitignore = projectDir.resolve(".gitignore").readTextOr("")
val prefix = installSourceUtilLocally.prefix.get()

val files: MutableSet<String>
val errors: String
if (prefix == "") {
files = mutableSetOf("add-modify*", "apply-patches*", "create-diff*")
errors = "add-modify*, apply-patches*, and create-diff* are"
} else {
files = mutableSetOf("$prefix.*")
errors = "$prefix.* is"
}

for (line in gitignore.lineSequence()) {
files.removeIf { line == it || line == "/$it" }
}
if (files.isNotEmpty()) {
logger.warn("$errors not git ignored! generated patching mod utility " +
"should be ignored because they're environment dependent.")
}
GitChecker.checkForRepo(project, installSourceUtilLocally.prefix.get())
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.anatawa12.modPatching.source.internal

import org.gradle.api.Project
import org.gradle.api.logging.Logger
import java.io.File
import java.nio.charset.Charset

object GitChecker {
fun checkForRepo(project: Project, prefix: String) {
val gitRepoDir = detectGitRepo(project.projectDir)
if (gitRepoDir != null)
checkIgnoreAndEol(project, prefix)
}

private fun detectGitRepo(root: File): File? {
var dir = root
while (true) {
if (dir.resolve(".git").exists())
return dir
dir = dir.parentFile ?: return null
}
}

private fun checkIgnoreAndEol(
project: Project,
prefix: String,
) {
val logger = project.logger
val gitCommand = project.providers
.gradleProperty("com.anatawa12.mod-patching.git")
.forUseAtConfigurationTime()
.getOrElse("git")

// check installed
val installed = ProcessBuilder(gitCommand).command("--version").start().exitValue() == 0
if (!installed) {
logger.warn("found git repository but git binary not found!")
logger.warn("Please set `com.anatawa12.mod-patching.git=path/to/git/binary`")
return
}

checkGitIgnore(logger, gitCommand, project.projectDir, prefix)
}

private fun checkGitIgnore(logger: Logger, gitCommand: String, dir: File, prefix: String) {
val binaryNames = if (prefix.isEmpty()) setOf("add-modify", "apply-patches", "create-diff")
else setOf("$prefix.add-modify", "$prefix.apply-patches", "$prefix.create-diff")
// add .exe postfix
val execNames = binaryNames + binaryNames.map { "$it.exe" }

val process = ProcessBuilder(gitCommand)
.command("check-ignore", "-z", "--stdin")
.directory(dir)
.start()
process.outputStream.use {
it.write(execNames.joinToString("\u0000").toByteArray(Charset.defaultCharset()))
}

if (process.exitValue() != 0) {
logger.error("$gitCommand check-ignore -z --stdin exit with non-zero value.")
logger.error("git configuration validation failed")
return
}

val ignoredFiles = process.inputStream.bufferedReader(Charset.defaultCharset())
.use { it.readText() }.split('\u0000').toSet()
val notIgnoredFiles = execNames - ignoredFiles

if (notIgnoredFiles.isNotEmpty()) {
logger.warn("those of locally installed source patching utility is not ignored:")
logger.warn(notIgnoredFiles.joinToString(", "))
logger.warn("it's environment dependent binary file so it should be git ignored.")
if (prefix.isEmpty())
logger.warn("you should add ${binaryNames.joinToString(",") { "$it*" }} to .gitignore")
else
logger.warn("you should add $prefix.* to .gitignore")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@ import com.anatawa12.modPatching.source.internal.SourceConstants.DECOMPILE_MODS
import com.anatawa12.modPatching.source.internal.SourceConstants.FORGEFLOWER_CONFIGURATION
import com.anatawa12.modPatching.source.internal.SourceConstants.MAPPING_CONFIGURATION
import org.gradle.api.tasks.JavaExec
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.get
import org.gradle.kotlin.dsl.provideDelegate
import org.gradle.kotlin.dsl.*

class SourcePatchImpl(
override val mod: AbstractDownloadingMod,
Expand Down Expand Up @@ -98,5 +96,10 @@ class SourcePatchImpl(
deobfJar = deobfJarPath,
)
patchingDir.save(yamlReformat(project))

patchDirPath.asFile(project)
.resolve(".gitattributes")
.writeText("*.java.patch text eol=lf\n" +
".gitattributes text eol=lf\n")
}
}