Skip to content

Commit 2bef928

Browse files
author
Patrice de Saint Steban
committed
🔧 Improve error handling and logging for Gitmoji translations
1 parent d7a0c92 commit 2bef928

File tree

3 files changed

+123
-97
lines changed

3 files changed

+123
-97
lines changed

src/main/kotlin/com/github/patou/gitmoji/GitCommitAction.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package com.github.patou.gitmoji
22

3-
import com.intellij.ide.TextCopyProvider
43
import com.intellij.ide.util.PropertiesComponent
54
import com.intellij.openapi.actionSystem.ActionUpdateThread
65
import com.intellij.openapi.actionSystem.AnAction
76
import com.intellij.openapi.actionSystem.AnActionEvent
8-
import com.intellij.openapi.actionSystem.PlatformCoreDataKeys
9-
import com.intellij.openapi.actionSystem.PlatformDataKeys
107
import com.intellij.openapi.application.ApplicationManager.getApplication
118
import com.intellij.openapi.command.CommandProcessor
129
import com.intellij.openapi.command.undo.UndoManager
@@ -27,7 +24,6 @@ import com.intellij.ui.SimpleTextAttributes
2724
import com.intellij.ui.awt.RelativePoint
2825
import com.intellij.ui.speedSearch.SpeedSearchUtil.applySpeedSearchHighlighting
2926
import com.intellij.util.ObjectUtils.sentinel
30-
import com.intellij.util.containers.nullize
3127
import com.intellij.util.ui.JBUI.scale
3228
import com.intellij.vcs.commit.message.CommitMessageInspectionProfile.getSubjectRightMargin
3329
import java.awt.Point
@@ -57,14 +53,12 @@ class GitCommitAction : AnAction() {
5753
}
5854
}
5955

