Files
MoGoEagleEye/codequality/code_inspect_increment.gradle
2023-09-28 15:20:17 +08:00

187 lines
6.0 KiB
Groovy
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
ext {
//存储增量的Java文件给pmd使用
commitJavaFiles = new ArrayList<String>()
//存储增量的kotlin文件给detekt使用
commitKotlinFiles = new ArrayList<String>()
commitAuthor = ""
appVersionName = ""
}
/**
* 增量开关, 给 lint 插件做增量扫描使用
*/
def isIncrement = false
/**
* 通过cmd命令获取结果值
* @return string 结果值
*/
def getResultFromCmd(String cmd) {
logger.lifecycle("${project.name} cmd:$cmd")
def out = new ByteArrayOutputStream()
if (System.properties['os.name'].toLowerCase().contains('windows')) {
project.exec {
ExecSpec execSpec ->
executable 'cmd'
args '/c', "$cmd"
standardOutput = out
}.assertNormalExitValue()
} else {
project.exec {
ExecSpec execSpec ->
executable 'bash'
args '-c', "$cmd"
standardOutput = out
}.assertNormalExitValue()
}
return out.toString().trim()
}
/**
* 获取提交作者
* @return 提交作者
*/
def getCommitAuthor() {
def commitAuthor = ""
// if (isCiServer()) {
// commitAuthor = "${System.env.CI_COMMIT_AUTHOR}"
// commitAuthor = commitAuthor.substring(0, commitAuthor.indexOf('<')).trim()
// } else {
commitAuthor = getResultFromCmd("git config --get user.name")
// }
return commitAuthor
}
/**
* 获取提交 sha用于 git diff 出增量文件,其它项目仓库,这个方法需要更改实现
* @return 提交 sha
*/
def getCommitTargetSha() {
//目前这个仓库只能根据上一个merge节点进行代码增量检测
def commitTargetSha = getResultFromCmd("git log --max-count=1 --pretty=%H --merges")
return commitTargetSha
}
/**
* 获取提交文件,只包含.java和.kt的文件
* @return 文件相对路径数组
*/
def getCommitFiles() {
def commitTargetSha = getCommitTargetSha()
def commitSha = getResultFromCmd("git log --max-count=1 --pretty=%H")
def commitAuthor = getCommitAuthor()
def cmd = "git log --name-only --author=$commitAuthor --pretty=\"format:\" $commitTargetSha..$commitSha"
def result = getResultFromCmd(cmd)
def projectStartPath = getProjectStartPath()
logger.lifecycle("projectStartPath=$projectStartPath")
if (result != null && result.trim().length() > 0) {
def files = result.readLines()
.findAll { it.startsWith("${projectStartPath}") && isFilePathValid(it) }.toArray()
return files.toUnique()
}
return null
}
/**
* 判断文件路径是否合理
* @param path 文件路径
* @return true合理否则不合理
*/
static def isFilePathValid(String path) {
return (path.endsWith('.kt') || path.endsWith('.java') || path.endsWith('.xml') || path.endsWith('.png')) && !path.contains('/test/') && !path.contains('/androidTest/') && !path.contains('/generated/')
}
/**
* 获取src目录下的所有文件只包含.java和.kt的文件
* @return 文件相对路径数组
*/
def getAllFiles() {
def fileCollection = project.files("src")
if (fileCollection == null) {
return null
}
def files = fileCollection.asFileTree.getFiles()
def iterator = files.iterator()
def allFiles = new ArrayList<String>(files.size())
while (iterator.hasNext()) {
File file = iterator.next()
def path = getProjectStartPath() + File.separator + project.relativePath(file.path)
if (path != null && isFilePathValid(path)) {
allFiles.add(path)
}
}
return allFiles.toArray(new Object[allFiles.size()])
}
/**
* 获取项目名称如gradleengine,framework/asmbase
* @return 项目名称
*/
def getProjectStartPath() {
def projectRelativePath = project.relativePath(project.path).replaceAll(':', '/')
return projectRelativePath.substring(1)
}
/**
* 存储提交文件
* @param commitFiles 提交文件
*/
def saveCommitFiles(Object[] commitFiles) {
//commitFiles 是对象
def lintBuildDir = new File(project.buildDir, "code_inspect")
if (!lintBuildDir.exists()) {
lintBuildDir.mkdirs()
}
def changedFile = new File(lintBuildDir, "commit_files.txt")
def fileOutputStream = new FileOutputStream(changedFile)
def rootProjectPath = project.rootProject.rootDir.path + File.separator
//存储绝对路径
for (int i = 0; i < commitFiles.length; i++) {
def commitFile = commitFiles[i].toString()
fileOutputStream.write((rootProjectPath + commitFile).getBytes("utf-8"))
if (i != commitFiles.length - 1)
fileOutputStream.write("\n".getBytes("utf-8"))
}
fileOutputStream.flush()
fileOutputStream.close()
logger.lifecycle("Save Commit Files In: ${changedFile.path} \n$commitFiles")
}
task runCodeInspectIncrement {
group = "codeInspect"
description = "存储增量文件"
def commitJavaFiles = new ArrayList<String>()
def commitKotlinFiles = new ArrayList<String>()
def commitFiles = new Object[0]
if (isIncrement) {
commitFiles = getCommitFiles()
} else {
commitFiles = getAllFiles()
}
saveCommitFiles(commitFiles)
if (commitFiles != null && commitFiles.length > 0) {
def projectStartPath = getProjectStartPath()
for (String s : commitFiles) {
def commitFile = s.toString().trim()
if (commitFile.endsWith('.kt')) {
commitKotlinFiles.add(commitFile.substring(projectStartPath.length() + 1))
} else if (commitFile.endsWith('.java')) {
commitJavaFiles.add(commitFile.substring(projectStartPath.length() + 1))
}
}
}
if (!commitKotlinFiles.isEmpty()) {
logger.lifecycle("${project.name} commitKotlinFiles:$commitKotlinFiles")
}
if (!commitJavaFiles.isEmpty()) {
logger.lifecycle("${project.name} commitJavaFiles:$commitJavaFiles")
}
project.setProperty("commitKotlinFiles", commitKotlinFiles)
project.setProperty("commitJavaFiles", commitJavaFiles)
project.setProperty("commitAuthor", getCommitAuthor())
}