This commit is contained in:
Matt Soucy 2020-06-17 21:37:46 -04:00
parent 47a57939ad
commit 42f9f66793

View File

@ -1,7 +1,11 @@
package me.msoucy.gbat package me.msoucy.gbat
import java.io.File import java.io.File
import java.lang.System import java.io.IOException
import java.util.concurrent.TimeUnit
import kotlin.math.pow
import kotlin.text.Regex
import kotlin.text.RegexOption
import kotlin.text.startsWith import kotlin.text.startsWith
import com.xenomachina.argparser.ArgParser import com.xenomachina.argparser.ArgParser
@ -46,22 +50,20 @@ fun validateGit(exe : String) : String {
class GbatArgs(parser: ArgParser) { class GbatArgs(parser: ArgParser) {
// Input options // Input options
val interesting by parser.adding("--interesting", "-I", val interesting by parser.adding("--interesting", "-I",
help="Regular expression to determine which files should be included in calculations.", help="Regular expression to determine which files should be included in calculations.")
initialValue=DEFAULT_INTERESTING_RES
) { this }
val not_interesting by parser.adding("--not-interesting", "-N", val not_interesting by parser.adding("--not-interesting", "-N",
help="Regular expression to determine which files should not be included in calculations.") help="Regular expression to determine which files should not be included in calculations.")
val case_sensitive by parser.flagging("Use case sensitive regexps when determining interesting files (default is case-insensitive)") val case_sensitive by parser.flagging("Use case sensitive regexps when determining interesting files (default is case-insensitive)")
val departed by parser.storing("--departed-file", "-D", help="File listing departed devs, one per line").default<String?>(null) val departed by parser.storing("--departed-file", "-D", help="File listing departed devs, one per line").default<String?>(null)
val risk_file by parser.storing("--bus-risk-file", help="File of dev=float lines (e.g. ejorgensen=0.4) with custom bus risks for devs").default<String?>(null) val risk_file by parser.storing("--bus-risk-file", help="File of dev=float lines (e.g. ejorgensen=0.4) with custom bus risks for devs").default<String?>(null)
val default_bus_risk by parser.storing("--default-bus-risk", help="Default risk that a dev will be hit by a bus in your analysis timeframe (defaults to 0.1).").default(0.1) val default_bus_risk by parser.storing("--default-bus-risk", help="Default risk that a dev will be hit by a bus in your analysis timeframe (defaults to 0.1).") { toDouble() }.default(0.1)
// Multiprocessing options // Multiprocessing options
val num_git_procs by parser.storing("--num-git-procs", help="The number of git processes to run simultaneously (defaults to 3)") { toInt() }.default(3) val num_git_procs by parser.storing("--num-git-procs", help="The number of git processes to run simultaneously (defaults to 3)") { toInt() }.default(3)
val num_analyzer_procs by parser.storing("--num-analyzer-procs", help="The number of analyzer processes to run (defaults to 3)") { toInt() }.default(3) val num_analyzer_procs by parser.storing("--num-analyzer-procs", help="The number of analyzer processes to run (defaults to 3)") { toInt() }.default(3)
// Tuning options // Tuning options
val risk_threshold by parser.storing("--risk-threshold", help="Threshold past which to summarize risk (defaults to default bus risk cubed)") {toDouble()}.default<Double?>(null) val risk_threshold by parser.storing("--risk-threshold", help="Threshold past which to summarize risk (defaults to default bus risk cubed)") { toDouble() }.default<Double?>(null)
val creation_constant by parser.storing("--knowledge-creation-constant", help="How much knowledge a changed line should create if a new line creates 1 (defaults to 0.1)") {toDouble()}.default<Double?>(null) val creation_constant by parser.storing("--knowledge-creation-constant", help="How much knowledge a changed line should create if a new line creates 1 (defaults to 0.1)") {toDouble()}.default<Double?>(null)
// Misc options // Misc options
@ -70,12 +72,81 @@ class GbatArgs(parser: ArgParser) {
val output by parser.storing("Output directory for data files and html summary (defaults to \"output\"), error if already exists").default("output") val output by parser.storing("Output directory for data files and html summary (defaults to \"output\"), error if already exists").default("output")
// Directory // Directory
val root by parser.positional("The root directory to inspect") val project_root by parser.positional("The root directory to inspect")
}
fun List<String>.runCommand(workingDir: File): Pair<String?,String?> {
try {
val proc = ProcessBuilder(*this.toTypedArray())
.directory(workingDir)
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE)
.start()
proc.waitFor(60, TimeUnit.MINUTES)
return Pair(proc.inputStream.bufferedReader().readText(),
proc.errorStream.bufferedReader().readText())
} catch(e: IOException) {
e.printStackTrace()
return Pair(null, null)
}
}
class GitRepo(val project_root : File, val git_exe : String) {
fun ls() : String {
val cmd = listOf(
git_exe,
"ls-tree",
"--full-tree",
"--name-only",
"-r",
"HEAD",
project_root.absolutePath
)
val (out, err) = cmd.runCommand(project_root)
return out ?: ""
}
} }
fun main(args: Array<String>) = mainBody { fun main(args: Array<String>) = mainBody {
ArgParser(args).parseInto(::GbatArgs).run { ArgParser(args).parseInto(::GbatArgs).run {
println("Hello world") println("Hello world")
println(validateGit(git_exe)) println(validateGit(git_exe))
val outDir = File(output)
if(outDir.isDirectory) {
throw InvalidArgumentException("Output directory already exists")
}
outDir.mkdirs()
fun parse_interesting(theList : List<String>) =
theList.map {
if(case_sensitive) {
Regex(it)
} else {
Regex(it, RegexOption.IGNORE_CASE)
}
}
val risk_thresh = risk_threshold ?: default_bus_risk.pow(3)
val interesting_res = if (interesting.isEmpty()) DEFAULT_INTERESTING_RES else {
parse_interesting(interesting)
}
val not_interesting_res = if (not_interesting.isEmpty()) listOf() else {
parse_interesting(not_interesting)
}
val project_root_file = File(project_root).also {
if(!it.isDirectory)
throw InvalidArgumentException("Provided project root does not exist")
}
println(risk_thresh)
println(interesting_res)
println(not_interesting_res)
println(project_root_file)
val repo = GitRepo(project_root_file, validateGit(git_exe))
println(repo.ls())
} }
} }