60-
@Suppress("MissingActionUpdateThread")
6156
private fun createPopup(
6257
project: Project,
6358
commitMessage: CommitMessage,
6459
listGitmoji: List<GitmojiData>
6560
): JBPopup {
66-
var chosenMessage: GitmojiData? = null
67-
var selectedMessage: GitmojiData? = null
61+
var wasChosen = false
6862
val rightMargin = getSubjectRightMargin(project)
6963
val previewCommandGroup = sentinel("Preview Commit Message")
7064
val projectInstance = PropertiesComponent.getInstance(project)
@@ -77,11 +71,10 @@ class GitCommitAction : AnAction() {
7771
.setFont(commitMessage.editorField.editor?.colorsScheme?.getFont(EditorFontType.PLAIN))
7872
.setVisibleRowCount(7)
7973
.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
80-
.setItemSelectedCallback {
81-
selectedMessage = it
82-
it?.let { preview(project, commitMessage, it, currentCommitMessage, currentOffset, previewCommandGroup) }
74+
.setItemSelectedCallback { gitmoji ->
75+
gitmoji?.let { preview(project, commitMessage, it, currentCommitMessage, currentOffset, previewCommandGroup) }
8376
}
84-
.setItemChosenCallback { chosenMessage = it }
77+
.setItemChosenCallback { wasChosen = true }
8578
.setRenderer(object : ColoredListCellRenderer<GitmojiData>() {
8679
override fun customizeCellRenderer(
8780
list: JList<out GitmojiData>,
@@ -123,10 +116,7 @@ class GitCommitAction : AnAction() {
123116
commitMessage.editorField.requestFocusInWindow()
124117
// Use invokeLater() as onClosed() is called before callback from setItemChosenCallback
125118
getApplication().invokeLater {
126-
chosenMessage ?: cancelPreview(
127-
project,
128-
commitMessage
129-
)
119+
if (!wasChosen) cancelPreview(project, commitMessage)
130120
}
131121
}
132122
})

src/main/kotlin/com/github/patou/gitmoji/GitmojiLocale.kt

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.github.patou.gitmoji
22

33
import com.intellij.ide.util.PropertiesComponent
4+
import com.intellij.openapi.diagnostic.Logger
45
import okhttp3.*
56
import org.yaml.snakeyaml.Yaml
67
import java.io.IOException
78
import java.util.*
89

910
object GitmojiLocale {
1011

12+
private val logger = Logger.getInstance(GitmojiLocale::class.java)
1113
private var translations: MutableMap<String, String> = HashMap()
1214

1315
val LANGUAGE_CONFIG_LIST = arrayOf("auto", "en_US", "zh_CN", "fr_FR", "ru_RU", "pt_BR")
@@ -35,19 +37,38 @@ object GitmojiLocale {
3537
}
3638
val client = OkHttpClient().newBuilder().addInterceptor(SafeGuardInterceptor()).build()
3739
val request: Request = Request.Builder()
38-
.url("https://raw.githubusercontent.com/patou/gitmoji-intellij-plugin/master/src/main/resources/gitmojis-${language}.yaml")
40+
.url("https://raw.githubusercontent.com/patou/gitmoji-intellij-plugin/master/src/main/resources/R")
3941
.build()
4042
client.newCall(request).enqueue(object : Callback {
4143
override fun onFailure(call: Call, e: IOException) {
44+
logger.warn("Failed to download translations for $language, falling back to local", e)
4245
loadLocalYaml(language)
4346
}
4447

4548
override fun onResponse(call: Call, response: Response) {
4649
response.use {
4750
if (!response.isSuccessful) {
51+
logger.warn("Unsuccessful response (${response.code}) when downloading translations for $language, falling back to local")
4852
loadLocalYaml(language)
4953
} else {
50-
loadYaml(response.body!!.string())
54+
val bodyText = try {
55+
response.body?.string()
56+
} catch (e: Exception) {
57+
logger.warn("Failed to read response body for translations ($language), falling back to local", e)
58+
null
59+
}
60+
61+
if (bodyText.isNullOrEmpty()) {
62+
loadLocalYaml(language)
63+
} else {
64+
try {
65+
loadYaml(bodyText)
66+
} catch (e: Exception) {
67+
// parsing failed (malformed YAML) -> fallback local
68+
logger.warn("Failed to parse remote YAML translations for $language, falling back to local", e)
69+
loadLocalYaml(language)
70+
}
71+
}
5172
}
5273
}
5374
}
@@ -57,23 +78,38 @@ object GitmojiLocale {
5778
// load local yaml
5879
private fun loadLocalYaml(language: String) {
5980
val yaml = Yaml()
60-
javaClass.getResourceAsStream("/gitmojis-${language}.yaml").use { inputStream ->
61-
if (inputStream != null) {
62-
addTranslation(yaml.loadAs(inputStream, HashMap::class.java))
81+
try {
82+
javaClass.getResourceAsStream("/gitmojis-${language}.yaml").use { inputStream ->
83+
if (inputStream != null) {
84+
try {
85+
addTranslation(yaml.loadAs(inputStream, HashMap::class.java))
86+
} catch (e: Exception) {
87+
logger.error("Failed to parse local YAML translations for $language", e)
88+
}
89+
} else {
90+
logger.warn("Local translations resource not found for $language")
91+
}
6392
}
93+
} catch (e: Exception) {
94+
logger.error("Unexpected error while loading local translations for $language", e)
6495
}
6596
}
6697

6798
// load remote yaml
6899
private fun loadYaml(text: String) {
69100
val yaml = Yaml()
70-
addTranslation(yaml.loadAs(text, HashMap::class.java))
101+
try {
102+
addTranslation(yaml.loadAs(text, HashMap::class.java))
103+
} catch (e: Exception) {
104+
logger.error("Failed to parse YAML translations from text", e)
105+
throw e
106+
}
71107
}
72108

73109
private fun addTranslation(loadedTranslation : HashMap<*, *>) {
74-
loadedTranslation["gitmojis"]?.let { it ->
75-
if (it is Map<*, *>) {
76-
it.forEach { (key, value) ->
110+
loadedTranslation["gitmojis"]?.let { gitmojis ->
111+
if (gitmojis is Map<*, *>) {
112+
gitmojis.forEach { (key, value) ->
77113
translations[key.toString()] = value.toString()
78114
}
79115
}
Lines changed: 73 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,74 @@
11
gitmojis:
2-
art: Melhorar a estrutura ou formatação do código.
3-
zap: Melhorar a performance.
4-
fire: Remover código ou arquivos.
5-
bug: Corrigir um bug.
6-
ambulance: Correção crítica.
7-
sparkles: Adicionar novas funcionalidades.
8-
memo: Adicionar ou atualizar a documentação.
9-
rocket: Realizar deploy.
10-
lipstick: Adicionar ou atualizar a interface e os arquivos de estilo.
11-
tada: Iniciar um projeto.
12-
white-check-mark: Adicionar, atualizar ou passar testes.
13-
lock: Corrigir problemas de segurança ou privacidade.
14-
closed-lock-with-key: Adicionar ou atualizar segredos.
15-
bookmark: Tags de versão/release.
16-
rotating-light: Corrigir alertas do compilador ou linter.
17-
construction: Trabalho em andamento.
18-
green-heart: Corrigir compilação do build (CI).
19-
arrow-down: Fazer downgrade de dependências.
20-
arrow-up: Atualizar dependências.
21-
pushpin: Fixar dependências em versões específicas.
22-
construction-worker: Adicionar ou atualizar o sistema de build (CI).
23-
chart-with-upwards-trend: Adicionar ou atualizar códigos de analytics ou rastreamento.
24-
recycle: Refatorar código.
25-
heavy-plus-sign: Adicionar uma dependência.
26-
heavy-minus-sign: Remover uma dependência.
27-
wrench: Adicionar ou atualizar arquivos de configuração.
28-
hammer: Adicionar ou atualizar scripts de desenvolvimento.
29-
globe-with-meridians: Internacionalização e localização.
30-
pencil2: Corrigir erros de digitação.
31-
poop: Escrever código ruim que precisa ser melhorado.
32-
rewind: Reverter mudanças.
33-
twisted-rightwards-arrows: Mesclar branches.
34-
package: Adicionar ou atualizar arquivos compilados ou pacotes.
35-
alien: Atualizar código devido a mudanças em APIs externas.
36-
truck: Mover ou renomear recursos (ex.: arquivos, caminhos, rotas).
37-
page-facing-up: Adicionar ou atualizar licença.
38-
boom: Introduzir mudanças que quebram a retrocompatibilidade.
39-
bento: Adicionar ou atualizar recursos gráficos.
40-
wheelchair: Melhorar a acessibilidade.
41-
bulb: Adicionar ou atualizar comentários no código.
42-
beers: Escrever código sob influência (brincadeira).
43-
speech-balloon: Adicionar ou atualizar textos e literais.
44-
card-file-box: Realizar alterações relacionadas a banco de dados.
45-
loud-sound: Adicionar ou atualizar logs.
46-
mute: Remover logs.
47-
busts-in-silhouette: Adicionar ou atualizar colaboradores.
48-
children-crossing: Melhorar a experiência ou usabilidade do usuário.
49-
building-construction: Fazer mudanças arquiteturais.
50-
iphone: Trabalhar em design responsivo.
51-
clown-face: Criar mocks ou simulações.
52-
egg: Adicionar ou atualizar um easter egg.
53-
see-no-evil: Adicionar ou atualizar o arquivo .gitignore.
54-
camera-flash: Adicionar ou atualizar snapshots (ex.: testes visuais).
55-
alembic: Realizar experimentos.
56-
mag: Melhorar SEO.
57-
label: Adicionar ou atualizar tipos.
58-
seedling: Adicionar ou atualizar dados de seed (inicialização).
59-
triangular-flag-on-post: Adicionar, atualizar ou remover feature flags.
60-
goal-net: Capturar erros.
61-
dizzy: Adicionar ou atualizar animações e transições.
62-
wastebasket: Deprecar código que será removido futuramente.
63-
passport-control: Trabalhar com autorização, permissões e papéis.
64-
adhesive-bandage: Correção simples para um problema não crítico.
65-
monocle-face: Exploração ou inspeção de dados.
66-
coffin: Remover código morto.
67-
test-tube: Adicionar um teste que deve falhar.
68-
necktie: Adicionar ou atualizar regras de negócio.
69-
stethoscope: Adicionar ou atualizar verificação de integridade (healthcheck).
70-
bricks: Alterações relacionadas à infraestrutura.
71-
technologist: Melhorar a experiência do desenvolvedor.
72-
money-with-wings: Adicionar patrocínios ou estrutura relacionada a dinheiro.
73-
thread: Adicionar ou atualizar código relacionado a multithreading ou concorrência.
74-
safety-vest: Adicionar ou atualizar código relacionado a validações.
2+
art: "Melhorar a estrutura ou formatação do código."
3+
zap: "Melhorar a performance."
4+
fire: "Remover código ou arquivos."
5+
bug: "Corrigir um bug."
6+
ambulance: "Correção crítica."
7+
sparkles: "Adicionar novas funcionalidades."
8+
memo: "Adicionar ou atualizar a documentação."
9+
rocket: "Realizar deploy."
10+
lipstick: "Adicionar ou atualizar a interface e os arquivos de estilo."
11+
tada: "Iniciar um projeto."
12+
white-check-mark: "Adicionar, atualizar ou passar testes."
13+
lock: "Corrigir problemas de segurança ou privacidade."
14+
closed-lock-with-key: "Adicionar ou atualizar segredos."
15+
bookmark: "Tags de versão/release."
16+
rotating-light: "Corrigir alertas do compilador ou linter."
17+
construction: "Trabalho em andamento."
18+
green-heart: "Corrigir compilação do build (CI)."
19+
arrow-down: "Fazer downgrade de dependências."
20+
arrow-up: "Atualizar dependências."
21+
pushpin: "Fixar dependências em versões específicas."
22+
construction-worker: "Adicionar ou atualizar o sistema de build (CI)."
23+
chart-with-upwards-trend: "Adicionar ou atualizar códigos de analytics ou rastreamento."
24+
recycle: "Refatorar código."
25+
heavy-plus-sign: "Adicionar uma dependência."
26+
heavy-minus-sign: "Remover uma dependência."
27+
wrench: "Adicionar ou atualizar arquivos de configuração."
28+
hammer: "Adicionar ou atualizar scripts de desenvolvimento."
29+
globe-with-meridians: "Internacionalização e localização."
30+
pencil2: "Corrigir erros de digitação."
31+
poop: "Escrever código ruim que precisa ser melhorado."
32+
rewind: "Reverter mudanças."
33+
twisted-rightwards-arrows: "Mesclar branches."
34+
package: "Adicionar ou atualizar arquivos compilados ou pacotes."
35+
alien: "Atualizar código devido a mudanças em APIs externas."
36+
truck: "Mover ou renomear recursos (ex.: arquivos, caminhos, rotas)."
37+
page-facing-up: "Adicionar ou atualizar licença."
38+
boom: "Introduzir mudanças que quebram a retrocompatibilidade."
39+
bento: "Adicionar ou atualizar recursos gráficos."
40+
wheelchair: "Melhorar a acessibilidade."
41+
bulb: "Adicionar ou atualizar comentários no código."
42+
beers: "Escrever código sob influência (brincadeira)."
43+
speech-balloon: "Adicionar ou atualizar textos e literais."
44+
card-file-box: "Realizar alterações relacionadas a banco de dados."
45+
loud-sound: "Adicionar ou atualizar logs."
46+
mute: "Remover logs."
47+
busts-in-silhouette: "Adicionar ou atualizar colaboradores."
48+
children-crossing: "Melhorar a experiência ou usabilidade do usuário."
49+
building-construction: "Fazer mudanças arquiteturais."
50+
iphone: "Trabalhar em design responsivo."
51+
clown-face: "Criar mocks ou simulações."
52+
egg: "Adicionar ou atualizar um easter egg."
53+
see-no-evil: "Adicionar ou atualizar o arquivo .gitignore."
54+
camera-flash: "Adicionar ou atualizar snapshots (ex.: testes visuais)."
55+
alembic: "Realizar experimentos."
56+
mag: "Melhorar SEO."
57+
label: "Adicionar ou atualizar tipos."
58+
seedling: "Adicionar ou atualizar dados de seed (inicialização)."
59+
triangular-flag-on-post: "Adicionar, atualizar ou remover feature flags."
60+
goal-net: "Capturar erros."
61+
dizzy: "Adicionar ou atualizar animações e transições."
62+
wastebasket: "Deprecar código que será removido futuramente."
63+
passport-control: "Trabalhar com autorização, permissões e papéis."
64+
adhesive-bandage: "Correção simples para um problema não crítico."
65+
monocle-face: "Exploração ou inspeção de dados."
66+
coffin: "Remover código morto."
67+
test-tube: "Adicionar um teste que deve falhar."
68+
necktie: "Adicionar ou atualizar regras de negócio."
69+
stethoscope: "Adicionar ou atualizar verificação de integridade (healthcheck)."
70+
bricks: "Alterações relacionadas à infraestrutura."
71+
technologist: "Melhorar a experiência do desenvolvedor."
72+
money-with-wings: "Adicionar patrocínios ou estrutura relacionada a dinheiro."
73+
thread: "Adicionar ou atualizar código relacionado a multithreading ou concorrência."
74+
safety-vest: "Adicionar ou atualizar código relacionado a validações."

0 commit comments

Comments
 (0)