-
Notifications
You must be signed in to change notification settings - Fork 7
/
grammar.js
495 lines (467 loc) · 22.6 KB
/
grammar.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
const NEWLINE = /\r?\n/;
const ANYTHING_OR_NONE = /[^\n\r]*/;
const ANYTHING = /[^\n\r]+/;
const NOT_A_COMMENT = /[^#]/;
const SCISSORS = /# -+ >8 -+\r?\n/;
const BRANCH_NAME = /[^\s'”»"“]+/;
const COMMIT = /[0-9a-f]{7,40}/;
const FILEPATH = /\S+/;
const WHITESPACE = /[\f\v ]+/;
const SCOPE = /[^\n\r\(\)]+/;
const COMMENT = /[^\n\r]*\r?\n/;
const COMMENT_TITLE = /[^\n\r:\uff1a]+[:\uff1a]\s*\r?\n/;
const TRAILER_TOKEN = /[a-zA-Z-]+[ ]*[:\uff1a] /;
const GENERATED_COMMENT_TITLE = /[^\n\r:\uff1a]+[:\uff1a][ ]*/;
const NUMBER = /\d+/;
const BREAKING_CHANGE = /BREAKING[- ]CHANGE[ ]*[:\uff1a] /;
module.exports = grammar({
name: 'gitcommit',
extras: () => [],
externals: ($) => [$._conventional_type, $._trailer_value],
rules: {
source: ($) =>
seq(
repeat($.comment),
optional(seq(seq($.subject, NEWLINE), repeat($.comment))),
optional(seq(NEWLINE, alias(repeat($._body_line), $.message))),
optional($._generated_comments),
optional($._scissor)
),
subject: ($) =>
seq(
optional(
seq(alias(choice('fixup!', 'amend!'), $.subject_prefix), WHITESPACE)
),
choice(seq(NOT_A_COMMENT, ANYTHING_OR_NONE), seq($.prefix, ANYTHING))
),
prefix: ($) =>
seq(
alias($._conventional_type, $.type),
optional(seq('(', alias(SCOPE, $.scope), ')')),
optional('!'),
alias(/[:\uff1a]/, ':')
),
_body_line: ($) =>
choice($.message_line, $.breaking_change, $.trailer, $.comment, NEWLINE),
message_line: ($) => seq(seq(NOT_A_COMMENT, ANYTHING_OR_NONE)),
trailer: ($) =>
seq(alias(TRAILER_TOKEN, $.token), optional(alias(ANYTHING, $.value))),
breaking_change: ($) =>
seq(
// BREAKING_CHANGE conflicts with TRAILER_TOKEN, an so requires higher
// lexical precedence
alias(token(prec(1, BREAKING_CHANGE)), $.token),
optional(alias(ANYTHING, $.value))
),
comment: ($) =>
seq(
'#',
optional(WHITESPACE),
optional(
choice(alias(COMMENT_TITLE, $.title), token(prec(-1, COMMENT)))
)
),
_generated_comments: ($) =>
seq(
$._generated_comment_separator,
repeat(choice($.generated_comment, NEWLINE))
),
generated_comment: ($) =>
choice(
seq(/#\t/, $._change),
seq('# ', $.rebase_command),
seq(
/#[ ]*/,
optional(
choice(
$.rebase_command,
$._onbranch,
$._uptodate,
$._behind,
$._ahead,
$._detached_head,
$._rebasing,
$._interactive_rebasing,
seq(
alias(token(prec(-1, GENERATED_COMMENT_TITLE)), $.title),
optional(alias(COMMENT, $.value))
),
token(prec(-2, COMMENT))
)
)
)
),
_onbranch: ($) =>
seq(
alias(
choice(
'On branch ',
'Sur la branche ',
'Текущая ветка: ',
'På grenen ',
'Üzerinde bulunulan dal: ',
'Trên nhánh ',
'位於分支 ',
'Em ramo ',
'Na gałęzi ',
'현재 브랜치 ',
'Sul branch ',
'Pada cabang ',
'En la rama ',
'Στον κλάδο ',
'Auf Branch ',
'En la branca ',
'На клон '
),
$.text
),
alias(BRANCH_NAME, $.branch),
NEWLINE
),
branch: () => BRANCH_NAME,
_commit: () => COMMIT,
number: () => NUMBER,
_generated_comment_separator: ($) =>
seq(
alias(
choice(
'# Please enter the commit message for your changes. Lines starting',
'# Introduïu el missatge de comissió per als vostres canvis.',
'# Introduïu el missatge de comissió dels vostres canvis.',
'# Introduïu el missatge de comissió pels vostres canvis. Es mantindran',
'# Bitte geben Sie eine Commit-Beschreibung für Ihre Änderungen ein. Zeilen,',
'# Bitte geben Sie eine Commit-Beschreibung für Ihre Änderungen ein. Zeilen, die',
'# Παρακαλώ εισάγετε το μήνυμα υποβολής για τις αλλαγές σας. Οι γραμμές που αρχίζουν',
'# Por favor ingresa el mensaje del commit para tus cambios. Las',
'# Veuillez saisir le message de validation pour vos modifications. Les lignes',
'# Veuillez saisir le message de validation pour vos modifications. Les lignes commençant',
'# Mohon masukkan pesan komit untuk perubahan Anda. Baris yang diawali',
'# Immetti il messaggio di commit per le modifiche. Le righe che iniziano',
"# 변경 사항에 대한 커밋 메시지를 입력하십시오. '%c' 문자로 시작하는",
'# Podaj komunikat zapisu swoich zmian. Wiersze zaczynające się',
'# Por favor, introduz a mensagem de memória das tuas alterações.',
'# Пожалуйста, введите сообщение коммита для ваших изменений. Строки,',
'# Ange incheckningsmeddelandet för dina ändringar. Rader som inleds',
"# Lütfen değişiklikleriniz için bir işleme iletisi girin. '%c' ile başlayan",
'# Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những',
'# Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng được',
"# 请为您的变更输入提交说明。以 '%c' 开始的行将被忽略。",
"# 请为您的变更输入提交说明。以 '%c' 开始的行将被忽略,而一个空的提交",
"# 请为您的变更输入提交说明。以 '%c' 开始的行将被保留,如果您愿意",
'# 請輸入描述您變更的提交訊息。',
'# 請輸入描述您變更的提交訊息。開頭是「%c」',
'# 請輸入描述您變更的提交訊息。會保留開頭是「%c」',
'# 請輸入描述您變更的提交訊息。會保留開頭是',
'# Въведете съобщението за подаване на промѐните. Редовете, които започват'
),
$.generated_comment
),
NEWLINE
),
_change: ($) =>
choice(
seq(optional($.change), optional(WHITESPACE), $._filepath),
token(prec(-1, ANYTHING))
),
change: ($) =>
field('kind', choice($.new, $.modified, $.renamed, $.deleted)),
new: () =>
choice(
'new file:',
'nouveau fichier :',
'нов файл:',
'fitxer nou:',
'neue Datei:',
'νέο αρχείο:',
'nuevos archivos:',
'berkas baru:',
'nuovo file:',
'새 파일:',
'nowy plik:',
'novo ficheiro:',
'новый файл:',
'ny fil:',
'yeni dosya:',
'tập tin mới:',
'新文件:',
'新檔案:'
),
deleted: () =>
choice(
'deleted:',
'supprimé :',
'изтрит:',
'suprimit:',
'gelöscht:',
'διαγραφή:',
'borrados:',
'terhapus:',
'eliminato:',
'삭제함:',
'usunięto:',
'eliminado:',
'удалено:',
'borttagen:',
'silindi:',
'đã xóa:',
'删除:',
'刪除:'
),
modified: () =>
choice(
'modified:',
'modifié :',
'променен:',
'modificat:',
'geändert:',
'τροποποίηση:',
'modificados:',
'terubah:',
'modificato:',
'수정함:',
'zmieniono:',
'modificado:',
'изменено:',
'ändrad:',
'değiştirildi:',
'đã sửa:',
'修改:',
'修改:'
),
renamed: () =>
choice(
'renamed:',
'renommé :',
'преименуван:',
'canviat de nom:',
'umbenannt:',
'μετονομασία:',
'renombrados:',
'terganti nama:',
'rinominato:',
'이름 바꿈:',
'zmieniono nazwę:',
'renomeado:',
'переименовано:',
'namnbytt:',
'yeniden adlandırıldı:',
'đã đổi tên:',
'重命名:',
'重新命名:'
),
_filepath: ($) =>
seq(
alias(FILEPATH, $.filepath),
optional(WHITESPACE),
optional(
seq(alias('->', $.arrow), WHITESPACE, alias(FILEPATH, $.filepath))
),
optional(alias(token(prec(-1, ANYTHING)), $.annotation))
),
_scissor: ($) => seq(alias(SCISSORS, $.scissor), $.diff),
_scissor_generated_comment: ($) =>
seq(
'#',
optional(
choice(
alias(GENERATED_COMMENT_TITLE, $.title),
token(prec(-1, ANYTHING))
)
)
),
diff: ($) =>
repeat1(
choice(
alias($._scissor_generated_comment, $.generated_comment),
seq(/[^#]/, optional(ANYTHING)),
NEWLINE
)
),
rebase_command: () =>
seq(
choice(
'pick',
'edit',
'squash',
'merge',
'fixup',
'drop',
'reword',
'exec',
'label',
'reset',
'break',
'merge'
),
ANYTHING
),
_uptodate: ($) =>
choice(
seq("Your branch is up to date with '", $.branch, "'."),
seq("Votre branche est à jour avec '", $.branch, "'."),
seq("您的分支與上游分支 '", $.branch, "' 一致。"),
seq("您的分支与上游分支 '", $.branch, "' 一致。"),
seq('Nhánh của bạn đã cập nhật với “', $.branch, '”.'),
seq("Dalınız '", $.branch, "' ile güncel."),
seq('Din gren är à jour med "', $.branch, '".'),
seq('Эта ветка соответствует «', $.branch, '».'),
seq("Teu ramo está atualizado com '", $.branch, "'."),
seq('Twoja gałąź jest na bieżąco z „', $.branch, '”.'),
seq("브랜치가 '", $.branch, "'에 맞게 업데이트된 상태입니다."),
seq("Il tuo branch è aggiornato rispetto a '", $.branch, "'."),
seq("Cabang Anda mutakhir dengan '", $.branch, "'."),
seq("Tu rama está actualizada con '", $.branch, "'."),
seq("Ο κλάδος σας είναι ενήμερος με το '", $.branch, "'."),
seq("Ihr Branch ist auf demselben Stand wie '", $.branch, "'."),
seq('La vostra branca està al dia amb «', $.branch, '».'),
seq('Клонът е обновен към „', $.branch, '“.')
),
_behind: ($) =>
// prettier-ignore
choice(
seq("Your branch is behind '", $.branch, "' by ", $.number, ' commit, and can be fast-forwarded.'),
seq("Your branch is behind '", $.branch, "' by ", $.number, ' commits, and can be fast-forwarded.'),
seq("Votre branche est en retard sur '", $.branch, "' de ", $.number, ' commit, et peut être mise à jour en avance rapide.'),
seq("Votre branche est en retard sur '", $.branch, "' de ", $.number, ' commits, et peut être mise à jour en avance rapide.'),
seq('La vostra branca està ', $.number, ' comissió per darrere de «', $.branch, '», i pot avançar-se ràpidament.'),
seq('La vostra branca està ', $.number, ' comissions per darrere de «', $.branch, '», i pot avançar-se ràpidament.'),
seq('Клонът ви е с ', $.number, ' подаване зад „', $.branch, '“ и може да бъде превъртян.'),
seq('Клонът ви е с ', $.number, ' подавания зад „', $.branch, '“ и може да бъде превъртян.'),
seq('Ihr Branch ist ', $.number, " Commit hinter '", $.branch, "', und kann vorgespult werden."),
seq('Ihr Branch ist ', $.number, " Commits hinter '", $.branch, "', und kann vorgespult werden."),
seq("Ο κλάδος σας είναι πίσω από το '", $.branch, "' κατά ", $.number, ' υποβολή, και μπορεί να κάνει ταχεία προώθηση.'),
seq("Ο κλάδος σας είναι πίσω από το '", $.branch, "' κατά ", $.number, ' υποβολές, και μπορεί να κάνει ταχεία προώθηση.'),
seq("Tu rama está detrás de '", $.branch, "' por ", $.number, ' commit, y puede ser avanzada rápido.'),
seq("Tu rama está detrás de '", $.branch, "' por ", $.number, ' commits, y puede ser avanzada rápido.'),
seq("Cabang Anda di belakang '", $.branch, "' oleh ", $.number, ' komit, dan bisa di maju-cepatkan.'),
seq("Cabang Anda di belakan '", $.branch, "' oleh ", $.number, ' komit, dan bisa di maju-cepatkan.'),
seq("Il tuo branch, rispetto a '", $.branch, "', è indietro di ", $.number, ' commit e ne posso eseguire il fast forward.'),
seq("Il tuo branch, rispetto a '", $.branch, "', è indietro di ", $.number, ' commit e ne posso eseguire il fast forward.'),
seq("브랜치가 '", $.branch, "'보다 ", $.number, '개 커밋 뒤에 있고, 앞으로 돌릴 수 있습니다.'),
seq('Nhánh của bạn đứng đằng sau “', $.branch, '” ', $.number, ' lần chuyển giao, và có thể được chuyển-tiếp-nhanh.'),
seq("Dalınız '", $.branch, "' dalından ", $.number, ' işleme geride ve ileri sarılabilir.'),
seq('Din gren ligger efter "', $.branch, '" med ', $.number, ' incheckning, och kan snabbspolas.'),
seq('Din gren ligger efter "', $.branch, '" med ', $.number, ' incheckningar, och kan snabbspolas.'),
seq('Ветка отстает от «', $.branch, '» на ', $.number, ' коммит и может быть быстро перемотана.'),
seq('Ветка отстает от «', $.branch, '» на ', $.number, ' коммита и может быть быстро перемотана.'),
seq('Ветка отстает от «', $.branch, '» на ', $.number, ' коммитов и может быть быстро перемотана.'),
seq("Teu ramo está atrás de '", $.branch, "' por ", $.number, ' memória, e pode ser avançado.'),
seq("Teu ramo está atrás de '", $.branch, "' por ", $.number, ' memórias, e pode ser avançado.'),
seq('Twoja gałąź jest za „', $.branch, '” o ', $.number, ' zapis i może zostać przewinięta.'),
seq('Twoja gałąź jest za „', $.branch, '” o ', $.number, ' zapisy i może zostać przewinięta.'),
seq('Twoja gałąź jest za „', $.branch, '” o ', $.number, ' zapisów i może zostać przewinięta.'),
seq("您的分支落后 '", $.branch, "' 共 ", $.number, ' 个提交,并且可以快进。'),
seq("您的分支落後 '", $.branch, "' 共 ", $.number, ' 個提交,並且可以快轉。')
),
_ahead: ($) =>
// prettier-ignore
choice(
seq("Your branch is ahead of '", $.branch, "' by ", $.number, ' commit.'),
seq("Your branch is ahead of '", $.branch, "' by ", $.number, ' commits.'),
seq("Votre branche est en avance sur '", $.branch, "' de ", $.number, ' commit.'),
seq("Votre branche est en avance sur '", $.branch, "' de ", $.number, ' commits.'),
seq("您的分支領先 '", $.branch, "' 共 ", $.number, ' 個提交。'),
seq("您的分支领先 '", $.branch, "' 共 ", $.number, ' 个提交。'),
seq('Nhánh của bạn đứng trước “', $.branch, '” ', $.number, ' lần chuyển giao.'),
seq("Dalınız '", $.branch, "' dalından ", $.number, ' işleme ileride.'),
seq('Din gren ligger före "', $.branch, '" med ', $.number, ' incheckning.'),
seq('Din gren ligger före "', $.branch, '" med ', $.number, ' incheckningar.'),
seq('Ваша ветка опережает «', $.branch, '» на ', $.number, ' коммит.'),
seq('Ваша ветка опережает «', $.branch, '» на ', $.number, ' коммита.'),
seq('Ваша ветка опережает «', $.branch, '» на ', $.number, ' коммитов.'),
seq('Ваша ветка опережает «', $.branch, '» на ', $.number, ' коммитов.'),
seq("Teu ramo está à frente de '", $.branch, "' por ", $.number, ' memória.'),
seq("Teu ramo está à frente de '", $.branch, "' por ", $.number, ' memórias.'),
seq('Twoja gałąź jest do przodu względem „', $.branch, '” o ', $.number, ' zapis.'),
seq('Twoja gałąź jest do przodu względem „', $.branch, '” o ', $.number, ' zapisy.'),
seq('Twoja gałąź jest do przodu względem „', $.branch, '” o ', $.number, ' zapisów.'),
seq("브랜치가 '", $.branch, "'보다 ", $.number, '개 커밋만큼 앞에 있습니다.'),
seq("Il tuo branch è avanti rispetto a '", $.branch, "' di ", $.number, ' commit.'),
seq("Il tuo branch è avanti rispetto a '", $.branch, "' di ", $.number, ' commit.'),
seq("Cabang Anda mendahului '", $.branch, "' oleh ", $.number, ' komit.'),
seq("Cabang Anda mendahului '", $.branch, "' oleh ", $.number, ' komit.'),
seq("Tu rama está adelantada a '", $.branch, "' por ", $.number, ' commit.'),
seq("Tu rama está adelantada a '", $.branch, "' por ", $.number, ' commits.'),
seq("Ο κλάδος σας είναι μπροστά από το '", $.branch, "' κατά ", $.number, ' υποβολή.'),
seq("Ο κλάδος σας είναι μπροστά από το '", $.branch, "' κατά ", $.number, ' υποβολές.'),
seq('Ihr Branch ist ', $.number, " Commit vor '", $.branch, "'."),
seq('Ihr Branch ist ', $.number, " Commits vor '", $.branch, "'."),
seq('La vostra branca està ', $.number, ' comissió per davant de «', $.branch, '».'),
seq('La vostra branca està ', $.number, ' comissions per davant de «', $.branch, '».'),
seq('Клонът ви е с ', $.number, ' подаване пред „', $.branch, '“.'),
seq('Клонът ви е с ', $.number, ' подавания пред „', $.branch, '“.')
),
_detached_head: ($) =>
seq(
alias(
choice(
'HEAD detached at ',
'Указателят „HEAD“ не е свързан и е при ',
'HEAD separat a ',
'HEAD losgelöst bei ',
'Αποσυνδεδεμένο HEAD στο ',
'HEAD desacoplada en ',
'HEAD détachée sur ',
'HEAD terlepas pada ',
'HEAD scollegato su ',
'HEAD가 다음 위치에서 분리: ',
'HEAD odłączone na ',
'HEAD desanexada em ',
'Отсоединённый указатель HEAD указывает на ',
'HEAD frånkopplad vid ',
'HEAD şurada ayrıldı: ',
'HEAD được tách rời tại ',
'头指针分离于 ',
'開頭指標分離於 '
),
$.text
),
alias($._commit, $.branch),
NEWLINE
),
_rebasing: ($) =>
// prettier-ignore
choice(
seq("You are currently rebasing branch '", $.branch, "' on '", $.branch, "'."),
seq("Vous êtes en train de rebaser la branche '", $.branch, "' sur '", $.branch, "'."),
seq("您在執行將分支 '", $.branch, "' 重定基底到 '", $.branch, "' 的動作。"),
seq("您在执行将分支 '", $.branch, "' 变基到 '", $.branch, "' 的操作。"),
seq('Bạn hiện nay đang thực hiện việc “rebase” nhánh “', $.branch, '” trên “', $.branch, '”.'),
seq("Şu anda '", $.branch, "' dalını '", $.branch, "' üzerine yeniden temellendiriyorsunuz."),
seq('Du håller på att ombasera grenen "', $.branch, '" ovanpå "', $.branch, '".'),
seq('Вы сейчас перемещаете ветку «', $.branch, '» над «', $.branch, '».'),
seq("Estás rebaseando ramo '", $.branch, "' sobre '", $.branch, "'."),
seq('Przestawiasz właśnie gałąź „', $.branch, '” na „', $.branch, '”.'),
seq("현재 '", $.branch, "' 브랜치를 '", $.branch, "' 위로 리베이스하는 중입니다."),
seq("Attualmente stai eseguendo il rebase del branch '", $.branch, "' su '", $.branch, "'."),
seq("Anda sedang mendasarkan ulang cabang '", $.branch, "' pada '", $.branch, "'."),
seq("Estás aplicando un rebase de la rama '", $.branch, "' sobre '", $.branch, "'."),
seq("Αυτή τη στιγμή κάνετε rebase τον κλάδο '", $.branch, "' στο '", $.branch, "'."),
seq("Sie sind gerade beim Rebase von Branch '", $.branch, "' auf '", $.branch, "'."),
seq('Actualment esteu fent «rebase» de la branca «', $.branch, '» en «', $.branch, '».'),
seq('В момента пребазирате клона „', $.branch, '“ върху „', $.branch, '“.')
),
_interactive_rebasing: ($) =>
// prettier-ignore
choice(
seq('interactive rebase in progress; onto ', $.branch),
seq('rebasage interactif en cours ; sur ', $.branch),
seq('извършвате интерактивно пребазиране върху ', $.branch),
seq('«rebase» interactiu en curs; sobre ', $.branch),
seq('interaktives Rebase im Gange; auf ', $.branch),
seq('εκτελείται διαδραστικό rebase, πάνω στο ', $.branch),
seq('rebase interactivo en progreso; sobre ', $.branch),
seq('sedang mendasarkan ulang interaktif; ke ', $.branch),
seq('rebase interattivo in corso su ', $.branch),
seq('대화형 리베이스 진행 중. 갈 위치는 ', $.branch),
seq('trwa interaktywne przestawianie na ', $.branch),
seq('rebase interativo em curso; sobre ', $.branch),
seq('интерактивное перемещение в процессе; над ', $.branch),
seq('interaktiv ombasering pågår; ovanpå ', $.branch),
seq('şunun üzerine etkileşimli yeniden temellendirme sürmekte: ', $.branch),
seq('rebase ở chế độ tương tác đang được thực hiện; lên trên ', $.branch),
seq('交互式变基操作正在进行中;至 ', $.branch),
seq('互動式重定基底動作正在進行中;至 ', $.branch)
),
},
});