Skip to content

Commit

Permalink
регистровая логика
Browse files Browse the repository at this point in the history
  • Loading branch information
d.molchanov committed Oct 31, 2021
1 parent 327aa6c commit a092770
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 52 deletions.
1 change: 0 additions & 1 deletion .idea/.name

This file was deleted.

2 changes: 1 addition & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 0 additions & 8 deletions .idea/modules.xml

This file was deleted.

41 changes: 30 additions & 11 deletions src/main/kotlin/dmitriy/molchanov/GitMessageTagCheckerProvider.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.changes.LocalChangeList
import com.intellij.openapi.vcs.changes.ui.CommitMessageProvider
import dmitriy.molchanov.data.Repository
import dmitriy.molchanov.model.Rule
import git4idea.repo.GitRepository
import git4idea.repo.GitRepositoryManager

Expand All @@ -14,30 +15,48 @@ class GitMessageTagCheckerProvider : CommitMessageProvider {
val gitRepositoryManager = GitRepositoryManager.getInstance(project)
val currentRepository = gitRepositoryManager.repositories.firstOrNull()
val branchName = currentRepository?.currentBranch?.name ?: return lastComment
val regex = getRegexForRepository(currentRepository) ?: return lastComment
val rule = getRuleForRepository(currentRepository)
val regex = rule?.regexPrefix?.let(::Regex) ?: return lastComment
val match = regex.find(branchName)
return match?.value
?.let { taskPrefix -> getConcatenatedMessage(lastComment, taskPrefix, regex) }
?.let { taskPrefix ->
getConcatenatedMessage(
lastComment = lastComment,
taskPrefix = taskPrefix,
startWith = rule.startWith,
endWith = rule.endWith,
isUpperCase = rule.isUpperCase
)
}
?: lastComment
}

