This commit is contained in:
Matt Soucy 2020-07-03 11:53:15 -04:00
parent 84208d2e66
commit 0457c20c11
2 changed files with 35 additions and 13 deletions

View File

@ -11,9 +11,6 @@ import me.msoucy.gbat.models.LineModel
import me.msoucy.gbat.models.RiskModel import me.msoucy.gbat.models.RiskModel
fun analyze( fun analyze(
repoRoot : String,
projectRoot : String,
fname : String,
riskModel : RiskModel, riskModel : RiskModel,
createdConstant : Double, createdConstant : Double,
historyItem : HistoryItem, historyItem : HistoryItem,
@ -35,7 +32,13 @@ fun analyze(
} }
} }
return condenseAnalysis(repoRoot, projectRoot, fname, lineModel, knowledgeModel, riskModel) return condenseAnalysis(
historyItem.repoRoot.path,
historyItem.projectRoot.path,
historyItem.fname.path,
lineModel,
knowledgeModel,
riskModel)
} }
private fun condenseAnalysis( private fun condenseAnalysis(

View File

@ -1,5 +1,8 @@
package me.msoucy.gbat package me.msoucy.gbat
import me.msoucy.gbat.models.RiskModel
import me.msoucy.gbat.models.SummaryModel
import java.io.File import java.io.File
import java.util.concurrent.Executors import java.util.concurrent.Executors
import kotlin.math.pow import kotlin.math.pow
@ -7,12 +10,17 @@ import kotlin.system.exitProcess
import kotlin.text.Regex import kotlin.text.Regex
import kotlin.text.RegexOption import kotlin.text.RegexOption
import kotlin.text.startsWith import kotlin.text.startsWith
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import com.xenomachina.argparser.ArgParser import com.xenomachina.argparser.ArgParser
import com.xenomachina.argparser.InvalidArgumentException import com.xenomachina.argparser.InvalidArgumentException
import com.xenomachina.argparser.default import com.xenomachina.argparser.default
import com.xenomachina.argparser.mainBody import com.xenomachina.argparser.mainBody
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
val REALLY_LONG_TIME = 864000 val REALLY_LONG_TIME = 864000
val DEFAULT_INTERESTING_RES = mutableListOf( val DEFAULT_INTERESTING_RES = mutableListOf(
"\\.java$", "\\.java$",
@ -64,7 +72,7 @@ class GbatArgs(parser: ArgParser) {
// 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(0.1)
// Misc options // Misc options
val git_exe by parser.storing("--git-exe", help="Path to the git executable", transform=::validateGit).default("git").addValidator { validateGit(value) } val git_exe by parser.storing("--git-exe", help="Path to the git executable", transform=::validateGit).default("git").addValidator { validateGit(value) }
@ -102,7 +110,7 @@ fun main(args: Array<String>) = mainBody {
throw InvalidArgumentException("Provided project root does not exist") throw InvalidArgumentException("Provided project root does not exist")
} }
val repo = GitRepo(project_root_file, validateGit(git_exe)) val repo = GitRepo(projectRootFile, validateGit(git_exe))
fun String.isInteresting() : Boolean { fun String.isInteresting() : Boolean {
var hasInterest = interesting_res.any { it.containsMatchIn(this) } var hasInterest = interesting_res.any { it.containsMatchIn(this) }
@ -124,15 +132,26 @@ fun main(args: Array<String>) = mainBody {
System.err.println("Found ${fnames.size} interesting files") System.err.println("Found ${fnames.size} interesting files")
} }
val pool = Executors.newFixedThreadPool(num_analyzer_procs + num_git_procs + 1) val riskModel = RiskModel(riskThresh, default_bus_risk, risk_file, departed)
fnames.forEach { fname ->
pool.submit {
parseHistory(repo, projectRootFile, File(fname))
}
}
val summ_result = mutableListOf<Int>()
val dbFname = File(outDir, "summary.db") val dbFname = File(outDir, "summary.db")
val summaryDb = Database.connect(dbFname.absolutePath, "org.sqlite.JDBC")
transaction(summaryDb) {
exec("PRAGMA journal_mode = OFF")
exec("PRAGMA synchronous = OFF")
}
val summaryModel = SummaryModel(summaryDb)
runBlocking {
flow {
fnames.forEach { fname ->
emit(parseHistory(repo, projectRootFile, File(fname)))
}
}.map { history ->
analyze(riskModel, creation_constant, history, verbose)
}.collect { analysis ->
summaryModel.summarize(analysis)
}
}
} }
} }