diff --git a/src/main/kotlin/app/Logger.kt b/src/main/kotlin/app/Logger.kt index 3771097d..1dc70256 100644 --- a/src/main/kotlin/app/Logger.kt +++ b/src/main/kotlin/app/Logger.kt @@ -28,32 +28,38 @@ object Logger { /** * Current log level. All that higher than this level will not be displayed. */ - private const val LEVEL = BuildConfig.LOG_LEVEL + @kotlin.PublishedApi + internal const val LEVEL = BuildConfig.LOG_LEVEL /** * Error level. */ - private const val ERROR = 0 + @kotlin.PublishedApi + internal const val ERROR = 0 /** * Warning level. */ - private const val WARN = 1 + @kotlin.PublishedApi + internal const val WARN = 1 /** * Information level. */ - private const val INFO = 2 + @kotlin.PublishedApi + internal const val INFO = 2 /** * Debug level. */ - private const val DEBUG = 3 + @kotlin.PublishedApi + internal const val DEBUG = 3 /** * Trace level. For extremely detailed and high volume debug logs. */ - private const val TRACE = 4 + @kotlin.PublishedApi + internal const val TRACE = 4 /** * Print stack trace on error log. @@ -112,45 +118,51 @@ object Logger { /** * Log warning message. Don't log private information with this method. */ - fun warn(message: String) { + inline fun warn(message: () -> String) { + val msg = message() if (LEVEL >= WARN) { - println("[w] $message.") + println("[w] $msg.") } - addBreadcrumb(message, Breadcrumb.Level.WARNING) + addBreadcrumb(msg, Breadcrumb.Level.WARNING) } /** * Log information message. Don't log private information with this method. */ - fun info(message: String, event: String = "") { + inline fun info(event: String = "", message: () -> String) { + val msg = message() if (LEVEL >= INFO) { - println("[i] $message.") + println("[i] $msg.") } if (event.isNotBlank()) { Analytics.trackEvent(event) } - addBreadcrumb(message, Breadcrumb.Level.INFO) + addBreadcrumb(msg, Breadcrumb.Level.INFO) } /** * Log debug message. */ - fun debug(message: String) { + inline fun debug(message: () -> String) { if (LEVEL >= DEBUG) { - println("[d] $message.") + println("[d] ${message()}.") } } /** * Log trace message. */ - fun trace(message: String) { + inline fun trace(message: () -> String) { if (LEVEL >= TRACE) { - println("[t] $message.") + println("[t] ${message()}.") } } - private fun addBreadcrumb(message: String, level: Breadcrumb.Level) { + val isDebug: Boolean + inline get() = LEVEL >= DEBUG + + @kotlin.PublishedApi + internal fun addBreadcrumb(message: String, level: Breadcrumb.Level) { sentryContext.recordBreadcrumb(BreadcrumbBuilder() .setMessage(message) .setLevel(level) diff --git a/src/main/kotlin/app/Main.kt b/src/main/kotlin/app/Main.kt index 3b2ee4d3..e1260039 100644 --- a/src/main/kotlin/app/Main.kt +++ b/src/main/kotlin/app/Main.kt @@ -31,7 +31,7 @@ class Main(argv: Array) { init { Logger.uuid = configurator.getUuidPersistent() - Logger.info("App started", Logger.Events.START) + Logger.info(Logger.Events.START) { "App started" } val options = Options() val commandAdd = CommandAdd() @@ -64,10 +64,10 @@ class Main(argv: Array) { else -> startUi() } } catch (e: MissingCommandException) { - Logger.warn("No such command: ${e.unknownCommand}") + Logger.warn { "No such command: ${e.unknownCommand}" } } - Logger.info("App finished", Logger.Events.EXIT) + Logger.info(Logger.Events.EXIT) { "App finished" } } private fun startUi() { @@ -83,9 +83,9 @@ class Main(argv: Array) { configurator.saveToFile() println("Added git repository at $path.") - Logger.info("Config changed", Logger.Events.CONFIG_CHANGED) + Logger.info(Logger.Events.CONFIG_CHANGED) { "Config changed" } } else { - Logger.warn("No valid git repository found at specified path") + Logger.warn { "No valid git repository found at specified path" } } } @@ -93,7 +93,7 @@ class Main(argv: Array) { val (key, value) = commandOptions.pair if (!arrayListOf("username", "password").contains(key)) { - Logger.warn("No such key $key") + Logger.warn { "No such key $key" } return } @@ -104,7 +104,7 @@ class Main(argv: Array) { configurator.saveToFile() - Logger.info("Config changed", Logger.Events.CONFIG_CHANGED) + Logger.info(Logger.Events.CONFIG_CHANGED) { "Config changed" } } private fun doList() { @@ -121,7 +121,7 @@ class Main(argv: Array) { configurator.saveToFile() println("Repository removed from tracking list.") - Logger.info("Config changed", Logger.Events.CONFIG_CHANGED) + Logger.info(Logger.Events.CONFIG_CHANGED) { "Config changed" } } else { println("Repository not found in tracking list.") } diff --git a/src/main/kotlin/app/api/MockApi.kt b/src/main/kotlin/app/api/MockApi.kt index 5ac03d23..fd4bb8cb 100644 --- a/src/main/kotlin/app/api/MockApi.kt +++ b/src/main/kotlin/app/api/MockApi.kt @@ -22,38 +22,39 @@ class MockApi( // GET requests. var receivedDeletedCommits: MutableList = mutableListOf() override fun authorize() { - Logger.debug("MockApi: authorize request") + Logger.debug { "MockApi: authorize request" } } override fun getUser(): User { - Logger.debug("MockApi: getUser request") + Logger.debug { "MockApi: getUser request" } return mockUser } override fun getRepo(repoRehash: String): Repo { - Logger.debug("MockApi: getRepo request") + Logger.debug { "MockApi: getRepo request" } return mockRepo } override fun postRepo(repo: Repo) { - Logger.debug("MockApi: postRepo request ($repo)") + Logger.debug { "MockApi: postRepo request ($repo)" } receivedRepos.add(repo) } override fun postCommits(commitsList: List) { - Logger.debug("MockApi: postCommits request " - + "(${commitsList.size} commits)") + Logger.debug { + "MockApi: postCommits request (${commitsList.size} commits)" + } receivedAddedCommits.addAll(commitsList) } override fun deleteCommits(commitsList: List) { - Logger.debug("MockApi: deleteCommits request " - + "(${commitsList.size} commits)") + Logger.debug { + "MockApi: deleteCommits request (${commitsList.size} commits)" } receivedDeletedCommits.addAll(commitsList) } override fun postFacts(factsList: List) { - Logger.debug("MockApi: postStats request (${factsList.size} stats)") + Logger.debug { "MockApi: postStats request (${factsList.size} stats)" } receivedFacts.addAll(factsList) } } diff --git a/src/main/kotlin/app/api/ServerApi.kt b/src/main/kotlin/app/api/ServerApi.kt index 0002ba4d..ca6952a5 100644 --- a/src/main/kotlin/app/api/ServerApi.kt +++ b/src/main/kotlin/app/api/ServerApi.kt @@ -111,11 +111,11 @@ class ServerApi (private val configurator: Configurator) : Api { requestName: String, parser: (ByteArray) -> T): T { try { - Logger.debug("Request $requestName initialized") + Logger.debug { "Request $requestName initialized" } val (_, res, result) = request.responseString() val (_, e) = result if (e == null) { - Logger.debug("Request $requestName success") + Logger.debug { "Request $requestName success" } return parser(res.data) } else { throw RequestException(e) diff --git a/src/main/kotlin/app/config/FileConfigurator.kt b/src/main/kotlin/app/config/FileConfigurator.kt index f1990d8d..c5577ca5 100644 --- a/src/main/kotlin/app/config/FileConfigurator.kt +++ b/src/main/kotlin/app/config/FileConfigurator.kt @@ -232,7 +232,7 @@ class FileConfigurator : Configurator { } } catch (e: IOException) { if (e is NoSuchFileException){ - Logger.warn("No config file found") + Logger.warn { "No config file found" } } else { Logger.error(e, "Cannot access config file") } diff --git a/src/main/kotlin/app/extractors/ExtractorInterface.kt b/src/main/kotlin/app/extractors/ExtractorInterface.kt index e3f2972a..a114076a 100644 --- a/src/main/kotlin/app/extractors/ExtractorInterface.kt +++ b/src/main/kotlin/app/extractors/ExtractorInterface.kt @@ -107,12 +107,12 @@ interface ExtractorInterface { val pklPath = "$pklDir/$name.pkl.z" if (Files.notExists(Paths.get(pklPath))) { - Logger.info("Downloading $name.pkl.z") + Logger.info { "Downloading $name.pkl.z" } downloadModel(name, pklDir) - Logger.info("Downloaded $name.pkl.z") + Logger.info { "Downloaded $name.pkl.z" } } - Logger.info("Loading $name evaluator") + Logger.info { "Loading $name evaluator" } if (Files.notExists(Paths.get(pmmlDir))) { Files.createDirectories(Paths.get(pmmlDir)) @@ -141,7 +141,7 @@ interface ExtractorInterface { } } else { - Logger.warn("No $name evaluator cache found, building now") + Logger.warn { "No $name evaluator cache found, building now" } unpickleModel(getPickleInputStream(pklPath)) } @@ -149,7 +149,7 @@ interface ExtractorInterface { .newModelEvaluator(pmml) evaluatorsCache.put(name, evaluator) - Logger.info("$name evaluator ready") + Logger.info { "$name evaluator ready" } return evaluator } diff --git a/src/main/kotlin/app/hashers/CodeLongevity.kt b/src/main/kotlin/app/hashers/CodeLongevity.kt index 77e7d86f..c61fe52a 100644 --- a/src/main/kotlin/app/hashers/CodeLongevity.kt +++ b/src/main/kotlin/app/hashers/CodeLongevity.kt @@ -195,8 +195,9 @@ class CodeLongevity(private val serverRepo: Repo, code = FactCodes.LINE_LONGEVITY_REPO, value = repoAvg.toString())) val repoAvgDays = repoAvg / secondsInDay - Logger.info("Repo average code line age is $repoAvgDays days, " - + "lines total: $repoTotal") + Logger.info { + "Repo average code line age is $repoAvgDays days, lines total: $repoTotal" + } for (email in emails) { val aggrAge = aggrAges[email] ?: CodeLineAges.AggrAge() @@ -210,7 +211,7 @@ class CodeLongevity(private val serverRepo: Repo, if (stats.size > 0) { api.postFacts(stats) - Logger.info("Sent ${stats.size} facts to server") + Logger.info { "Sent ${stats.size} facts to server" } } } @@ -226,7 +227,7 @@ class CodeLongevity(private val serverRepo: Repo, try { val iStream = ObjectInputStream(FileInputStream(storagePath)) val storedHeadId = iStream.readUTF() - Logger.debug("Stored repo head: $storedHeadId") + Logger.debug { "Stored repo head: $storedHeadId" } storedHead = RevWalk(repo).parseCommit(repo.resolve(storedHeadId)) if (storedHead == head) { return null @@ -243,7 +244,7 @@ class CodeLongevity(private val serverRepo: Repo, // Update ages. getLinesObservable(storedHead).blockingSubscribe { line -> - Logger.trace("Scanning: ${line}") + Logger.trace { "Scanning: ${line}" } if (line.to.isDeleted) { var age = line.age if (ageData.lastingLines.contains(line.oldId)) { @@ -337,7 +338,7 @@ class CodeLongevity(private val serverRepo: Repo, val oldId = diff.getOldId().toObjectId() val newPath = diff.getNewPath() val newId = diff.getNewId().toObjectId() - Logger.trace("old: '$oldPath', new: '$newPath'") + Logger.trace { "old: '$oldPath', new: '$newPath'" } // Skip binary files. val fileId = if (newPath != DiffEntry.DEV_NULL) newId else oldId @@ -375,14 +376,14 @@ class CodeLongevity(private val serverRepo: Repo, if (insCount > 0) { val insStart = edit.getBeginB() val insEnd = edit.getEndB() - Logger.trace("ins ($insStart, $insEnd)") + Logger.trace { "ins ($insStart, $insEnd)" } for (idx in insStart .. insEnd - 1) { val from = RevCommitLine(commit, newId, newPath, idx, false) val to = lines.get(idx) val cl = CodeLine(repo, from, to) - Logger.trace("Collected: ${cl}") + Logger.trace { "Collected: ${cl}" } subscriber.onNext(cl) } lines.subList(insStart, insEnd).clear() @@ -397,7 +398,7 @@ class CodeLongevity(private val serverRepo: Repo, if (delCount > 0) { val delStart = edit.getBeginA() val delEnd = edit.getEndA() - Logger.trace("del ($delStart, $delEnd)") + Logger.trace { "del ($delStart, $delEnd)" } val tmpLines = ArrayList(delCount) for (idx in delStart .. delEnd - 1) { @@ -433,7 +434,7 @@ class CodeLongevity(private val serverRepo: Repo, val from = RevCommitLine(tail, fileId, filePath, idx, false) val cl = CodeLine(repo, from, lines[idx]) - Logger.trace("Collected (tail): $cl") + Logger.trace { "Collected (tail): $cl" } subscriber.onNext(cl) } } @@ -457,14 +458,23 @@ class CodeLongevity(private val serverRepo: Repo, while (commit != null && commit != tail) { val parentCommit: RevCommit? = revWalk.next() - Logger.debug("commit: ${commit.getName()}; " + - "'${commit.getShortMessage()}'") - if (parentCommit != null) { - Logger.debug("parent commit: ${parentCommit.getName()}; " - + "'${parentCommit.getShortMessage()}'") - } - else { - Logger.debug("parent commit: null") + // Smart casts are not yet supported for a mutable variable captured + // in an inline lambda, see + // https://youtrack.jetbrains.com/issue/KT-7186. + if (Logger.isDebug) { + val commitName = commit.getName() + val commitMsg = commit.getShortMessage() + Logger.debug { "commit: $commitName; '$commitMsg'" } + if (parentCommit != null) { + val parentCommitName = parentCommit.getName() + val parentCommitMsg = parentCommit.getShortMessage() + Logger.debug { + "parent commit: ${parentCommitName}; '${parentCommitMsg}'" + } + } + else { + Logger.debug { "parent commit: null" } + } } subscriber.onNext(Pair(commit, df.scan(parentCommit, commit))) diff --git a/src/main/kotlin/app/hashers/CommitCrawler.kt b/src/main/kotlin/app/hashers/CommitCrawler.kt index 2b781d53..6b0bb1d3 100644 --- a/src/main/kotlin/app/hashers/CommitCrawler.kt +++ b/src/main/kotlin/app/hashers/CommitCrawler.kt @@ -43,10 +43,11 @@ object CommitCrawler { .pairWithNext() // Pair commits to get diff. .map { (new, old) -> // Mapping and stats extraction. - Logger.debug("Commit: ${new.raw?.name ?: ""}: " - + new.raw?.shortMessage) + Logger.debug { + "Commit: ${new.raw?.name ?: ""}: ${new.raw?.shortMessage}" + } new.diffs = getDiffFiles(git, new, old) - Logger.debug("Diff: ${new.diffs.size} entries") + Logger.debug { "Diff: ${new.diffs.size} entries" } new.repo = repo new } diff --git a/src/main/kotlin/app/hashers/CommitHasher.kt b/src/main/kotlin/app/hashers/CommitHasher.kt index 36a4c2f1..4776b9dd 100644 --- a/src/main/kotlin/app/hashers/CommitHasher.kt +++ b/src/main/kotlin/app/hashers/CommitHasher.kt @@ -44,12 +44,12 @@ class CommitHasher(private val serverRepo: Repo = Repo(), // Hash only commits made by authors with specified emails. .filter { commit -> emails.contains(commit.author.email) } .map { commit -> - Logger.info("Extracting stats") + Logger.info { "Extracting stats" } // Mapping and stats extraction. commit.stats = Extractor().extract(commit.diffs) - Logger.info("Stats: ${commit.stats.size} entries") - Logger.debug(commit.stats.toString()) + Logger.info { "Stats: ${commit.stats.size} entries" } + Logger.debug { commit.stats.toString() } // Count lines on all non-binary files. This is additional // statistics to CommitStats because not all file extensions @@ -80,14 +80,14 @@ class CommitHasher(private val serverRepo: Repo = Repo(), private fun postCommitsToServer(commits: List) { if (commits.isNotEmpty()) { api.postCommits(commits) - Logger.info("Sent ${commits.size} added commits to server") + Logger.info { "Sent ${commits.size} added commits to server" } } } private fun deleteCommitsOnServer(commits: List) { if (commits.isNotEmpty()) { api.deleteCommits(commits) - Logger.info("Sent ${commits.size} deleted commits to server") + Logger.info { "Sent ${commits.size} deleted commits to server" } } } } diff --git a/src/main/kotlin/app/hashers/FactHasher.kt b/src/main/kotlin/app/hashers/FactHasher.kt index 5234f77e..19f44243 100644 --- a/src/main/kotlin/app/hashers/FactHasher.kt +++ b/src/main/kotlin/app/hashers/FactHasher.kt @@ -102,7 +102,7 @@ class FactHasher(private val serverRepo: Repo = Repo(), private fun postFactsToServer(facts: List) { if (facts.isNotEmpty()) { api.postFacts(facts) - Logger.info("Sent ${facts.size} facts to server") + Logger.info { "Sent ${facts.size} facts to server" } } } } diff --git a/src/main/kotlin/app/hashers/RepoHasher.kt b/src/main/kotlin/app/hashers/RepoHasher.kt index 5618753a..52712fb4 100644 --- a/src/main/kotlin/app/hashers/RepoHasher.kt +++ b/src/main/kotlin/app/hashers/RepoHasher.kt @@ -31,7 +31,7 @@ class RepoHasher(private val localRepo: LocalRepo, private val api: Api, fun update() { println("Hashing $localRepo...") - Logger.info("Hashing of repo started") + Logger.info { "Hashing of repo started" } val git = loadGit(localRepo.path) try { val (rehashes, emails) = fetchRehashesAndEmails(git) @@ -44,8 +44,8 @@ class RepoHasher(private val localRepo: LocalRepo, private val api: Api, val filteredEmails = filterEmails(emails) initServerRepo(rehashes.last) - Logger.debug("Local repo path: ${localRepo.path}") - Logger.debug("Repo rehash: ${serverRepo.rehash}") + Logger.debug { "Local repo path: ${localRepo.path}" } + Logger.debug { "Repo rehash: ${serverRepo.rehash}" } if (!isKnownRepo()) { // Notify server about new contributor and his email. @@ -89,8 +89,8 @@ class RepoHasher(private val localRepo: LocalRepo, private val api: Api, } println("Hashing $localRepo successfully finished.") - Logger.info("Hashing repo succesfully", - Logger.Events.HASHING_REPO_SUCCESS) + Logger.info(Logger.Events.HASHING_REPO_SUCCESS) + { "Hashing repo succesfully" } } finally { closeGit(git) @@ -118,15 +118,16 @@ class RepoHasher(private val localRepo: LocalRepo, private val api: Api, private fun getRepoFromServer() { val repo = api.getRepo(serverRepo.rehash) serverRepo.commits = repo.commits - Logger.info("Received repo from server with " + - serverRepo.commits.size + " commits") - Logger.debug(serverRepo.toString()) + Logger.info{ + "Received repo from server with ${serverRepo.commits.size} commits" + } + Logger.debug { serverRepo.toString() } } private fun postRepoToServer() { serverRepo.commits = listOf() api.postRepo(serverRepo) - Logger.debug(serverRepo.toString()) + Logger.debug { serverRepo.toString() } } private fun initServerRepo(initCommitRehash: String) { diff --git a/src/main/kotlin/app/ui/AddRepoState.kt b/src/main/kotlin/app/ui/AddRepoState.kt index 0e469577..7f76a7de 100644 --- a/src/main/kotlin/app/ui/AddRepoState.kt +++ b/src/main/kotlin/app/ui/AddRepoState.kt @@ -47,7 +47,7 @@ class AddRepoState constructor(private val context: Context, } } - Logger.info("Config setup", Logger.Events.CONFIG_SETUP) + Logger.info(Logger.Events.CONFIG_SETUP) { "Config setup" } } override fun next() { diff --git a/src/main/kotlin/app/ui/AuthState.kt b/src/main/kotlin/app/ui/AuthState.kt index ff802b2f..11446e6e 100644 --- a/src/main/kotlin/app/ui/AuthState.kt +++ b/src/main/kotlin/app/ui/AuthState.kt @@ -78,7 +78,7 @@ class AuthState constructor(private val context: Context, saveCredentialsIfChanged() Logger.username = configurator.getUsername() - Logger.info("Auth success", Logger.Events.AUTH) + Logger.info(Logger.Events.AUTH) { "Auth success" } return true } catch (e: RequestException) { diff --git a/src/main/kotlin/app/ui/UpdateRepoState.kt b/src/main/kotlin/app/ui/UpdateRepoState.kt index 43c7fc0f..d0d3d96a 100644 --- a/src/main/kotlin/app/ui/UpdateRepoState.kt +++ b/src/main/kotlin/app/ui/UpdateRepoState.kt @@ -18,7 +18,7 @@ class UpdateRepoState constructor(private val context: Context, : ConsoleState { override fun doAction() { println("Hashing your git repositories.") - Logger.info("Hashing started") + Logger.info { "Hashing started" } for (repo in configurator.getLocalRepos()) { try { @@ -34,7 +34,7 @@ class UpdateRepoState constructor(private val context: Context, println("The repositories have been hashed. See result online on your " + "Sourcerer profile.") - Logger.info("Hashing success", Logger.Events.HASHING_SUCCESS) + Logger.info(Logger.Events.HASHING_SUCCESS) { "Hashing success" } } override fun next() {