private fun getRegexForRepository(repository: GitRepository): Regex? {
private fun getRuleForRepository(repository: GitRepository): Rule? {
val remoteUrl = repository
.info.remotes.firstOrNull()
?.firstUrl
?: return null
return Repository.instance
.getRules()
.firstOrNull { it.gitRepo.trim() == remoteUrl.trim() }
?.regexPrefix
?.let(::Regex)
}

private fun getConcatenatedMessage(lastComment: String?, taskPrefix: String, regex: Regex): String {
if (lastComment.isNullOrEmpty()) return "$taskPrefix "
val currentPrefix = regex.find(lastComment)?.value
return currentPrefix
?.let { lastComment.replace(currentPrefix, taskPrefix) }
?: "$taskPrefix $lastComment"
private fun getConcatenatedMessage(
lastComment: String?,
taskPrefix: String,
startWith: String,
endWith: String,
isUpperCase: Boolean?
): String {
val registeredPrefix = when (isUpperCase) {
false -> taskPrefix.lowercase()
true -> taskPrefix.uppercase()
else -> taskPrefix
}
val fullPrefix = "$startWith$registeredPrefix$endWith"
return when {
lastComment?.contains(fullPrefix) == true -> lastComment
else -> fullPrefix
}
}
}
9 changes: 3 additions & 6 deletions src/main/kotlin/dmitriy/molchanov/Strings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,8 @@ object Strings {
const val STAR_ON_GITHUB = "star on github."
const val GITHUB_URL = "https://github.com/MolchanovDmitry/CommitPrefixIdeaPlugin"
const val RESULT = "Result:"
const val COMMIT_MESSAGE = "some commit message.\n"

const val COMMIT_MESSAGE = "your commit message.\n"
const val REGISTER_NONE = "None"
const val REGISTER_LOWER = "Lover case"
const val REGISTER_UPPER = "Upper case"

val registers by lazy(LazyThreadSafetyMode.NONE) { arrayOf(REGISTER_NONE, REGISTER_LOWER, REGISTER_UPPER) }
const val REGISTER_LOWER_CASE = "Lower case"
const val REGISTER_UPPER_CASE = "Upper case"
}
19 changes: 15 additions & 4 deletions src/main/kotlin/dmitriy/molchanov/model/Rule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,24 @@ package dmitriy.molchanov.model
import dmitriy.molchanov.Strings
import java.io.Serializable

/**
* Правило для сохранения.
*
* @property gitRepo репозиторий, для которого актуально правило
* @property regexPrefix регулярное выражение
* @property checkString строка для проверки
* @property startWith строка, которая будет подставляться в начало нашего префикса
* @property endWith строка, которая будет подставляться в конец нашего префикса
* @property isUpperCase перевести префикс в:
* true -> верхний регистр, false - нижний регистр, null -> не переводить.
*/
class Rule : Serializable {
var gitRepo: String
var regexPrefix: String
var checkString: String
var startWith: String
var endWith: String
var register: String
var isUpperCase: Boolean?

@Suppress("unused") //serialization fix
constructor() {
Expand All @@ -18,7 +29,7 @@ class Rule : Serializable {
checkString = Strings.EMPTY
startWith = Strings.EMPTY
endWith = Strings.EMPTY
register = Strings.EMPTY
isUpperCase = null
}

constructor(
Expand All @@ -27,13 +38,13 @@ class Rule : Serializable {
checkString: String,
startWith: String,
endWith: String,
register: String
isUpperCase: Boolean?
) {
this.gitRepo = gitRepo
this.regexPrefix = regexPrefix
this.checkString = checkString
this.startWith = startWith
this.endWith = endWith
this.register = register
this.isUpperCase = isUpperCase
}
}
56 changes: 36 additions & 20 deletions src/main/kotlin/dmitriy/molchanov/ui/add/AddRuleDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class AddRuleDialog(
checkString = checkStringEdit.text,
startWith = startWithEdit.text,
endWith = endWithEdit.text,
register = registerBox.selectedItem?.toString() ?: Strings.REGISTER_NONE
isUpperCase = shouldRuleBuUpperCase()
)
}

Expand All @@ -57,11 +57,11 @@ class AddRuleDialog(
addActionListener { updateCheckString() }
editablePrefix?.gitRepo?.let(::setToolTipText)
}
private val registerBox = ComboBox(Strings.registers).apply {
isEditable = true
selectedItem = editablePrefix?.register ?: Strings.REGISTER_NONE
addActionListener { updateDialogStatus() }
}
private val registerBox =
ComboBox(arrayOf(Strings.REGISTER_NONE, Strings.REGISTER_LOWER_CASE, Strings.REGISTER_UPPER_CASE)).apply {
selectedItem = editablePrefix?.isUpperCase?.registerString() ?: Strings.REGISTER_NONE
addActionListener { updateDialogStatus() }
}

private val keyListener = object : KeyListener {
override fun keyTyped(p0: KeyEvent?) {}
Expand All @@ -85,23 +85,24 @@ class AddRuleDialog(
val getRepLabel = JLabel(Strings.GIT_REPO)
val prefixLabel = JLabel(Strings.REGEX_PREFIX)
val registerLabel = JLabel(Strings.REGISTER)
val messagePrefixLabel = JLabel(Strings.START_WITH)
val messageSuffixLabel = JLabel(Strings.END_WITH)
val startWithLabel = JLabel(Strings.START_WITH)
val endWithLabel = JLabel(Strings.END_WITH)
val checkStringLabel = JLabel(Strings.CHECK_BRANCH)

val gitRepGroup = getViewGroup(getRepLabel, gitRepBox)
val prefixGroup = getViewGroup(prefixLabel, prefixEdit)
val checkStringGroup = getViewGroup(checkStringLabel, checkStringEdit)

val registerGroup = getViewGroup(registerLabel, registerBox)
val messagePrefixGroup = getViewGroup(messagePrefixLabel, startWithEdit)
val messageSuffixGroup = getViewGroup(messageSuffixLabel, endWithEdit)
val startWithGroup = getViewGroup(startWithLabel, startWithEdit)
val endWithGroup = getViewGroup(endWithLabel, endWithEdit)
val statusGroup = getCheckText(statusLabel)

val messageGroup = getViewGroup(messagePrefixGroup, messageSuffixGroup)
val registerGroup = getViewGroup(registerLabel, registerBox)

val messageGroup = getViewGroup(startWithGroup, endWithGroup)

// Определение размеров надписей к текстовым полям
GuiUtils.makeSameSize(arrayOf(getRepLabel, prefixLabel, checkStringLabel, registerLabel, messagePrefixLabel))
GuiUtils.makeSameSize(arrayOf(getRepLabel, prefixLabel, checkStringLabel, registerLabel, startWithLabel))

root.add(gitRepGroup)
root.add(prefixGroup)
Expand Down Expand Up @@ -186,15 +187,30 @@ class AddRuleDialog(
private fun String.formatByParams(): String {
val prefix = startWithEdit.text
val suffix = endWithEdit.text

val isUpperCase = registerBox.selectedItem?.toString() == Strings.REGISTER_UPPER
val isLowerCase = registerBox.selectedItem?.toString() == Strings.REGISTER_LOWER
val core = when {
isUpperCase -> uppercase()
isLowerCase -> lowercase()
val registeredValue = when(shouldRuleBuUpperCase()){
true -> uppercase()
false -> lowercase()
else -> this
}
return "$prefix$core$suffix"
return "$prefix$registeredValue$suffix"
}

/**
* Возвращает показатель регистра для правила.
* @return true перевести в верхний регистр.
* @return false перевести в нижний регистр.
* @return null не переводить.
*/
private fun shouldRuleBuUpperCase() = when (registerBox.selectedItem?.toString()) {
Strings.REGISTER_UPPER_CASE -> true
Strings.REGISTER_LOWER_CASE -> false
else -> null
}

private fun Boolean?.registerString() = when (this) {
true -> Strings.REGISTER_UPPER_CASE
false -> Strings.REGISTER_LOWER_CASE
else -> Strings.REGISTER_NONE
}

private class DialogStatus(val message: String, val shouldOkButtonActive: Boolean)
Expand Down

0 comments on commit a092770

Please sign in to comment.