1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-16 16:14:46 +02:00

Compare commits

...

22 Commits

Author SHA1 Message Date
Sébastien Helleu 285a6b8ce4 Version 4.7.0 2025-07-19 12:01:43 +02:00
Ivan Pešić be8e94f3cd core: update Serbian translations 2025-07-13 22:19:17 +02:00
Emir SARI db7ecc1af1 core: Update Turkish translations
Signed-off-by: Emir SARI <emir_sari@icloud.com>
2025-07-13 22:18:39 +02:00
Sébastien Helleu 74a4b3e249 core: move parameter "continue-on-failure" on the global level in schemathesis config 2025-07-02 22:53:00 +02:00
Sébastien Helleu be78d185ea relay/api: bump API version to 0.4.1 2025-07-02 20:52:42 +02:00
Sébastien Helleu 58067431de relay/api: process HTTP request received as soon as a NULL char is received
This fixes the API probe made by schemathesis, so it detects immediately that
such NULL byte is not allowed by WeeChat, instead of timing out after 10
seconds:

   API capabilities:

     Supports NULL byte in headers:    ✘
2025-07-02 20:32:09 +02:00
Sébastien Helleu 87e84d9053 ci: replace script tools/test_relay_api.sh by configuration file schemathesis.toml 2025-07-02 20:32:09 +02:00
Sébastien Helleu 902332c3e6 relay/api: move resource bodies into their paths in OpenAPI document 2025-07-02 20:32:09 +02:00
Sébastien Helleu 0b82429b39 relay/api: add example of value for the parameter buffer_id in OpenAPI document 2025-07-02 20:32:09 +02:00
Sébastien Helleu 8b2165d441 relay/api: fix example of ping data in OpenAPI document 2025-07-02 20:32:09 +02:00
Sébastien Helleu fca2412424 relay/api: fix example of completion list in OpenAPI document 2025-07-02 20:32:09 +02:00
Sébastien Helleu d279a80733 relay/api: remove extra double quote in example of line date (OpenAPI document) 2025-07-02 20:32:09 +02:00
Sébastien Helleu 4444addf4d relay/api: fix operationId of completion resource in OpenAPI document 2025-07-02 20:32:09 +02:00
Sébastien Helleu 4ce74403dc relay/api: fix typo in OpenAPI document 2025-07-02 20:32:09 +02:00
Sébastien Helleu 1db29cb1ed relay/api: reject any invalid or unknown password hash algorithm in handshake resource 2025-07-02 20:32:09 +02:00
Sébastien Helleu d8baabd250 relay/api: use "buffer_name" first if received, then "buffer_id" in completion and input resources
This fixes some tests done by shemathesis, which sends "buffer_id" to
0 (unknown buffer) and "buffer_name" to a valid buffer name.
2025-07-02 20:32:09 +02:00
Sébastien Helleu 4348036e2e tests: remove duplicated "HTTP/1.1" in some relay API tests 2025-07-02 20:32:09 +02:00
Sébastien Helleu 93ec10b563 relay/api: return HTTP error 405 (Method Not Allowed) when the method received is not allowed 2025-07-02 20:32:09 +02:00
Sébastien Helleu cd0486d5bb ci: set password hash iterations to 100 for API tests
This is much faster than the default number of iterations which is 100000).
2025-07-02 20:32:09 +02:00
Sébastien Helleu b4f28ed2d4 ci: set unlimited number of relay clients for API tests 2025-07-02 20:32:09 +02:00
Sébastien Helleu 323f80e914 core: add option weechat.completion.partial_completion_auto_expand (closes #2253) 2025-06-30 18:52:58 +02:00
Sébastien Helleu 56903738b5 core: always enable partial completion for templates in option weechat.completion.partial_completion_templates (issue #2253)
Previous behavior was to reverse the partial completion, which was confusing
when option like weechat.completion.partial_completion_command_arg was enabled
as well.
2025-06-30 18:52:58 +02:00
34 changed files with 738 additions and 767 deletions
+3 -1
View File
@@ -194,11 +194,13 @@ jobs:
weechat-headless \
--dir /tmp/weechat-test-api \
--run-command '/set relay.network.password "${{ env.RELAY_PASSWORD }}"' \
--run-command '/set relay.network.password_hash_iterations 100' \
--run-command '/set relay.network.max_clients 0' \
--run-command '/relay add api 9000' \
--daemon \
;
sleep 5
./tools/test_relay_api.sh http://localhost:9000
schemathesis run --url http://localhost:9000/api ./src/plugins/relay/api/weechat-relay-api.yaml
echo '*/quit' >/tmp/weechat-test-api/weechat_fifo_*
- name: Code coverage
+5 -1
View File
@@ -6,14 +6,16 @@ SPDX-License-Identifier: GPL-3.0-or-later
# WeeChat ChangeLog
## Version 4.7.0 (under dev)
## Version 4.7.0 (2025-07-19)
### Changed
- **breaking:** core: fix buffer overflow in function utf8_next_char and return NULL for empty string
- **breaking:** core: fix integer overflow and return "unsigned long" in function util_version_number
- core: write configuration files on disk only if there are changes ([#2250](https://github.com/weechat/weechat/issues/2250))
- core: always enable partial completion for templates in option weechat.completion.partial_completion_templates, add option weechat.completion.partial_completion_auto_expand to expand word on new completion ([#2253](https://github.com/weechat/weechat/issues/2253))
- core: add script name in output of `/debug hooks <plugin>`
- relay/api: return HTTP error 405 (Method Not Allowed) when the method received is not allowed
### Added
@@ -36,6 +38,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
- core: fix memory leak in function util_parse_delay
- irc: display nick changes and quit messages when option irc.look.ignore_tag_messages is enabled ([#2241](https://github.com/weechat/weechat/issues/2241))
- perl: fix build when multiplicity is not available ([#2243](https://github.com/weechat/weechat/issues/2243))
- relay/api: reject any invalid or unknown password hash algorithm in handshake resource
- relay/api: process HTTP request received as soon as a NULL char is received
- relay/weechat: fix empty buffers in client when WeeChat is running on Solaris/illumos
- build: fix build on Solaris/illumos (issue #2251)
+29 -58
View File
@@ -91,33 +91,23 @@ qweechat::
|       typing/ | Typing додатак.
|       xfer/ | Xfer додатак (IRC DCC фајл/разговор).
| tests/ | Тестови.
// TRANSLATION MISSING
|    fuzz/ | Fuzz testing.
// TRANSLATION MISSING
| core/ | Fuzz testing for core functions.
|    fuzz/ | Fuzz тестирање.
| core/ | Fuzz тестирање функција језгра.
|    unit/ | Unit тестови.
|       core/ | Unit тестови за функције језгра.
// TRANSLATION MISSING
|       hook/ | Unit tests for hook functions.
|       hook/ | Unit тестову за функције куке.
|       gui/ | Unit тестови за функције интерфејса.
// TRANSLATION MISSING
|       curses/ | Unit tests for Curses interface functions.
|       curses/ | Unit тестови за функције Curses интерфејса.
|    scripts/ | Тестови за API скриптовања.
|       python/ | Python скрипте за генерисање и покретање тестова за API скриптовања.
|       plugins/ | Unit тестови за додатке.
// TRANSLATION MISSING
|          alias/ | Unit tests for alias plugin.
|          alias/ | Unit тестови за alias додатак.
|          irc/ | Unit тестови за IRC додатак.
// TRANSLATION MISSING
|          logger/ | Unit tests for logger plugin.
// TRANSLATION MISSING
|          relay/ | Unit tests for relay plugin.
// TRANSLATION MISSING
|          trigger/ | Unit tests for trigger plugin.
// TRANSLATION MISSING
|          typing/ | Unit tests for typing plugin.
// TRANSLATION MISSING
|          xfer/ | Unit tests for xfer plugin.
|          logger/ | Unit тестови за logger додатак.
|          relay/ | Unit тестови за relay додатак.
|          trigger/ | Unit тестови за trigger додатак.
|          typing/ | Unit тестови за typing додатак.
|          xfer/ | Unit тестови за xfer додатак.
| doc/ | Документација.
| po/ | Фајлови превода (gettext).
| debian/ | Debian паковање.
@@ -426,24 +416,15 @@ WeeChat „језгро” се налази у следећим директо
|===
| Путања/фајл | Опис
| tests/ | Корен тестова.
// TRANSLATION MISSING
|    fuzz/ | Root of fuzz testing.
// TRANSLATION MISSING
| ossfuzz.sh | Build script for https://github.com/google/oss-fuzz[OSS-Fuzz ^↗^^].
// TRANSLATION MISSING
|       core/ | Root of fuzz testing for core.
// TRANSLATION MISSING
|       calc-fuzzer.c | Fuzz testing: калкулација израза.
// TRANSLATION MISSING
|       crypto-fuzzer.c | Fuzz testing: криптографске функције.
// TRANSLATION MISSING
|       secure-fuzzer.c | Fuzz testing: secured data.
// TRANSLATION MISSING
|       string-fuzzer.c | Fuzz testing: стрингови.
// TRANSLATION MISSING
|       utf8-fuzzer.c | Fuzz testing: UTF-8.
// TRANSLATION MISSING
|       util-fuzzer.c | Fuzz testing: utility functions.
|    fuzz/ | Корен fuzz тестирања.
| ossfuzz.sh | Скрипта изградње за https://github.com/google/oss-fuzz[OSS-Fuzz ^↗^^].
|       core/ | Корен fuzz тестирања за језгро.
|       calc-fuzzer.c | Fuzz тестирање: калкулација израза.
|       crypto-fuzzer.c | Fuzz тестирање: криптографске функције.
|       secure-fuzzer.c | Fuzz тестирање: обезбеђени подаци.
|       string-fuzzer.c | Fuzz тестирање: стрингови.
|       utf8-fuzzer.c | Fuzz тестирање: UTF-8.
|       util-fuzzer.c | Fuzz тестирање: услужне функције.
|    unit/ | Корен unit тестова.
|    tests.cpp | Програм који се користи за извршавање свих тестова.
|    tests-record.cpp | Бележење и претрага у приказаним порукама.
@@ -490,13 +471,10 @@ WeeChat „језгро” се налази у следећим директо
|             test-hook-timer.cpp | Тестови: куке „timer”.
|             test-hook-url.cpp | Тестови: куке „url”.
|       gui/ | Корен unit тестова интерфејса.
// TRANSLATION MISSING
|          test-gui-bar-item-custom.cpp | Tests: custom bar item functions.
// TRANSLATION MISSING
|          test-gui-bar-item.cpp | Tests: bar item functions.
|          test-gui-bar-item-custom.cpp | Тестови: функције ставки прилагођене траке.
|          test-gui-bar-item.cpp | Тестови: функције ставки траке.
|          test-gui-bar-window.cpp | Тестови: функције прозора траке.
// TRANSLATION MISSING
|          test-gui-bar.cpp | Tests: bar functions.
|          test-gui-bar.cpp | Тестови: функције траке.
|          test-gui-buffer.cpp | Тестови: бафер функције.
|          test-gui-chat.cpp | Тестови: чет функције.
|          test-gui-color.cpp | Тестови: боје.
@@ -519,10 +497,8 @@ WeeChat „језгро” се налази у следећим директо
|       test-plugin-config.cpp | Тестови: функције конфигурације додатка.
|       test-plugin-api-info.cpp | Тестови: инфо функције API додатака.
|       test-plugins.cpp | Тестови: plugins.
// TRANSLATION MISSING
|          alias/ | Root of unit tests for alias plugin.
// TRANSLATION MISSING
|             test-alias.cpp | Tests: aliases.
|          alias/ | Корен unit тестова за alias додатак.
|             test-alias.cpp | Тестови: алијаси.
|          irc/ | Корен unit тестова IRC додатка.
|             test-irc-batch.cpp | Тестови: IRC пакетни догађаји.
|             test-irc-buffer.cpp | Тестови: IRC бафери.
@@ -556,12 +532,9 @@ WeeChat „језгро” се налази у следећим директо
|                test-relay-api.cpp | Тестови: Релеј „api” протокол: опште функције.
|                test-relay-api-msg.cpp | Тестови: Релеј „api” протокол: поруке.
|                test-relay-api-protocol.cpp | Тестови: Релеј „api” протокол: протокол.
// TRANSLATION MISSING
|             remote/ | Tests: Relay "api" protocol: remote functions.
// TRANSLATION MISSING
|             test-relay-remote-event.cpp | Tests: Relay "api" protocol: remote events.
// TRANSLATION MISSING
|             test-relay-remote-network.cpp | Tests: Relay "api" protocol: remote network.
|             remote/ | Тестови: Релеј „api” протокол: удаљене функције.
|             test-relay-remote-event.cpp | Тестови: Релеј „api” протокол: удаљени догађаји.
|             test-relay-remote-network.cpp | Тестови: Релеј „api” протокол: удаљена мрежа.
|             irc/ | Корен unit тестова за Релеј „irc” протокол.
|                test-relay-irc.cpp | Тестови: Релеј „irc” протокол.
|          trigger/ | Корен unit тестова за окидач додатак.
@@ -1262,13 +1235,11 @@ server->hook_timer_sasl = weechat_hook_timer (timeout * 1000,
| tests/fuzz
| tests/fuzz/*
// TRANSLATION MISSING
| Fuzz testing
| Fuzz тестирање
| tests/unit
| tests/unit/*
// TRANSLATION MISSING
| Unit tests
| Unit тестови
| doc
| doc/*
+9 -11
View File
@@ -4484,12 +4484,11 @@ if (weechat_file_compress ("/tmp/test.txt", "/tmp/test.txt.zst", "zstd", 50))
[NOTE]
Ова функција није доступна у API скриптовања.
// TRANSLATION MISSING
==== file_compare
_WeeChat ≥ 4.7.0._
Compare the content of two files.
Пореди садржаје два фајла.
Прототип:
@@ -4500,14 +4499,14 @@ int weechat_file_compare (const char *filename1, const char *filename2);
Аргументи:
* _filename1_: first file to compare
* _filename2_: second file to compare
* _filename1_: први фајл за поређење
* _filename2_: други фајл за поређење
Повратна вредност:
* 0: both files have same content
* 1: content is different
* 2: error (file not found or read error)
* 0: оба фајла имају исти садржај
* 1: садржај се разликује
* 2: грешка (фајл није пронађен или грешка при читању)
C пример:
@@ -4515,7 +4514,7 @@ C пример:
----
if (weechat_file_compare ("/tmp/test.txt", "/tmp/test2.txt") == 0)
{
/* same content */
/* исти садржај */
}
----
@@ -4680,9 +4679,8 @@ int weechat_util_strftimeval (char *string, int max, const char *format, struct
* _string_: бафер у који се смешта форматирани стринг
* _max_: величина стринга
* _format_: формат, исто као за _strftime_ функцију, са следећим додатним спецификаторима:
// TRANSLATION MISSING
** `%@`: return the date expressed in Coordinated Universal Time (UTC)
instead of date relative to the user's specified timezone _(WeeChat ≥ 4.7.0)_
** `%@`: враћа датум изражен у Coordinated Universal Time (UTC) уместо као датум
релативан у односу на временску зону коју је задао корисник _(WeeChat ≥ 4.7.0)_
** `%.N` где је `N` између 1 и 6: микросекунде допуњене нулама на N цифара
(на пример `%.3` за милисекунде)
** `%f`: алијас за `%.6`
+2 -4
View File
@@ -1002,8 +1002,7 @@ WeeChat командна линија (на дну прозора) вам омо
kbd:[yyyyyy] | Текст у боји `xxxxxx` и позадина `yyyyyy` (RGB као хексадецимални број).
| kbd:[Ctrl+c], kbd:[i] | Текст у курзиву.
| kbd:[Ctrl+c], kbd:[o] | Искључивање боје и атрибута.
// TRANSLATION MISSING
| kbd:[Ctrl+c], kbd:[s] | Strikethrough text (displayed as half bright in ncurses interface because strikethrough is not supported).
| kbd:[Ctrl+c], kbd:[s] | Прецртани текст (у ncurses интерфејсу се приказује као полусветао јер се не подржава прецртавање).
| kbd:[Ctrl+c], kbd:[v] | Обрнути видео (боје текста и позадине се замењују једна са другом).
| kbd:[Ctrl+c], kbd:[_] | Подвучени текст.
|===
@@ -1549,8 +1548,7 @@ WeeChat нуди доста подразумеваних тастерских п
| kbd:[Ctrl+c], kbd:[d] | Уметање кода за обојени текст (RGB боја, као хексадецимални број). | `+/input insert \x04+`
| kbd:[Ctrl+c], kbd:[i] | Уметање кода за текст у курзиву. | `+/input insert \x1D+`
| kbd:[Ctrl+c], kbd:[o] | Уметање кода за ресет боје. | `+/input insert \x0F+`
// TRANSLATION MISSING
| kbd:[Ctrl+c], kbd:[s] | Insert code for strikethrough text. | `+/input insert \x1E+`
| kbd:[Ctrl+c], kbd:[s] | Уметање кода за прецртани текст. | `+/input insert \x1E+`
| kbd:[Ctrl+c], kbd:[v] | Уметање кода за обрнуту боју. | `+/input insert \x16+`
| kbd:[Ctrl+c], kbd:[_] | Уметање кода за подвучени текст. | `+/input insert \x1F+`
|===
+6 -4
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:24+0200\n"
"Last-Translator: Ondřej Súkup <mimi.vx@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5440,6 +5440,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "upozornit uživatele pokud nastane částečné doplnění"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6375,15 +6379,13 @@ msgstr "Myš je vypnuta"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', velikost: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr ""
#, fuzzy, c-format
#, fuzzy
msgid "fork error"
msgstr "chyba"
#, c-format
msgid "OK"
msgstr "OK"
+7 -7
View File
@@ -28,7 +28,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-05 09:24+0200\n"
"Last-Translator: Nils Görs <weechatter@arcor.de>\n"
"Language-Team: German <kde-i18n-de@kde.org>\n"
@@ -6199,6 +6199,10 @@ msgid "send alert (BEL) when a partial completion occurs"
msgstr ""
"erzeugt eine Mitteilung (BEL) wenn eine teilweise Vervollständigung auftritt"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -7228,15 +7232,12 @@ msgstr "Maus ist inaktiv"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', Größe: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr "WeeChat wird im Hintergrund ausgeführt..."
#, c-format
msgid "fork error"
msgstr "Fork-Fehler"
#, c-format
msgid "OK"
msgstr "OK"
@@ -7837,8 +7838,8 @@ msgstr ""
msgid " - ${number_zero2}: like ${number2} but the number is zero-padded"
msgstr ""
" - ${number_zero2}: wie ${number2}, aber die Zahl wird mit Nullen"
" aufgefüllt"
" - ${number_zero2}: wie ${number2}, aber die Zahl wird mit Nullen "
"aufgefüllt"
msgid ""
" - ${number_displayed}: \"1\" if the number is displayed, otherwise \"0\""
@@ -18963,4 +18964,3 @@ msgstr ""
"%s%s Datei \"%s\" zum Fortsetzen der Übertragung wird nicht akzeptiert "
"(Port: %d, Startposition: %llu): xfer nicht gefunden oder nicht bereit für "
"Transfer"
+6 -4
View File
@@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Santiago Forero <santiago@forero.xyz>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5577,6 +5577,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "alertar al usuario cuando ocurre un completado parcial"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6559,15 +6563,13 @@ msgstr "Ratón desactivado"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', tamaño: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr ""
#, fuzzy, c-format
#, fuzzy
msgid "fork error"
msgstr "error"
#, c-format
msgid "OK"
msgstr "OK"
+8 -5
View File
@@ -23,8 +23,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"PO-Revision-Date: 2025-05-04 09:24+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-06-30 09:34+0200\n"
"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"Language: fr\n"
@@ -6068,6 +6068,12 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "envoyer une alerte (BEL) lorsqu'une complétion partielle survient"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
"étendre automatiquement le mot après une complétion partielle lors d'une "
"nouvelle complétion"
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -7089,15 +7095,12 @@ msgstr "La souris est désactivée"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', taille : %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr "Lancement de WeeChat en tâche de fond..."
#, c-format
msgid "fork error"
msgstr "erreur de fork"
#, c-format
msgid "OK"
msgstr "OK"
+6 -4
View File
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5144,6 +5144,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr ""
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6037,15 +6041,13 @@ msgstr "Nincs aliasz definiálva.\n"
msgid " TERM='%s', size: %dx%d"
msgstr ""
#, c-format
msgid "Running WeeChat in background..."
msgstr ""
#, fuzzy, c-format
#, fuzzy
msgid "fork error"
msgstr "%sSzerver: %s%s\n"
#, c-format
msgid "OK"
msgstr "Rendben"
+6 -4
View File
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Esteban I. Ruiz Moreno <exio4.com@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5560,6 +5560,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "avvisa l'utente quando si verifica un completamento parziale"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6497,15 +6501,13 @@ msgstr "Mouse disabilitato"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', dimensione %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr ""
#, fuzzy, c-format
#, fuzzy
msgid "fork error"
msgstr "errore"
#, c-format
msgid "OK"
msgstr "OK"
+5 -4
View File
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: AYANOKOUZI, Ryuunosuke <i38w7i3@yahoo.co.jp>\n"
"Language-Team: Japanese <https://github.com/l/weechat/tree/master/"
@@ -5740,6 +5740,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "補完候補が複数あった場合に警告 (BEL) を送信"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6712,15 +6716,12 @@ msgstr "マウスを無効化しました"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s'、サイズ: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr "WeeChat をバックグラウンドで実行中..."
#, c-format
msgid "fork error"
msgstr "フォークエラー"
#, c-format
msgid "OK"
msgstr "成功"
+5 -4
View File
@@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Krzysztof Korościk <soltys@soltys.info>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -6037,6 +6037,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "wyślij alarm (BEL), kiedy nastąpi częściowe dopełnienie"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -7080,15 +7084,12 @@ msgstr "Obsługa myszy wyłączona"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', rozmiar: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr "Uruchamianie WeeChat w tle..."
#, c-format
msgid "fork error"
msgstr "nie udało się utworzyć procesu"
#, c-format
msgid "OK"
msgstr "OK"
+6 -4
View File
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
"Language-Team: Portuguese <>\n"
@@ -5778,6 +5778,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "alertar o utilizador ao completar parcialmente"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6754,15 +6758,13 @@ msgstr "O rato está desativado"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', tamanho: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr ""
#, fuzzy, c-format
#, fuzzy
msgid "fork error"
msgstr "erro"
#, c-format
msgid "OK"
msgstr "OK"
+6 -4
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Érico Nogueira <ericonr@disroot.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5481,6 +5481,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "alertar usuário quando uma completação parcial ocorre"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6404,15 +6408,13 @@ msgstr "Mouse está desabilitado"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', tamanho: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr ""
#, fuzzy, c-format
#, fuzzy
msgid "fork error"
msgstr "%s%s: erro: %s"
#, c-format
msgid "OK"
msgstr "OK"
+6 -4
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Aleksey V Zapparov AKA ixti <ixti@member.fsf.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5178,6 +5178,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr ""
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6075,15 +6079,13 @@ msgstr "Сокращения не заданы.\n"
msgid " TERM='%s', size: %dx%d"
msgstr ""
#, c-format
msgid "Running WeeChat in background..."
msgstr ""
#, fuzzy, c-format
#, fuzzy
msgid "fork error"
msgstr "%sСервер: %s%s\n"
#, c-format
msgid "OK"
msgstr "OK"
+9 -7
View File
@@ -22,8 +22,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-07-09 15:48+0400\n"
"Last-Translator: Ivan Pešić <ivan.pesic@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"Language: sr\n"
@@ -5861,6 +5861,11 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "шаље упозорење (BEL) када се догоди делимично довршавање"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
"када се поново довршава, аутоматски развија реч након делимичног довршавања"
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6865,15 +6870,12 @@ msgstr "Миш је искључен"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM=%s, величина: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr "WeeChat се извршава у позадини..."
#, c-format
msgid "fork error"
msgstr "грешка при рачвању"
#, c-format
msgid "OK"
msgstr "ОК"
@@ -7438,10 +7440,10 @@ msgstr ""
"бафера"
msgid " - ${number_zero}: like ${number} but the number is zero-padded"
msgstr ""
msgstr " - ${number_zero}: као ${number} али се број допуњава нулама"
msgid " - ${number_zero2}: like ${number2} but the number is zero-padded"
msgstr ""
msgstr " - ${number_zero2}: као ${number2} али се број допуњава нулама"
msgid ""
" - ${number_displayed}: \"1\" if the number is displayed, otherwise \"0\""
+176 -269
View File
@@ -1,6 +1,6 @@
#
# SPDX-FileCopyrightText: 2013 Hasan Kiran <sunder67@hotmail.com>
# SPDX-FileCopyrightText: 2020-2024 Emir SARI <emir_sari@icloud.com>
# SPDX-FileCopyrightText: 2020-2025 Emir SARI <emir_sari@icloud.com>
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
@@ -23,8 +23,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-07-06 09:25+0200\n"
"Last-Translator: Emir SARI <emir_sari@icloud.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"Language: tr\n"
@@ -246,7 +246,7 @@ msgstr "%sDeğerlendirilecek ifadede hata"
#, c-format
msgid " %s%s%s: buffer: %s%s%s / tags: %s / regex: %s"
msgstr " %s%s%s arabellek: %s%s%s / etiketler: %s / düzenli ifade: %s"
msgstr " %s%s%s arabellek: %s%s%s / künyeler: %s / düzenli ifade: %s"
msgid "Message filtering enabled"
msgstr "İleti süzme etkin"
@@ -270,7 +270,7 @@ msgstr "\"%s\" süzgeci devre dışı"
#, c-format
msgid "%sYou must specify at least tags or regex for filter"
msgstr "%sSüzgeç için en azından etiketler veya düzenli ifade belirtmelisiniz"
msgstr "%sSüzgeç için en azından künyeler veya düzenli ifade belirtmelisiniz"
#, c-format
msgid "Filter \"%s\" updated:"
@@ -354,7 +354,7 @@ msgid "color"
msgstr "renk"
msgid "enum"
msgstr "enümerasyon"
msgstr "numaralandırma"
#. TRANSLATORS: please do not translate "(null)"
msgid "undefined value allowed (null)"
@@ -534,10 +534,9 @@ msgstr "Fare etkin"
msgid "Mouse disabled"
msgstr "Fare devre dışı"
#, fuzzy, c-format
#| msgid "%sInvalid number: \"%s\""
#, c-format
msgid "%sInvalid color: \"%s\""
msgstr "%sGeçersiz numara: \"%s\""
msgstr "%sGeçersiz renk: \"%s\""
#, c-format
msgid "%sUnable to open file \"%s\""
@@ -1019,10 +1018,6 @@ msgid "> raw[window]: inside windows, with optional conditions (see below)"
msgstr ""
"> raw[window]: pencereler içeride, isteğe bağlı koşullarla (aşağıya bakın)"
#, fuzzy
#| msgid ""
#| "conditions: the conditions to display the bar (without conditions, the "
#| "bar is always displayed:"
msgid ""
"conditions: the conditions to display the bar (without conditions, the bar "
"is always displayed):"
@@ -1465,59 +1460,53 @@ msgid "debug functions"
msgstr "hata ayıklama işlevleri"
#. TRANSLATORS: only text between angle brackets (eg: "<name>") may be translated
#, fuzzy
#| msgid ""
#| "list || set <plugin> <level> || dump [<plugin>] || hooks [<plugin_mask> "
#| "[<hook_type>...]] || buffer|certs|color|dirs|infolists|key|libs|memory|"
#| "tags|term|url|windows || callbacks <duration>[<unit>] || mouse|cursor "
#| "[verbose] || hdata [free] || time <command> || unicode <string>"
msgid ""
"list || set <plugin> <level> || dump [<plugin>] || hooks [<plugin_mask> "
"[<hook_type>...]] || buffer|certs|color|dirs|infolists|key|libs|memory|tags|"
"term|url|windows || callbacks <duration>[<unit>] || mouse|cursor [verbose] "
"|| hdata [free] || time <command> || unicode <string> || whitespace"
msgstr ""
"list || set <eklenti> <düzey> || dump [<eklenti>] || hooks "
"[<eklenti_maskesi> [<kanca_türü>...]] || buffer|certs|color|dirs|infolists|"
"key|libs|memory|tags|term|url|windows || callbacks <süre>[<birim>] || mouse|"
"cursor [verbose] || hdata [free] || time <komut> || unicode <dizi>"
"list || set <eklenti> <düzey> || dump [<eklenti>] || hooks [<eklenti_maskesi> "
"[<kanca_türü>...]] || buffer|certs|color|dirs|infolists|key|libs|memory|tags|"
"term|url|windows || callbacks <süre>[<birim>] || mouse|cursor [verbose] "
"|| hdata [free] || time <komut> || unicode <dizi> || whitespace"
msgid "raw[list]: list plugins with debug levels"
msgstr "raw[list]: eklentileri hata ayıklama düzeyleriyle listele"
msgstr "raw[list]: Eklentileri hata ayıklama düzeyleriyle listele"
msgid "raw[set]: set debug level for plugin"
msgstr "raw[set]: eklenti için olan hata ayıklama düzeyini listele"
msgstr "raw[set]: Eklenti için olan hata ayıklama düzeyini listele"
msgid "plugin: name of plugin (\"core\" for WeeChat core)"
msgstr "eklenti: eklentinin adı (çekirdek WeeChat için \"core\")"
msgstr "eklenti: Eklentinin adı (çekirdek WeeChat için \"core\")"
msgid "level: debug level for plugin (0 = disable debug)"
msgstr "düzey: eklenti için hata ayıklama düzeyi (0 = hata ayıklamayı kapat)"
msgstr "düzey: Eklenti için hata ayıklama düzeyi (0 = hata ayıklamayı kapat)"
msgid ""
"raw[dump]: save memory dump in WeeChat log file (same dump is written when "
"WeeChat crashes)"
msgstr ""
"raw[dump]: bellek dökümünü WeeChat günlük dosyasına kaydet (aynı döküm "
"raw[dump]: Bellek dökümünü WeeChat günlük dosyasına kaydet (aynı döküm "
"WeeChat çöktüğünde de yazılır)"
msgid ""
"raw[hooks]: display infos about hooks (with a plugin: display detailed info "
"about hooks created by the plugin)"
msgstr ""
"raw[hooks]: kancalar üzerine bilgi görüntüle (eklentiyle: eklenti tarafından "
"raw[hooks]: Kancalar üzerine bilgi görüntüle (eklentiyle: eklenti tarafından "
"oluşturulan kancalar hakkında ayrıntılı bilgi görüntüle)"
msgid "plugin_mask: plugin mask, \"*\" for all plugins"
msgstr "eklenti_maskesi: eklenti maskesi, tüm eklentiler için \"*\""
msgstr "eklenti_maskesi: Eklenti maskesi, tüm eklentiler için \"*\""
msgid "hook_type: hook type"
msgstr "kanca_türü: kanca türü"
msgstr "kanca_türü: Kanca türü"
msgid ""
"raw[buffer]: dump buffer content with hexadecimal values in WeeChat log file"
msgstr ""
"raw[buffer]: arabellek içeriğini onaltılık değerlerle WeeChat günlük "
"raw[buffer]: Arabellek içeriğini onaltılık değerlerle WeeChat günlük "
"dosyasına dök"
msgid ""
@@ -1525,89 +1514,96 @@ msgid ""
"\"duration\" in the WeeChat log file (0 = disable), where optional unit is "
"one of:"
msgstr ""
"raw[callbacks]: \"süre\"den daha fazla süren kanca ve çubuk ögesi geri "
"raw[callbacks]: \"Süre\"den daha fazla süren kanca ve çubuk ögesi geri "
"çağrılarını WeeChat günlük dosyasına yaz (0 = devre dışı bırak); isteğe "
"bağlı birim şunlardan biridir:"
msgid "> raw[us]: microseconds (default)"
msgstr "> raw[us]: mikrosaniye (öntanımlı)"
msgstr "> raw[us]: Mikrosaniye (öntanımlı)"
msgid "> raw[ms]: milliseconds"
msgstr "> raw[ms] milisaniye"
msgstr "> raw[ms] Milisaniye"
msgid "> raw[s]: seconds"
msgstr "> raw[s]: saniye"
msgstr "> raw[s]: Saniye"
msgid "> raw[m]: minutes"
msgstr "> raw[m]: dakika"
msgstr "> raw[m]: Dakika"
msgid "> raw[h]: hours"
msgstr "> raw[h]: saat"
msgstr "> raw[h]: Saat"
msgid "raw[certs]: display number of loaded trusted certificate authorities"
msgstr ""
"raw[certs]: yüklü güvenilen sertifika otoritelerinin sayısını görüntüle"
"raw[certs]: Yüklü güvenilen sertifika otoritelerinin sayısını görüntüle"
msgid "raw[color]: display infos about current color pairs"
msgstr "raw[color]: geçerli renk çiftleri üzerine bilgi görüntüle"
msgstr "raw[color]: Geçerli renk çiftleri üzerine bilgi görüntüle"
msgid "raw[cursor]: toggle debug for cursor mode"
msgstr "raw[cursor]: imleç kipi için hata ayıklama kipini aç/kapat"
msgstr "raw[cursor]: İmleç kipi için hata ayıklama kipini aç/kapat"
msgid "raw[dirs]: display directories"
msgstr "raw[dirs]: dizinleri görüntüle"
msgstr "raw[dirs]: Dizinleri görüntüle"
msgid ""
"raw[hdata]: display infos about hdata (with free: remove all hdata in memory)"
msgstr "raw[hdata]: hdata üzerine bilgi görüntüle"
msgid "raw[infolists]: display infos about infolists"
msgstr "raw[infolists]: bilgi listeleri hakkında bilgi görüntüle"
msgstr "raw[infolists]: Bilgi listeleri hakkında bilgi görüntüle"
msgid ""
"raw[key]: enable keyboard and mouse debug: display raw codes, expanded key "
"name and associated command (\"q\" to quit this mode)"
msgstr ""
"raw[key]: Klavye ve fare hata ayıklamasını etkinleştir: Ham kodları, "
"genişletilmiş düğme adını ve ilişkin komutu görüntüle (bu kipten çıkmak için "
"\"q\" düğmesine basın)"
msgid "raw[libs]: display infos about external libraries used"
msgstr ""
msgstr "raw[libs]: Kullanılan dış kitaplıklar hakkında bilgi görüntüle"
msgid "raw[memory]: display infos about memory usage"
msgstr ""
msgstr "raw[memory]: Bellek kullanımı hakkında bilgi görüntüle"
msgid "raw[mouse]: toggle debug for mouse"
msgstr ""
msgstr "raw[mouse]: Fare için hata ayıklamayı etkinleştir"
msgid "raw[tags]: display tags for lines"
msgstr ""
msgstr "raw[tags]: Satırlar için künyeleri görüntüle"
msgid "raw[term]: display infos about terminal"
msgstr ""
msgstr "raw[term]: Uçbirim hakkında bilgi görüntüle"
msgid "raw[url]: toggle debug for calls to hook_url (display output hashtable)"
msgstr ""
msgstr "raw[url]: hook_url'sine olan çağrılar için hata ayıklamayı aç/kapat "
"(çıktı sağlama tablosunu görüntüle)"
msgid "raw[windows]: display windows tree"
msgstr ""
msgstr "raw[windows]: Pencere ağacını görüntüle"
msgid ""
"raw[time]: measure time to execute a command or to send text to the current "
"buffer"
msgstr ""
msgstr "raw[time]: Geçerli arabelleğe metin göndermek veya üzerinde komut "
"yürütmek için gereken zamanı ölç"
#, fuzzy
#| msgid "condition(s) to display the bar item (evaluated, see /help eval)"
msgid ""
"raw[unicode]: display information about string and unicode chars (evaluated, "
"see /help eval)"
msgstr ""
"çubuk ögesini görüntülemek için koşul(lar) (değerlendirilir, bkz. /help eval)"
"raw[unicode]: Dizi ve unicode karakterler hakkında bilgi görüntüle "
"(değerlendirilir, bkz. /help eval)"
msgid ""
"raw[whitespace]: toggle whitespace mode: make spaces and tabulations visible "
"in buffers and bars (see options weechat.look.whitespace_char and "
"weechat.look.tab_whitespace_char)"
msgstr ""
"raw[whitespace]: Boşluk kipini aç/kapat: Arabelleklerde ve çubuklarda "
"boşlukları ve sekmelendirmeleri görünür yap (weechat.look.whitespace_char ve "
"weechat.look.tab_whitespace_char seçeneklerine bakın)"
msgid "evaluate expression"
msgstr "ifadeyi değerlendir"
@@ -1619,47 +1615,43 @@ msgid ""
msgstr "[-n|-s] [-d] <ifade> || [-n] [-d] -c <ifade1> <işleç> <ifade2>"
msgid "raw[-n]: display result without sending it to buffer (debug mode)"
msgstr ""
msgstr "raw[-n]: Arabelleğe göndermeden sonucu görüntüle (hata ayıklama kipi)"
#, fuzzy
#| msgid ""
#| "command(s) to run if conditions are OK, after regex replacements (many "
#| "commands can be separated by semicolons)"
msgid ""
"raw[-s]: split expression before evaluating it (many commands can be "
"separated by semicolons)"
msgstr ""
"düzenli ifade değiştirmelerinden sonra koşullar sağlanırsa çalıştırılacak "
"komutlar (birden çok komut noktalı virgül ile ayrılabilir)"
"raw[-s]: İfadeyi değerlendirmeden önce böl (birden çok komut noktalı virgülle "
"ayrılabilir)"
msgid ""
"raw[-d]: display debug output after evaluation (with two -d: more verbose "
"debug)"
msgstr ""
"raw[-d]: Değerlendirme sonrası hata ayıklama çıktısını görüntüle (iki -d ile: "
"Daha ayrıntılı hata ayıklama bilgisi)"
msgid ""
"raw[-c]: evaluate as condition: use operators and parentheses, return a "
"boolean value (\"0\" or \"1\")"
msgstr ""
"raw[-c]: Koşul olarak değerlendir: İşleçler ve parantezler kullan, bir Boole "
"değeri döndür (\"0\" veya \"1\")"
msgid ""
"expression: expression to evaluate, variables with format ${variable} are "
"replaced (see below)"
msgstr ""
msgstr "ifade: Değerlendirilecek ifade, ${variable} biçimindeki değişkenler "
"değerlendirilir (aşağıya bakın)"
#, fuzzy
#| msgid ""
#| "path to a socket file (path is evaluated, see function "
#| "string_eval_path_home in plugin API reference)"
msgid "operator: a logical or comparison operator (see below)"
msgstr ""
"soket dosyasına giden yol (yol değerlendirilir, eklenti API başvurusunda "
"string_eval_path_home işlevine bakın)"
msgstr "işleç: bir mantıksal veya karşılaştırma işleci (aşağıya bakın)"
msgid ""
"An expression is considered as \"true\" if it is not NULL, not empty, and "
"different from \"0\"."
msgstr ""
msgstr "Bir ifade; NULL veya boş değilse ve \"0\"dan farklıysa \"true\" olarak "
"değerlendirilir."
msgid ""
"The comparison is made using floating point numbers if the two expressions "
@@ -1692,41 +1684,29 @@ msgstr ""
msgid " - ${name}: the user-defined variable"
msgstr ""
#, fuzzy
#| msgid "WeeChat config directory"
msgid " - ${weechat_config_dir}: WeeChat config directory"
msgstr "WeeChat yapılandırma dizini"
msgstr " - ${weechat_config_dir}: WeeChat yapılandırma dizini"
#, fuzzy
#| msgid "WeeChat data directory"
msgid " - ${weechat_data_dir}: WeeChat data directory"
msgstr "WeeChat veri dizini"
msgstr " - ${weechat_data_dir}: WeeChat veri dizini"
#, fuzzy
#| msgid "WeeChat data directory"
msgid " - ${weechat_state_dir}: WeeChat state directory"
msgstr "WeeChat veri dizini"
msgstr " - ${weechat_state_dir}: WeeChat durum dizini"
#, fuzzy
#| msgid "WeeChat cache directory"
msgid " - ${weechat_cache_dir}: WeeChat cache directory"
msgstr "WeeChat önbellek dizini"
msgstr " - ${weechat_cache_dir}: WeeChat önbellek dizini"
#, fuzzy
#| msgid "WeeChat runtime directory"
msgid " - ${weechat_runtime_dir}: WeeChat runtime directory"
msgstr "WeeChat çalışma zamanı dizini"
msgstr " - ${weechat_runtime_dir}: WeeChat çalışma zamanı dizini"
msgid " - ${eval:string}: the evaluated string"
msgstr ""
msgstr " - ${eval:string}: Değerlendirilen dizi"
#, fuzzy
#| msgid "toggle value of a config option"
msgid " - ${eval_cond:string}: the evaluated condition"
msgstr "bir yapılandırma seçeneğinin değerini aç/kapat"
msgstr " - ${eval_cond:string}: Değerlendirilen koşul"
msgid " - ${esc:string} or ${\\string}: the string with escaped chars"
msgstr ""
msgstr " - ${esc:string} veya ${\\string}: Kaçırılan karakterli dizi"
msgid ""
" - ${chars:range}: the string with a range of chars, \"range\" is one of: "
@@ -1833,10 +1813,8 @@ msgstr ""
msgid " - ${date} or ${date:format}: current date/time"
msgstr ""
#, fuzzy
#| msgid "value of an environment variable"
msgid " - ${env:NAME}: the environment variable"
msgstr "bir çevre değişkeninin değeri"
msgstr " - ${env:NAME}: Çevre değişkeni"
msgid ""
" - ${if:condition?value_if_true:value_if_false}: the result of ternary "
@@ -1871,15 +1849,11 @@ msgstr ""
msgid " - ${sec.data.xxx}: the value of the secured data \"xxx\""
msgstr ""
#, fuzzy
#| msgid "toggle value of a config option"
msgid " - ${file.section.option}: the value of the config option"
msgstr "bir yapılandırma seçeneğinin değerini aç/kapat"
msgstr " - ${file.section.option}: Yapılandırma seçeneğinin değeri"
#, fuzzy
#| msgid "No local variable defined for buffer \"%s\""
msgid " - ${name}: the local variable in buffer"
msgstr "\"%s\" arabelleği için bir yerel değişken tanımlanmamış"
msgstr " - ${name}: Arabellekteki yerel değişken"
msgid ""
" - the hdata name/variable (the value is automatically converted to "
@@ -1945,109 +1919,95 @@ msgid " || boolean \"or\""
msgstr ""
msgid "Comparison operators (by order of priority):"
msgstr ""
msgstr "Karşılaştırma işleçleri (öncelik sırasına göre):"
msgid " =~ is matching POSIX extended regex"
msgstr ""
msgstr " =~ eşleşen POSIX genişletilmiş düzenli ifadesi"
msgid " !~ is NOT matching POSIX extended regex"
msgstr ""
msgstr " !~ eşleşen POSIX genişletilmiş düzenli ifadesi DEĞİL"
#, fuzzy
#| msgid "alias name (wildcard \"*\" is allowed) (optional)"
msgid " ==* is matching mask, case-sensitive (wildcard \"*\" is allowed)"
msgstr "arma adı (\"*\" jokerine izin verilir (isteğe bağlı)"
msgstr " ==* eşleşen maske, BÜYÜK/küçük harf duyarlı (\"*\" jokerine izin "
"verilir)"
#, fuzzy
#| msgid "alias name (wildcard \"*\" is allowed) (optional)"
msgid " !!* is NOT matching mask, case-sensitive (wildcard \"*\" is allowed)"
msgstr "arma adı (\"*\" jokerine izin verilir (isteğe bağlı)"
msgstr " !!* eşleşen maske DEĞİL, BÜYÜK/küçük harf duyarlı (\"*\" jokerine "
"izin verilir)"
#, fuzzy
#| msgid "alias name (wildcard \"*\" is allowed) (optional)"
msgid " =* is matching mask, case-insensitive (wildcard \"*\" is allowed)"
msgstr "arma adı (\"*\" jokerine izin verilir (isteğe bağlı)"
msgstr " =* eşleşen maske, BÜYÜK/küçük harf duyarsız (\"*\" jokerine izin "
"verilir)"
#, fuzzy
#| msgid "alias name (wildcard \"*\" is allowed) (optional)"
msgid ""
" !* is NOT matching mask, case-insensitive (wildcard \"*\" is allowed)"
msgstr "arma adı (\"*\" jokerine izin verilir (isteğe bağlı)"
msgstr ""
" !* eşleşen maske DEGİL, BÜYÜK/küçük harf duyarsız (\"*\" jokerine izin "
"verilir)"
msgid " ==- is included, case-sensitive"
msgstr ""
msgstr " ==- içerilir, BÜYÜK/küçük harf duyarlı"
msgid " !!- is NOT included, case-sensitive"
msgstr ""
msgstr " !!- içerilmez, BÜYÜK/küçük harf duyarlı"
msgid " =- is included, case-insensitive"
msgstr ""
msgstr " =- içerilir, BÜYÜK/küçük harf duyarsız"
msgid " !- is NOT included, case-insensitive"
msgstr ""
msgstr " !- içerilmez, BÜYÜK/küçük harf duyarsız"
msgid " == equal"
msgstr ""
msgstr " == eşit"
msgid " != not equal"
msgstr ""
msgstr " != eşit değil"
msgid " <= less or equal"
msgstr ""
msgstr " <= küçüktür veya eşit"
#, fuzzy
#| msgid " file: %s"
msgid " < less"
msgstr " dosya: %s"
msgstr " < küçüktür"
msgid " >= greater or equal"
msgstr ""
msgstr " >= büyüktür veya eşit"
msgid " > greater"
msgstr ""
msgstr " > büyüktür"
msgid "Examples (simple strings):"
msgstr ""
msgstr "Örnekler (basit diziler):"
msgid "Examples (conditions):"
msgstr ""
msgstr "Örnekler (koşullar):"
msgid ""
"filter messages in buffers, to hide/show them according to tags or regex"
msgstr ""
"arabelleklerdeki iletileri etiketlere veya düzenli ifadelere göre gizlemek/"
"arabelleklerdeki iletileri künyelere veya düzenli ifadelere göre gizlemek/"
"göstermek için süz"
#. TRANSLATORS: only text between angle brackets (eg: "<name>") may be translated
#, fuzzy
#| msgid ""
#| "list || enable|disable|toggle [<name>|@] || add|addreplace <name> "
#| "<buffer>[,<buffer>...] <tags> <regex> || rename <name> <new_name> || "
#| "recreate <name> || del <name>|-all [<name>...]"
msgid ""
"list || enable|disable|toggle [<name>|<mask>|@...] || add|addreplace <name> "
"<buffer>[,<buffer>...] <tags> <regex> || rename <name> <new_name> || "
"recreate <name> || del <name>|<mask>..."
msgstr ""
"list || enable|disable|toggle [<ad>|@] || add|addreplace <ad> <arabellek>[,"
"<arabellek>...] <etiketler> <düzenli_ifade> || rename <ad> <yeni_ad> || "
"recreate <ad> || del <ad>|-all [<ad>...]"
"list || enable|disable|toggle [<ad>|<maske>|@...] || add|addreplace <ad> "
"<arabellek>[,<arabellek>...] <künyeler> <düzenli_ifade> || rename <ad> "
"<yeni_ad> || recreate <ad> || del <ad>|<maske>..."
#, fuzzy
#| msgid "list of filters"
msgid "raw[list]: list all filters"
msgstr "süzgeçlerin listesi"
msgstr "raw[list]: Tüm süzgeçleri listele"
msgid "raw[enable]: enable filters (filters are enabled by default)"
msgstr ""
msgstr "raw[enable]: Süzgeçleri etkinleştir (süzgeçler öntanımlı olarak etkin)"
#, fuzzy
#| msgid "names of filters"
msgid "raw[disable]: disable filters"
msgstr "süzgeçlerin adları"
msgstr "raw[disable]: Süzgeçleri devre dışı bırak"
msgid "raw[toggle]: toggle filters"
msgstr ""
msgstr "raw[toggle]: Süzgeçleri aç/kapat"
msgid ""
"mask: name where wildcard \"*\" is allowed (\"@\" = enable/disable all "
@@ -2060,15 +2020,11 @@ msgstr ""
msgid "raw[addreplace]: add or replace an existing filter"
msgstr ""
#, fuzzy
#| msgid "names of filters"
msgid "name: filter name"
msgstr "süzgeçlerin adları"
msgstr "ad: Süzgeç adı"
#, fuzzy
#| msgid "names of filters"
msgid "raw[rename]: rename a filter"
msgstr "süzgeçlerin adları"
msgstr "raw[rename]: Bir süzgeci yeniden adlandır"
msgid "raw[recreate]: set input with the command used to edit the filter"
msgstr ""
@@ -2084,18 +2040,14 @@ msgid ""
"\"irc.server.libera\")"
msgstr ""
#, fuzzy
#| msgid "manage buffers"
msgid "> - \"*\" means all buffers"
msgstr "arabellekleri yönet"
msgstr "> - \"*\" tüm arabellekler anlamına gelir"
msgid "> - a name starting with \"!\" is excluded"
msgstr ""
msgstr "> - \"!\" ile başlayan bir ad dışlanır"
#, fuzzy
#| msgid "bar name (wildcard \"*\" is allowed) (optional)"
msgid "> - wildcard \"*\" is allowed"
msgstr "çubuk adı (\"*\" jokerine izin verilir (isteğe bağlı)"
msgstr "> - \"*\" jokerine izin verilir"
msgid ""
"tags: comma separated list of tags (for example "
@@ -2111,12 +2063,8 @@ msgid ""
"> - if tag starts with \"!\", then it is excluded and must NOT be in message"
msgstr ""
#, fuzzy
#| msgid "POSIX extended regular expression to search ANSI escape codes"
msgid "regex: POSIX extended regular expression to search in line:"
msgstr ""
"ANSI kaçış kodlarını aramak için kullanılan POSIX genişletilmiş düzenli "
"ifadeleri"
msgstr "düzenli_ifade: Satırda aranacak POSIX genişletilmiş düzenli ifadesi:"
msgid ""
"> - use \"\\t\" to separate prefix from message, special chars like \"|\" "
@@ -2154,19 +2102,15 @@ msgstr ""
msgid "To see tags for lines in buffers: /debug tags"
msgstr ""
#, fuzzy
#| msgid "execute a command on all buffers"
msgid " use IRC smart filter on all buffers:"
msgstr "tüm arabelleklerde bir komut yürüt"
msgstr " tüm arabelleklerde IRC akıllı arabelleğini kullan:"
msgid ""
" use IRC smart filter on all buffers except those with \"#weechat\" in name:"
msgstr ""
#, fuzzy
#| msgid "display host in part/quit messages"
msgid " filter all IRC join/part/quit messages:"
msgstr "ayrılma/çıkma iletilerinde makineyi görüntüle"
msgstr " tüm IRC katıl/ayrıl/çık iletilerini süz:"
msgid " filter nicks displayed when joining channels or with /names:"
msgstr ""
@@ -2188,10 +2132,8 @@ msgid "display help about commands and options"
msgstr "komutlar ve seçenekler hakkında yardım göster"
#. TRANSLATORS: only text between angle brackets (eg: "<name>") may be translated
#, fuzzy
#| msgid "-list|-listfull [<plugin> [<plugin>...]] || <command> || <option>"
msgid "-list|-listfull [<plugin>...]] || <command> || <option>"
msgstr "-list|-listfull [<eklenti> [<eklenti>...]] || <komut> || <seçenek>"
msgstr "-list|-listfull [<eklenti>...]] || <komut> || <seçenek>"
msgid ""
"raw[-list]: list commands, by plugin (without argument, this list is "
@@ -2202,17 +2144,13 @@ msgid "raw[-listfull]: list commands with description, by plugin"
msgstr ""
msgid "plugin: list commands for this plugin"
msgstr ""
msgstr "eklenti: Bu eklenti için olan komutları listele"
#, fuzzy
#| msgid "functions for command line"
msgid "command: a command name"
msgstr "komut satırı için fonksiyonlar"
msgstr "komut: Bir komut adı"
#, fuzzy
#| msgid "option: extra option, for some servers"
msgid "option: an option name (use /set to see list)"
msgstr "seçenek: bazı sunucular için ek seçenek"
msgstr "seçenek: Bir seçenek adı (listeyi görmek için /set kullanın)"
msgid "show buffer command history"
msgstr "arabellek komut geçmişini göster"
@@ -2222,16 +2160,10 @@ msgid "clear || <value>"
msgstr "clear || <değer>"
msgid "raw[clear]: clear history"
msgstr ""
msgstr "raw[clear]: Geçmişi temizle"
#, fuzzy
#| msgid ""
#| "clear: clear history\n"
#| "value: number of history entries to show"
msgid "value: number of history entries to show"
msgstr ""
"clear: geçmişi temizle\n"
"değer: gösterilecek geçmiş girdileri sayısı"
msgstr "değer: Gösterilecek geçmiş girdileri sayısı"
msgid "manage hotlist"
msgstr "sıcak listeyi yönet"
@@ -2291,18 +2223,14 @@ msgstr ""
msgid "> raw[search_text_here]: search text in buffer at current position"
msgstr ""
#, fuzzy
#| msgid "check words during text search in buffer"
msgid "> raw[search_text]: search text in buffer"
msgstr "arabellekte metin arama sırasında sözcükleri denetle"
msgstr "> raw[search_text]: Arabellekte metin ara"
#, fuzzy
#| msgid "check words during text search in buffer"
msgid "> raw[search_history]: search text in command line history"
msgstr "arabellekte metin arama sırasında sözcükleri denetle"
msgstr "> raw[search_history]: Komut satırı geçmişinde metin ara"
msgid "> raw[search_switch_case]: switch exact case for search"
msgstr ""
msgstr "> raw[search_switch_case]: Arama için tam biçimi değiştir"
msgid ""
"> raw[search_switch_regex]: switch search type: string/regular expression"
@@ -2456,51 +2384,38 @@ msgid "manage custom bar items"
msgstr "özel çubuk ögelerini yönet"
#. TRANSLATORS: only text between angle brackets (eg: "<name>") may be translated
#, fuzzy
#| msgid ""
#| "list || add|addreplace <name> \"<conditions>\" \"<content>\" || rename "
#| "<name> <new_name> || refresh <name> [<name>...] || recreate <name> || del "
#| "<name>|-all"
msgid ""
"list || add|addreplace <name> \"<conditions>\" \"<content>\" || rename "
"<name> <new_name> || refresh <name>|<mask>... || recreate <name> || del "
"<name>|<mask>..."
msgstr ""
"list || add|addreplace <ad> \"<koşullar>\" \"<içerik>\" || rename <ad> "
"<yeni_ad> || refresh <ad> [<ad>...] || recreate <ad> || del <ad>|-all"
"list || add|addreplace <ad> \"<koşullar>\" \"<içerik>\" || rename "
"<ad> <yeni_ad> || refresh <ad>|<maske>... || recreate <ad> || del "
"<ad>|<maske>..."
#, fuzzy
#| msgid "names of custom bar items"
msgid "raw[list]: list all custom bar items"
msgstr "özel çubuk ögelerinin adları"
msgstr "raw[list]: Tüm özel çubuk ögelerini listele"
#, fuzzy
#| msgid "manage custom bar items"
msgid "raw[add]: add a custom bar item"
msgstr "özel çubuk ögelerini yönet"
msgstr "raw[add]: Bir özel çubuk ögesi ekle"
msgid "raw[addreplace]: add or replace an existing custom bar item"
msgstr ""
msgstr "raw[addreplace]: Var olan bir özel çubuk ögesi ekle veya değiştir"
#, fuzzy
#| msgid "names of custom bar items"
msgid "name: custom bar item name"
msgstr "özel çubuk ögelerinin adları"
msgstr "ad: Özel çubuk ögesi adı"
msgid ""
"conditions: evaluated conditions to display the bar item (for example to "
"display the bar item only in specific buffers)"
msgstr ""
msgstr "koşullar: Çubuk ögesini görüntülemek için değerlendirilmiş koşullar "
"(örneğin, çubuk ögesini yalnızca belirli arabelleklerde görüntülemek için)"
#, fuzzy
#| msgid "content of bar item (evaluated, see /help eval)"
msgid "content: content (evaluated, see /help eval)"
msgstr "çubuk ögesinin içeriği (değerlendirilir, bkz. /help eval)"
msgstr "içerik: İçerik (değerlendirilir, bkz. /help eval)"
#, fuzzy
#| msgid "names of custom bar items"
msgid "raw[rename]: rename a custom bar item"
msgstr "özel çubuk ögelerinin adları"
msgstr "raw[rename]: Bir özel çubuk ögesini yeniden adlandır"
msgid ""
"raw[refresh]: update content of item in all bars where the item is "
@@ -2511,19 +2426,15 @@ msgid ""
"raw[recreate]: set input with the command used to edit the custom bar item"
msgstr ""
#, fuzzy
#| msgid "names of custom bar items"
msgid "raw[del]: delete custom bar items"
msgstr "özel çubuk ögelerinin adları"
msgstr "raw[del]: Özel çubuk ögesini sil"
msgid ""
" add item with terminal size, displayed only in buffers with number = 1:"
msgstr ""
#, fuzzy
#| msgid "bar item with list of buffers"
msgid " add item with buffer info:"
msgstr "arabellek listesini içeren çubuk ögesi"
msgstr " arabellek bilgisiyle öge ekle:"
msgid ""
" add item with date/time using format \"Dec 25, 12:34 +0100\", refreshed "
@@ -2548,22 +2459,17 @@ msgid "bind/unbind keys"
msgstr "düğmeleri bağıntıla/bağı çöz"
#. TRANSLATORS: only text between angle brackets (eg: "<name>") may be translated
#, fuzzy
#| msgid ""
#| "list|listdefault|listdiff [<context>] || bind <key> [<command> [<args>]] "
#| "|| bindctxt <context> <key> [<command> [<args>]] || unbind <key> || "
#| "unbindctxt <context> <key> || reset <key> || resetctxt <context> <key> || "
#| "resetall -yes [<context>] || missing [<context>]"
msgid ""
"[list|listdefault|listdiff] [<context>] || bind <key> [<command> [<args>]] "
"|| bindctxt <context> <key> [<command> [<args>]] || unbind <key> || "
"unbindctxt <context> <key> || reset <key> || resetctxt <context> <key> || "
"resetall -yes [<context>] || missing [<context>] || legacy <key>..."
msgstr ""
"list|listdefault|listdiff [<bağlam>] || bind <düğme> [<komut> "
"[<argümanlar>]] || bindctxt <bağlam> <düğme> [<komut> [<argümanlar>]] || "
"unbind <düğme> || unbindctxt <bağlam> <düğme> || reset <düğme> || resetctxt "
"<bağlam> <düğme> || resetall -yes [<bağlam>] || missing [<bağlam>]"
"[list|listdefault|listdiff] [<içerik>] || bind <düğme> [<komut> "
"[<argümanlar>]] || bindctxt <içerik> <düğme> [<komut> [<argümanlar>]] || "
"unbind <düğme> || unbindctxt <içerik> <düğme> || reset <düğme> || "
"resetctxt <içerik> <düğme> || resetall -yes [<içerik>] || missing [<içerik>] "
"|| legacy <düğme>..."
msgid "raw[list]: list all current keys"
msgstr ""
@@ -2984,7 +2890,7 @@ msgid ""
"error|-join|-network|-quit] [<text>] || -stdout|-stderr [<text>] || -beep"
msgstr ""
"[-buffer <sayı>|<ad>] [-newbuffer <ad>] [-free] [-switch] [-core|-current] [-"
"y <satır>] [-escape] [-date <tarih>] [-tags <etiketler>] [-action|-error|-"
"y <satır>] [-escape] [-date <tarih>] [-tags <künyeler>] [-action|-error|-"
"join|-network|-quit] [<metin>] || -stdout|-stderr [<metin>] || -beep"
msgid ""
@@ -4808,9 +4714,9 @@ msgid ""
"messages from nick \"FlashCode\", \"irc_notice+nick_toto*\" for notices from "
"a nick starting with \"toto\""
msgstr ""
"vurgulanacak etiketlerin virgülle ayrılmış listesi; BÜYÜK/küçük harf "
"duyarsız karşılaştırma; her bir etikette \"*\" jokerine izin verilir; "
"etiketler arasında mantıksal \"and\" yapmak için etiketleri \"+\" ile "
"vurgulanacak künyelerin virgülle ayrılmış listesi; BÜYÜK/küçük harf "
"duyarsız karşılaştırma; her bir künyede \"*\" jokerine izin verilir; "
"künyeler arasında mantıksal \"and\" yapmak için künyeleri \"+\" ile "
"ayırabilirsiniz; örnekler: \"GazMan\" takma adından iletiler için "
"\"nick_gazman\", \"toto\" ile başlayan bir takma addan gelecek bildirimler "
"için \"irc_notice+nick_toto\""
@@ -5526,7 +5432,7 @@ msgstr "\"failed\" durumu metin rengi"
msgid "text color for tags after messages (displayed with command /debug tags)"
msgstr ""
"iletilerden sonraki etiket metin rengi (/debug tags komutu ile görüntülenir)"
"iletilerden sonraki künye metin rengi (/debug tags komutu ile görüntülenir)"
msgid "text color for marker on lines where text sought is found"
msgstr "aranan metnin bulunduğu satır imleyicisi metin rengi"
@@ -5734,6 +5640,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr "kısmi bir tamamlama gerçekleştiğinde uyarı (BEL) gönder"
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -6757,15 +6667,12 @@ msgstr "Fare devre dışı"
msgid " TERM='%s', size: %dx%d"
msgstr " TERM='%s', boyut: %dx%d"
#, c-format
msgid "Running WeeChat in background..."
msgstr "WeeChat arka planda çalışıyor..."
#, c-format
msgid "fork error"
msgstr "çatal hatası"
#, c-format
msgid "OK"
msgstr "TAMAM"
@@ -12061,11 +11968,11 @@ msgid ""
"\" can be used to make a logical \"and\" between tags; wildcard \"*\" is "
"allowed in tags; an empty value allows highlight on any tag"
msgstr ""
"vurgulamayı irc arabelleklerindeki bu etiketlere sınırla (kullanıcı "
"iletilerinde vurgulama olup sunucu iletilerinde olmaması için); etiketler "
"bir virgülle ayrılmalıdır ve \"+\" etiketler arasında mantıksal bir \"and\" "
"yapmak için kullanılabilir; etiketlerde \"*\" jokerine izin verilir; boş bir "
"değer herhangi bir etikette vurgulamaya izin verir"
"vurgulamayı irc arabelleklerindeki bu künyelere sınırla (kullanıcı "
"iletilerinde vurgulama olup sunucu iletilerinde olmaması için); künyeler "
"bir virgülle ayrılmalıdır ve \"+\" künyeler arasında mantıksal bir \"and\" "
"yapmak için kullanılabilir; künyelerde \"*\" jokerine izin verilir; boş bir "
"değer herhangi bir künyede vurgulamaya izin verir"
msgid ""
"add tag \"irc_ignored\" in ignored messages instead of removing them; that "
@@ -12242,7 +12149,7 @@ msgid ""
"comma separated list of tags used in a welcome notices redirected to a "
"channel, for example: \"notify_private\""
msgstr ""
"bir kanala yeniden yönlendirilen hoş geldiniz ihbarlarındaki etiketlerin "
"bir kanala yeniden yönlendirilen hoş geldiniz ihbarlarındaki künyelerin "
"virgülle ayrılmış listesi; örneğin: \"notify_private\""
msgid ""
@@ -12251,7 +12158,7 @@ msgid ""
"\"notify_message\", \"notify_private\" or \"notify_highlight\""
msgstr ""
"bir takma ad sunucuya katıldığında veya çıktığında bildir tarafından "
"iletilerde kullanılan etiketlerin virgülle ayrılmış listesi (komut ison'u "
"iletilerde kullanılan künyelerin virgülle ayrılmış listesi (komut ison'u "
"veya monitörünün sonucu); örneğin: \"notify_message\", \"notify_private\" "
"veya \"notify_highlight\""
@@ -12261,7 +12168,7 @@ msgid ""
"\"notify_message\", \"notify_private\" or \"notify_highlight\""
msgstr ""
"bir takma ad uzakta durumu değiştiğinde bildir tarafından iletilerde "
"kullanılan etiketlerin virgülle ayrılmış listesi (komut whois'inin sonucu); "
"kullanılan künyelerin virgülle ayrılmış listesi (komut whois'inin sonucu); "
"örneğin: \"notify_message\", \"notify_private\" veya \"notify_highlight\""
msgid ""
@@ -12278,7 +12185,7 @@ msgid ""
"comma separated list of tags used in private messages, for example: "
"\"notify_message\", \"notify_private\" or \"notify_highlight\""
msgstr ""
"özel iletilerde kullanılan etiketlerin virgülle ayrılmış listesi; örneğin: "
"özel iletilerde kullanılan künyelerin virgülle ayrılmış listesi; örneğin: "
"\"notify_message\", \"notify_private\" veya \"notify_highlight\""
msgid ""
@@ -12319,7 +12226,7 @@ msgid ""
"see /help filter)"
msgstr ""
"eğer bir süredir konuşma yoksa katılma/ayrılma/çıkma/takma ad iletilerini "
"belirli bir takma ad için süz (\"irc_smart_filter\" etiketi üzerinde bir "
"belirli bir takma ad için süz (\"irc_smart_filter\" künyesi üzerinde bir "
"süzgeç oluşturmalısınız, bkz. /help filter)"
#. TRANSLATORS: please do not translate "account"
@@ -12348,7 +12255,7 @@ msgid ""
"join is unmasked, as well as nick changes after this join (0 = disable: "
"never unmask a join)"
msgstr ""
"\"irc_smart_filter\" etiketi tarafından süzülen bir katılma iletisinin "
"\"irc_smart_filter\" künyesi tarafından süzülen bir katılma iletisinin "
"maskesini kaldırma gecikmesi (dakika): eğer bir takma ad en çok N dakika "
"önce katıldıysa ve kanalda bir şey söylediyse (ileti, ihbar veya konu "
"güncellemesi) katılma maskesi ve bu katılma sonrasındaki takma ad "
@@ -12794,8 +12701,8 @@ msgid ""
"\"channel\" was not found), \"pos_text\": index of \"text\" message (\"-1\" "
"if \"text\" was not found)"
msgstr ""
"\"tags\": etiketler, \"tag_xxx\": etiketin kaçırılmamış değeri \"xxx\" "
"(etiket başına bir anahtar), \"message_without_tags\": etiketsiz ileti, "
"\"tags\": künyeler, \"tag_xxx\": künyenin kaçırılmamış değeri \"xxx\" "
"(künye başına bir anahtar), \"message_without_tags\": künyesiz ileti, "
"\"nick\": takma ad, \"user\": kullanıcı adı, \"host\": makine, \"command\": "
"komut, \"channel\": kanal, \"arguments\": argümanlar (kanalı içerir), "
"\"text\": metin (örneğin: kullanıcı iletisi), \"param1\" ... \"paramN\": "
@@ -16165,10 +16072,10 @@ msgid ""
"channel (supported tags: \"irc_join\", \"irc_part\", \"irc_quit\", "
"\"irc_nick\", \"irc_privmsg\"), \"*\" = all supported tags"
msgstr ""
"IRC kanalı başına biriken günlükte görüntülenen ileti etiketlerinin virgülle "
"ayrılmış listesi: (desteklenen etiketler: \"irc_join\", \"irc_part\", "
"IRC kanalı başına biriken günlükte görüntülenen ileti künyelerinin virgülle "
"ayrılmış listesi: (desteklenen künyeler: \"irc_join\", \"irc_part\", "
"\"irc_quit\", \"irc_nick\", \"irc_privmsg\"), \"*\" = tüm desteklenen "
"etiketler"
"künyeler"
msgid ""
"format for time in backlog messages (see man strftime for format) (not used "
@@ -16177,7 +16084,7 @@ msgid ""
msgstr ""
"biriken günlük iletilerindeki zaman biçimi (biçim için bkz. man strftime) "
"(\"server_time\" yeteneği sunucu tarafından etkinleştirilmişse kullanılmaz; "
"çünkü zaman irc etiketi olarak gönderilir); boş dizi = biriken günlük "
"çünkü zaman IRC künyesi olarak gönderilir); boş dizi = biriken günlük "
"iletilerinde zamanı devre dışı bırak"
#, fuzzy
@@ -16645,16 +16552,16 @@ msgid "License"
msgstr "Lisans"
msgid "Tags"
msgstr "Etiketler"
msgstr "Künyeler"
msgid "Status"
msgstr "Durum"
msgid "Date added"
msgstr "Tarih eklendi"
msgstr "Eklenen tarih"
msgid "Date updated"
msgstr "Tarih güncellendi"
msgstr "Güncellenen tarih"
msgid "URL"
msgstr "URL"
@@ -16666,10 +16573,10 @@ msgid "Requires"
msgstr "Gereksinimler"
msgid "Min WeeChat"
msgstr "En az WeeChat"
msgstr "WeeChat en az"
msgid "Max WeeChat"
msgstr "En çok WeeChat"
msgstr "WeeChat en çok"
msgid "Script has defined:"
msgstr "Betik şunu tanımladı:"
@@ -16874,7 +16781,7 @@ msgid "files in script directories"
msgstr "betik dizinlerindeki dosyalar"
msgid "tags of scripts in repository"
msgstr "depodaki betik etiketleri"
msgstr "depodaki betik künyeleri"
msgid ""
"format of columns displayed in script buffer: following column identifiers "
@@ -16886,7 +16793,7 @@ msgstr ""
"betik arabelleğinde görüntülenen sütunların biçimi: izleyen sütun "
"tanımlayıcıları değerleriyle değiştirilir: %a=yazar, %d=açıklama, %D=eklenme "
"tarihi, %e=uzantı, %l=dil, %L=lisans, %n=uzantı ile ad, %N=ad, "
"%r=gereklilikler, %s=durum, %t=etiketler, %u=güncellenme tarihi, %v=sürüm, "
"%r=gereklilikler, %s=durum, %t=künyeler, %u=güncellenme tarihi, %v=sürüm, "
"%V=yüklü sürüm, %w=min_weechat, %W=max_weechat)"
msgid "colorize output of diff"
@@ -17008,10 +16915,10 @@ msgid "text color for selected line in script buffer"
msgstr "betik arabelleği seçili satır metin rengi"
msgid "text color of tags in script buffer"
msgstr "betik arabelleği etiket metin rengi"
msgstr "betik arabelleği künye metin rengi"
msgid "text color of tags for selected line in script buffer"
msgstr "betik arabelleği seçili satır etiket metin rengi"
msgstr "betik arabelleği seçili satır künye metin rengi"
msgid "text color of version in script buffer"
msgstr "betik arabelleği sürüm metin rengi"
@@ -18177,7 +18084,7 @@ msgstr "Xfer listesi:"
msgid ""
"%3d. %s (%s), file: \"%s\" (local: \"%s\"), %s %s, status: %s%s%s (%llu %%)"
msgstr ""
"%3d. %s (%s), dosya: \"%s\" (yerel: \"%s\"), %s %s, durum: %s%s%s (%llu %%)"
"%3d. %s (%s), dosya: \"%s\" (yerel: \"%s\"), %s %s, durum: %s%s%s (%%%llu)"
# noqa
msgid "sent to"
+5 -4
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-05-04 09:21+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2014-08-16 10:27+0200\n"
"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -4804,6 +4804,10 @@ msgstr ""
msgid "send alert (BEL) when a partial completion occurs"
msgstr ""
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
msgid ""
"partially complete command names (stop when many commands found begin with "
"same letters)"
@@ -5622,15 +5626,12 @@ msgstr ""
msgid " TERM='%s', size: %dx%d"
msgstr ""
#, c-format
msgid "Running WeeChat in background..."
msgstr ""
#, c-format
msgid "fork error"
msgstr ""
#, c-format
msgid "OK"
msgstr ""
+12
View File
@@ -0,0 +1,12 @@
# SPDX-FileCopyrightText: 2025 Sébastien Helleu <flashcode@flashtux.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later
continue-on-failure = true
[[operations]]
include-path-regex = "/sync/?.*"
enabled = false
[auth]
basic = { username = "plain", password = "${RELAY_PASSWORD}" }
+8
View File
@@ -313,6 +313,7 @@ struct t_config_option *config_completion_nick_first_only = NULL;
struct t_config_option *config_completion_nick_ignore_chars = NULL;
struct t_config_option *config_completion_nick_ignore_words = NULL;
struct t_config_option *config_completion_partial_completion_alert = NULL;
struct t_config_option *config_completion_partial_completion_auto_expand = NULL;
struct t_config_option *config_completion_partial_completion_command = NULL;
struct t_config_option *config_completion_partial_completion_command_arg = NULL;
struct t_config_option *config_completion_partial_completion_count = NULL;
@@ -5243,6 +5244,13 @@ config_weechat_init_options (void)
N_("send alert (BEL) when a partial completion occurs"),
NULL, 0, 0, "on", NULL, 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
config_completion_partial_completion_auto_expand = config_file_new_option (
weechat_config_file, weechat_config_section_completion,
"partial_completion_auto_expand", "boolean",
N_("automatically expand word after partial completion when "
"completing again"),
NULL, 0, 0, "on", NULL, 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
config_completion_partial_completion_command = config_file_new_option (
weechat_config_file, weechat_config_section_completion,
"partial_completion_command", "boolean",
+1
View File
@@ -362,6 +362,7 @@ extern struct t_config_option *config_completion_nick_first_only;
extern struct t_config_option *config_completion_nick_ignore_chars;
extern struct t_config_option *config_completion_nick_ignore_words;
extern struct t_config_option *config_completion_partial_completion_alert;
extern struct t_config_option *config_completion_partial_completion_auto_expand;
extern struct t_config_option *config_completion_partial_completion_command;
extern struct t_config_option *config_completion_partial_completion_command_arg;
extern struct t_config_option *config_completion_partial_completion_count;
+94 -54
View File
@@ -127,8 +127,8 @@ gui_completion_init (struct t_gui_completion *completion,
completion->args = NULL;
completion->direction = 0;
completion->add_space = 1;
completion->force_partial_completion = 0;
completion->reverse_partial_completion = 0;
completion->partial_completion = 0;
completion->template_partial_completion = 0;
completion->list = arraylist_new (
32, 1, 0,
@@ -631,7 +631,7 @@ gui_completion_build_list_template (struct t_gui_completion *completion,
config_hashtable_completion_partial_templates,
custom_completion))
{
completion->reverse_partial_completion = 1;
completion->template_partial_completion = 1;
}
gui_completion_custom (completion,
custom_completion,
@@ -907,8 +907,6 @@ gui_completion_find_context (struct t_gui_completion *completion,
const char *ptr_command, *ptr_data, *ptr_space, *ptr_newline, *prev_char;
/* look for context */
gui_completion_free_data (completion);
gui_completion_init (completion, completion->plugin, completion->buffer);
ptr_command = NULL;
command_arg = 0;
@@ -1241,7 +1239,7 @@ gui_completion_partial_build_list (struct t_gui_completion *completion,
void
gui_completion_complete (struct t_gui_completion *completion)
{
int length, word_found_seen, other_completion, partial_completion;
int length, word_found_seen, other_completion;
int common_prefix_size, index, index2;
struct t_gui_completion_word *ptr_completion_word, *ptr_completion_word2;
@@ -1249,34 +1247,15 @@ gui_completion_complete (struct t_gui_completion *completion)
word_found_seen = 0;
other_completion = 0;
partial_completion = completion->force_partial_completion;
if (!partial_completion)
{
if (completion->context == GUI_COMPLETION_COMMAND)
{
partial_completion = CONFIG_BOOLEAN(config_completion_partial_completion_command);
}
else if (completion->context == GUI_COMPLETION_COMMAND_ARG)
{
partial_completion = CONFIG_BOOLEAN(config_completion_partial_completion_command_arg);
}
else
partial_completion = CONFIG_BOOLEAN(config_completion_partial_completion_other);
}
if (completion->reverse_partial_completion)
partial_completion ^= 1;
common_prefix_size = 0;
if (partial_completion
if (completion->partial_completion
&& completion->list && (completion->list->size > 0))
{
common_prefix_size = gui_completion_common_prefix_size (completion->list,
NULL);
}
if (partial_completion
if (completion->partial_completion
&& completion->word_found
&& (utf8_strlen (completion->word_found) >= common_prefix_size))
{
@@ -1355,7 +1334,7 @@ gui_completion_complete (struct t_gui_completion *completion)
completion->position = 0;
/* stop after common prefix, if asked by user */
if (partial_completion
if (completion->partial_completion
&& ((utf8_strlen (completion->word_found) >= common_prefix_size))
&& (other_completion > 0))
{
@@ -1523,7 +1502,7 @@ gui_completion_search (struct t_gui_completion *completion, const char *data,
int position, int direction)
{
char *old_word_found;
int real_position;
int real_position, force_no_partial;
if (!completion || !data || (position < 0))
return 0;
@@ -1532,14 +1511,75 @@ gui_completion_search (struct t_gui_completion *completion, const char *data,
completion->direction = direction;
force_no_partial = 0;
if ((completion->context != GUI_COMPLETION_NULL)
&& (arraylist_size (completion->partial_list) > 0)
&& CONFIG_BOOLEAN(config_completion_partial_completion_auto_expand))
{
force_no_partial = 1;
arraylist_clear (completion->partial_list);
}
/* if new completion => look for base word */
if (real_position != completion->position)
{
free (completion->word_found);
completion->word_found = NULL;
completion->word_found_is_nick = 0;
gui_completion_free_data (completion);
gui_completion_init (completion, completion->plugin, completion->buffer);
completion->partial_completion = (direction < 0);
completion->direction = direction;
gui_completion_find_context (completion, data, real_position);
completion->force_partial_completion = (direction < 0);
if (force_no_partial)
{
completion->partial_completion = 0;
completion->direction = 1;
}
else if (completion->template_partial_completion)
{
if (completion->direction < 0)
{
completion->partial_completion = 0;
completion->direction = 1;
}
else
{
completion->partial_completion = 1;
}
}
else
{
switch (completion->context)
{
case GUI_COMPLETION_NULL:
break;
case GUI_COMPLETION_COMMAND:
if (CONFIG_BOOLEAN(config_completion_partial_completion_command))
{
completion->partial_completion ^= 1;
if (completion->direction < 0)
completion->direction = 1;
}
break;
case GUI_COMPLETION_COMMAND_ARG:
if (CONFIG_BOOLEAN(config_completion_partial_completion_command_arg))
{
completion->partial_completion ^= 1;
if (completion->direction < 0)
completion->direction = 1;
}
break;
case GUI_COMPLETION_AUTO:
if (CONFIG_BOOLEAN(config_completion_partial_completion_other))
{
completion->partial_completion ^= 1;
if (completion->direction < 0)
completion->direction = 1;
}
break;
}
}
}
/* completion */
@@ -1656,8 +1696,8 @@ gui_completion_hdata_completion_cb (const void *pointer, void *data,
HDATA_VAR(struct t_gui_completion, args, STRING, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, direction, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, add_space, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, force_partial_completion, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, reverse_partial_completion, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, partial_completion, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, template_partial_completion, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, list, POINTER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, word_found, STRING, 0, NULL, NULL);
HDATA_VAR(struct t_gui_completion, word_found_is_nick, INTEGER, 0, NULL, NULL);
@@ -1731,30 +1771,30 @@ gui_completion_print_log (void)
ptr_completion = ptr_completion->next_completion)
{
log_printf ("[completion (addr:%p)]", ptr_completion);
log_printf (" plugin. . . . . . . . . . : %p", ptr_completion->plugin);
log_printf (" buffer. . . . . . . . . . : %p ('%s')",
log_printf (" plugin. . . . . . . . . . . : %p", ptr_completion->plugin);
log_printf (" buffer. . . . . . . . . . . : %p ('%s')",
ptr_completion->buffer,
ptr_completion->buffer->full_name);
log_printf (" context . . . . . . . . . : %d", ptr_completion->context);
log_printf (" case_sensitive. . . . . . : %d", ptr_completion->case_sensitive);
log_printf (" base_command. . . . . . . : '%s'", ptr_completion->base_command);
log_printf (" base_command_arg_index. . : %d", ptr_completion->base_command_arg_index);
log_printf (" base_word . . . . . . . . : '%s'", ptr_completion->base_word);
log_printf (" base_word_pos . . . . . . : %d", ptr_completion->base_word_pos);
log_printf (" position. . . . . . . . . : %d", ptr_completion->position);
log_printf (" args. . . . . . . . . . . : '%s'", ptr_completion->args);
log_printf (" direction . . . . . . . . : %d", ptr_completion->direction);
log_printf (" add_space . . . . . . . . : %d", ptr_completion->add_space);
log_printf (" force_partial_completion. : %d", ptr_completion->force_partial_completion);
log_printf (" reverse_partial_completion: %d", ptr_completion->reverse_partial_completion);
log_printf (" list. . . . . . . . . . . : %p", ptr_completion->list);
log_printf (" word_found. . . . . . . . : '%s'", ptr_completion->word_found);
log_printf (" word_found_is_nick. . . . : %d", ptr_completion->word_found_is_nick);
log_printf (" position_replace. . . . . : %d", ptr_completion->position_replace);
log_printf (" diff_size . . . . . . . . : %d", ptr_completion->diff_size);
log_printf (" diff_length . . . . . . . : %d", ptr_completion->diff_length);
log_printf (" prev_completion . . . . . : %p", ptr_completion->prev_completion);
log_printf (" next_completion . . . . . : %p", ptr_completion->next_completion);
log_printf (" context . . . . . . . . . . : %d", ptr_completion->context);
log_printf (" case_sensitive. . . . . . . : %d", ptr_completion->case_sensitive);
log_printf (" base_command. . . . . . . . : '%s'", ptr_completion->base_command);
log_printf (" base_command_arg_index. . . : %d", ptr_completion->base_command_arg_index);
log_printf (" base_word . . . . . . . . . : '%s'", ptr_completion->base_word);
log_printf (" base_word_pos . . . . . . . : %d", ptr_completion->base_word_pos);
log_printf (" position. . . . . . . . . . : %d", ptr_completion->position);
log_printf (" args. . . . . . . . . . . . : '%s'", ptr_completion->args);
log_printf (" direction . . . . . . . . . : %d", ptr_completion->direction);
log_printf (" add_space . . . . . . . . . : %d", ptr_completion->add_space);
log_printf (" partial_completion. . . . . : %d", ptr_completion->partial_completion);
log_printf (" template_partial_completion : %d", ptr_completion->template_partial_completion);
log_printf (" list. . . . . . . . . . . . : %p", ptr_completion->list);
log_printf (" word_found. . . . . . . . . : '%s'", ptr_completion->word_found);
log_printf (" word_found_is_nick. . . . . : %d", ptr_completion->word_found_is_nick);
log_printf (" position_replace. . . . . . : %d", ptr_completion->position_replace);
log_printf (" diff_size . . . . . . . . . : %d", ptr_completion->diff_size);
log_printf (" diff_length . . . . . . . . : %d", ptr_completion->diff_length);
log_printf (" prev_completion . . . . . . : %p", ptr_completion->prev_completion);
log_printf (" next_completion . . . . . . : %p", ptr_completion->next_completion);
if (ptr_completion->list && (ptr_completion->list->size > 0))
{
log_printf ("");
+2 -2
View File
@@ -56,8 +56,8 @@ struct t_gui_completion
char *args; /* command line args (including base word) */
int direction; /* +1=search next word, -1=previous word */
int add_space; /* add space after completion? */
int force_partial_completion; /* force partial completion? */
int reverse_partial_completion; /* reverse partial completion? */
int partial_completion; /* partial completion? */
int template_partial_completion; /* template with partial completion? */
/* for command argument completion */
struct t_arraylist *list; /* data list for completion */
+94 -53
View File
@@ -374,7 +374,7 @@ RELAY_API_PROTOCOL_CALLBACK(options)
relay_api_msg_send_json (
client,
RELAY_HTTP_204_NO_CONTENT,
"Access-Control-Allow-Methods: GET, POST, PUT, DELETE\r\n"
"Access-Control-Allow-Methods: " RELAY_API_ALLOWED_METHODS "\r\n"
"Access-Control-Allow-Headers: origin, content-type, accept, authorization",
NULL, /* body_type */
NULL); /* json_body */
@@ -401,9 +401,13 @@ RELAY_API_PROTOCOL_CALLBACK(handshake)
json_body = cJSON_Parse (client->http_req->body);
if (json_body)
{
if (!cJSON_IsObject (json_body))
return RELAY_API_PROTOCOL_RC_BAD_REQUEST;
json_algos = cJSON_GetObjectItem (json_body, "password_hash_algo");
if (json_algos)
{
if (!cJSON_IsArray (json_algos))
goto invalid_hash_algo;
cJSON_ArrayForEach (json_algo, json_algos)
{
ptr_algo = (cJSON_IsString (json_algo)) ?
@@ -411,7 +415,17 @@ RELAY_API_PROTOCOL_CALLBACK(handshake)
if (ptr_algo)
{
index_hash_algo = relay_auth_password_hash_algo_search (ptr_algo);
if ((index_hash_algo >= 0) && (index_hash_algo > hash_algo_found))
if (index_hash_algo < 0)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Hash algorithm \"%s\" not found",
ptr_algo);
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
if (index_hash_algo > hash_algo_found)
{
if (weechat_string_match_list (
relay_auth_password_hash_algo_name[index_hash_algo],
@@ -422,6 +436,8 @@ RELAY_API_PROTOCOL_CALLBACK(handshake)
}
}
}
else
goto invalid_hash_algo;
}
}
}
@@ -460,6 +476,14 @@ RELAY_API_PROTOCOL_CALLBACK(handshake)
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
invalid_hash_algo:
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Invalid hash algorithm");
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
/*
@@ -712,57 +736,55 @@ RELAY_API_PROTOCOL_CALLBACK(input)
char str_delay[32];
json_body = cJSON_Parse (client->http_req->body);
if (!json_body)
if (!json_body || !cJSON_IsObject (json_body))
return RELAY_API_PROTOCOL_RC_BAD_REQUEST;
/* get buffer either by id or by name */
/* get buffer either by name or by id */
ptr_buffer = NULL;
json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id");
if (json_buffer_id)
json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name");
if (json_buffer_name)
{
if (cJSON_IsNumber (json_buffer_id))
if (cJSON_IsString (json_buffer_name))
{
snprintf (str_id, sizeof (str_id),
"%lld", (long long)cJSON_GetNumberValue (json_buffer_id));
ptr_buffer = weechat_buffer_search ("==id", str_id);
ptr_buffer_name = cJSON_GetStringValue (json_buffer_name);
ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name);
if (!ptr_buffer)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Buffer \"%lld\" not found",
(long long)cJSON_GetNumberValue (json_buffer_id));
"Buffer \"%s\" not found",
ptr_buffer_name);
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
}
}
else
if (!ptr_buffer)
{
json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name");
if (json_buffer_name)
json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id");
if (json_buffer_id)
{
if (cJSON_IsString (json_buffer_name))
if (cJSON_IsNumber (json_buffer_id))
{
ptr_buffer_name = cJSON_GetStringValue (json_buffer_name);
ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name);
snprintf (str_id, sizeof (str_id),
"%lld", (long long)cJSON_GetNumberValue (json_buffer_id));
ptr_buffer = weechat_buffer_search ("==id", str_id);
if (!ptr_buffer)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Buffer \"%s\" not found",
ptr_buffer_name);
"Buffer \"%lld\" not found",
(long long)cJSON_GetNumberValue (json_buffer_id));
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
}
}
else
{
ptr_buffer = weechat_buffer_search_main ();
}
}
if (!ptr_buffer)
ptr_buffer = weechat_buffer_search_main ();
if (!ptr_buffer)
{
cJSON_Delete (json_body);
@@ -841,57 +863,55 @@ RELAY_API_PROTOCOL_CALLBACK(completion)
struct t_gui_buffer *ptr_buffer;
json_body = cJSON_Parse (client->http_req->body);
if (!json_body)
if (!json_body || !cJSON_IsObject(json_body))
return RELAY_API_PROTOCOL_RC_BAD_REQUEST;
/* get buffer either by id or by name */
/* get buffer either by name or by id */
ptr_buffer = NULL;
json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id");
if (json_buffer_id)
json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name");
if (json_buffer_name)
{
if (cJSON_IsNumber (json_buffer_id))
if (cJSON_IsString (json_buffer_name))
{
snprintf (str_id, sizeof(str_id),
"%lld", (long long)cJSON_GetNumberValue (json_buffer_id));
ptr_buffer = weechat_buffer_search ("==id", str_id);
ptr_buffer_name = cJSON_GetStringValue (json_buffer_name);
ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name);
if (!ptr_buffer)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Buffer \"%lld\" not found",
(long long)cJSON_GetNumberValue (json_buffer_id));
"Buffer \"%s\" not found",
ptr_buffer_name);
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
}
}
else
if (!ptr_buffer)
{
json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name");
if (json_buffer_name)
json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id");
if (json_buffer_id)
{
if (cJSON_IsString (json_buffer_name))
if (cJSON_IsNumber (json_buffer_id))
{
ptr_buffer_name = cJSON_GetStringValue (json_buffer_name);
ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name);
snprintf (str_id, sizeof(str_id),
"%lld", (long long)cJSON_GetNumberValue (json_buffer_id));
ptr_buffer = weechat_buffer_search ("==id", str_id);
if (!ptr_buffer)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Buffer \"%s\" not found",
ptr_buffer_name);
"Buffer \"%lld\" not found",
(long long)cJSON_GetNumberValue (json_buffer_id));
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
}
}
else
{
ptr_buffer = weechat_buffer_search_main ();
}
}
if (!ptr_buffer)
ptr_buffer = weechat_buffer_search_main ();
if (!ptr_buffer)
{
cJSON_Delete (json_body);
@@ -1197,7 +1217,7 @@ relay_api_protocol_recv_json (struct t_relay_client *client, const char *json)
void
relay_api_protocol_recv_http (struct t_relay_client *client)
{
int i, num_args;
int i, num_args, match_method, match_resource;
char str_error[1024];
enum t_relay_api_protocol_rc return_code;
struct t_relay_api_protocol_cb protocol_cb[] = {
@@ -1238,18 +1258,22 @@ relay_api_protocol_recv_http (struct t_relay_client *client)
|| !client->http_req->path_items[1]
|| (strcmp (client->http_req->path_items[0], "api") != 0))
{
goto error_not_found;
goto resource_not_found;
}
num_args = client->http_req->num_path_items - 2;
for (i = 0; protocol_cb[i].resource; i++)
{
if (strcmp (protocol_cb[i].method, client->http_req->method) != 0)
continue;
match_method = (strcmp (protocol_cb[i].method, client->http_req->method) == 0);
if ((strcmp (protocol_cb[i].resource, "*") != 0)
&& (strcmp (protocol_cb[i].resource, client->http_req->path_items[1]) != 0))
match_resource = ((strcmp (protocol_cb[i].resource, "*") == 0)
|| (strcmp (protocol_cb[i].resource, client->http_req->path_items[1]) == 0));
if (!match_method && (strcmp (protocol_cb[i].resource, "*") != 0) && match_resource)
goto error_method_not_allowed;
if (!match_method || !match_resource)
continue;
if (protocol_cb[i].auth_required
@@ -1331,7 +1355,18 @@ relay_api_protocol_recv_http (struct t_relay_client *client)
}
}
goto error_not_found;
resource_not_found:
if ((strcmp (client->http_req->method, "GET") != 0)
&& (strcmp (client->http_req->method, "POST") != 0)
&& (strcmp (client->http_req->method, "PUT") != 0)
&& (strcmp (client->http_req->method, "DELETE") != 0))
{
goto error_method_not_allowed;
}
else
{
goto error_not_found;
}
error_bad_request:
relay_api_msg_send_error_json (client, RELAY_HTTP_400_BAD_REQUEST,
@@ -1343,6 +1378,12 @@ error_not_found:
NULL, RELAY_HTTP_ERROR_NOT_FOUND);
goto error;
error_method_not_allowed:
relay_api_msg_send_error_json (client, RELAY_HTTP_405_METHOD_NOT_ALLOWED,
"Allow: " RELAY_API_ALLOWED_METHODS,
RELAY_HTTP_ERROR_METHOD_NOT_ALLOWED);
goto error;
error_memory:
relay_api_msg_send_error_json (client, RELAY_HTTP_503_SERVICE_UNAVAILABLE,
NULL, RELAY_HTTP_ERROR_OUT_OF_MEMORY);
@@ -22,6 +22,8 @@
#ifndef WEECHAT_PLUGIN_RELAY_API_PROTOCOL_H
#define WEECHAT_PLUGIN_RELAY_API_PROTOCOL_H
#define RELAY_API_ALLOWED_METHODS "GET, POST, PUT, DELETE"
#define RELAY_API_CB(__command) &relay_api_protocol_cb_##__command
#define RELAY_API_PROTOCOL_CALLBACK(__command) \
enum t_relay_api_protocol_rc \
+1 -1
View File
@@ -27,7 +27,7 @@ enum t_relay_status;
#define RELAY_API_VERSION_MAJOR 0
#define RELAY_API_VERSION_MINOR 4
#define RELAY_API_VERSION_PATCH 0
#define RELAY_API_VERSION_PATCH 1
#define RELAY_API_VERSION_NUMBER \
((RELAY_API_VERSION_MAJOR << 16) \
+ (RELAY_API_VERSION_MINOR << 8) \
+138 -143
View File
@@ -17,7 +17,7 @@ info:
license:
name: CC BY-NC-SA 4.0
url: https://creativecommons.org/licenses/by-nc-sa/4.0/
version: 0.4.0
version: 0.4.1
externalDocs:
url: https://weechat.org/doc/
@@ -50,7 +50,29 @@ paths:
This endpoint does not require authentication.
operationId: handshake
requestBody:
$ref: '#/components/requestBodies/HandshakeBody'
description: Handshake request
required: true
content:
application/json:
schema:
type: object
properties:
password_hash_algo:
type: array
items:
type: string
enum:
- plain
- sha256
- sha512
- pbkdf2+sha256
- pbkdf2+sha512
example:
- plain
- sha256
- sha512
- pbkdf2+sha256
- pbkdf2+sha512
responses:
'200':
description: Successful operation
@@ -58,6 +80,12 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/Handshake'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Out of memory
content:
@@ -174,7 +202,7 @@ paths:
tags:
- buffers
description: |
Get buffer by full name, with optional lines and nicks.
Get a single buffer by full name, with optional lines and nicks.
operationId: getBufferByName
parameters:
- $ref: '#/components/parameters/totp'
@@ -492,7 +520,31 @@ paths:
parameters:
- $ref: '#/components/parameters/totp'
requestBody:
$ref: '#/components/requestBodies/InputBody'
description: Buffer and command to execute
required: true
content:
application/json:
schema:
type: object
properties:
buffer_id:
type: integer
format: int64
description: Buffer identifier (≥ 0)
buffer_name:
type: string
description: >-
Buffer full name
example: 'core.weechat'
command:
type: string
description: text or command to send
example: '/print test'
required:
- command
example:
buffer_name: 'core.weechat'
command: '/print test'
responses:
'204':
description: Successful operation
@@ -516,11 +568,42 @@ paths:
- completion
description: |
Complete user command or text.
operationId: input
operationId: completion
parameters:
- $ref: '#/components/parameters/totp'
requestBody:
$ref: '#/components/requestBodies/CompletionBody'
description: Buffer and user text/command to complete
required: true
content:
application/json:
schema:
type: object
properties:
buffer_id:
type: integer
format: int64
description: Buffer identifier (≥ 0)
buffer_name:
type: string
description: >-
Buffer full name
example: 'core.weechat'
command:
type: string
description: user command or text to complete
example: '/hel'
position:
type: integer
format: int32
description: Position in data (≥ 0)
example: 4
required:
- command
- position
example:
buffer_name: 'core.weechat'
command: '/hel'
position: 4
responses:
'200':
description: Successful operation
@@ -552,7 +635,16 @@ paths:
parameters:
- $ref: '#/components/parameters/totp'
requestBody:
$ref: '#/components/requestBodies/PingBody'
description: Custom data that will be returned in the response
required: false
content:
application/json:
schema:
type: object
properties:
data:
type: string
example: '1714854355123456'
responses:
'200':
description: Successful operation
@@ -589,7 +681,37 @@ paths:
parameters:
- $ref: '#/components/parameters/totp'
requestBody:
$ref: '#/components/requestBodies/SyncBody'
description: Synchronization parameters
required: false
content:
application/json:
schema:
type: object
properties:
sync:
type: boolean
description: Enable synchronization
example: true
nicks:
type: boolean
description: Receive nick updates in buffers
example: true
input:
type: boolean
description: Receive input changes in buffers (content and cursor position)
example: true
colors:
type: string
enum:
- ansi
- weechat
- strip
default: ansi
description: |
How to return strings with color codes:
* `ansi`: return ANSI color codes
* `weechat`: return WeeChat internal color codes
* `strip`: strip colors
responses:
'204':
description: Successful operation
@@ -632,6 +754,7 @@ components:
type: integer
format: int64
description: Buffer identifier
example: 1709932823238637
bufferName:
name: buffer_name
in: path
@@ -900,7 +1023,7 @@ components:
type: string
format: date-time
description: date and time of line
example: '"2023-12-05T19:46:03.847625Z'
example: '2023-12-05T19:46:03.847625Z'
date_printed:
type: string
format: date-time
@@ -1161,11 +1284,11 @@ components:
type: array
items:
type: string
example:
- 'query'
- 'quiet'
- 'quit'
- 'quote'
example:
- 'query'
- 'quiet'
- 'quit'
- 'quote'
required:
- context
- base_word
@@ -1177,138 +1300,10 @@ components:
properties:
data:
type: string
example: 1714854355123456
example: '1714854355123456'
required:
- data
requestBodies:
HandshakeBody:
description: Handshake request
required: false
content:
application/json:
schema:
type: object
properties:
password_hash_algo:
type: array
items:
type: string
enum:
- plain
- sha256
- sha512
- pbkdf2+sha256
- pbkdf2+sha512
example:
- plain
- sha256
- sha512
- pbkdf2+sha256
- pbkdf2+sha512
InputBody:
description: Buffer and command to execute
required: true
content:
application/json:
schema:
type: object
properties:
buffer_id:
type: integer
format: int64
description: Buffer identifier (≥ 0)
example: 1709932823238637
buffer_name:
type: string
description: >-
Buffer full name
example: 'irc.libera.#weechat'
command:
type: string
description: text or command to send
example: 'hello, world!'
required:
- command
example:
buffer_id: 1709932823238637
command: 'hello, world!'
CompletionBody:
description: Buffer and user text/command to complete
required: true
content:
application/json:
schema:
type: object
properties:
buffer_id:
type: integer
format: int64
description: Buffer identifier (≥ 0)
example: 1709932823238637
buffer_name:
type: string
description: >-
Buffer full name
example: 'irc.libera.#weechat'
command:
type: string
description: user command or text to complete
example: '/qu'
position:
type: integer
format: int32
description: Position in data (≥ 0)
example: 3
required:
- data
example:
buffer_id: 1709932823238637
command: '/qu'
PingBody:
description: Custom data that will be returned in the response
required: false
content:
application/json:
schema:
type: object
properties:
data:
type: string
example: 1714854355123456
SyncBody:
description: Synchronization parameters
required: false
content:
application/json:
schema:
type: object
properties:
sync:
type: boolean
description: Enable synchronization
example: true
nicks:
type: boolean
description: Receive nick updates in buffers
example: true
input:
type: boolean
description: Receive input changes in buffers (content and cursor position)
example: true
colors:
type: string
enum:
- ansi
- weechat
- strip
default: ansi
description: |
How to return strings with color codes:
* `ansi`: return ANSI color codes
* `weechat`: return WeeChat internal color codes
* `strip`: strip colors
securitySchemes:
password:
type: http
+4 -3
View File
@@ -504,7 +504,8 @@ relay_client_recv_text_buffer (struct t_relay_client *client,
if ((client->websocket == RELAY_CLIENT_WEBSOCKET_INITIALIZING)
|| (client->recv_data_type == RELAY_CLIENT_DATA_HTTP))
{
relay_http_recv (client, buffer + index);
relay_http_recv (client, buffer + index, length_buffer - index);
break;
}
else
{
@@ -582,7 +583,7 @@ relay_client_read_websocket_frames (struct t_relay_client *client,
if ((client->websocket == RELAY_CLIENT_WEBSOCKET_INITIALIZING)
|| (client->recv_data_type == RELAY_CLIENT_DATA_HTTP))
{
relay_http_recv (client, frames[i].payload);
relay_http_recv (client, frames[i].payload, frames[i].payload_size);
}
else if ((client->recv_data_type == RELAY_CLIENT_DATA_TEXT_LINE)
|| (client->recv_data_type == RELAY_CLIENT_DATA_TEXT_MULTILINE))
@@ -694,7 +695,7 @@ relay_client_recv_buffer (struct t_relay_client *client,
if ((client->websocket == RELAY_CLIENT_WEBSOCKET_INITIALIZING)
|| (client->recv_data_type == RELAY_CLIENT_DATA_HTTP))
{
relay_http_recv (client, buffer);
relay_http_recv (client, buffer, buffer_size);
}
else if ((client->recv_data_type == RELAY_CLIENT_DATA_TEXT_LINE)
|| (client->recv_data_type == RELAY_CLIENT_DATA_TEXT_MULTILINE))
+9 -4
View File
@@ -935,11 +935,13 @@ relay_http_process_request (struct t_relay_client *client)
*/
void
relay_http_recv (struct t_relay_client *client, const char *data)
relay_http_recv (struct t_relay_client *client, const char *data, int size)
{
char *new_partial, *pos;
char *new_partial, *pos, **null_char;
int length, ws_deflate_allowed;
null_char = memchr (data, 0, size);
if (client->partial_message)
{
new_partial = realloc (client->partial_message,
@@ -1003,8 +1005,11 @@ relay_http_recv (struct t_relay_client *client, const char *data)
relay_http_add_to_body (client->http_req, &(client->partial_message));
}
/* process the request if it's ready to be processed (all parsed) */
if (client->http_req->status == RELAY_HTTP_END)
/*
* process the request if it's ready to be processed (all parsed)
* or if we received a NULL char in the HTTP message (forbidden)
* */
if ((client->http_req->status == RELAY_HTTP_END) || null_char)
{
relay_http_process_request (client);
relay_http_request_reinit (client->http_req);
+4 -1
View File
@@ -40,6 +40,7 @@ enum t_relay_client_http_status
#define RELAY_HTTP_401_UNAUTHORIZED 401, "Unauthorized"
#define RELAY_HTTP_403_FORBIDDEN 403, "Forbidden"
#define RELAY_HTTP_404_NOT_FOUND 404, "Not Found"
#define RELAY_HTTP_405_METHOD_NOT_ALLOWED 405, "Method Not Allowed"
#define RELAY_HTTP_500_INTERNAL_SERVER_ERROR 500, "Internal Server Error"
#define RELAY_HTTP_503_SERVICE_UNAVAILABLE 503, "Service Unavailable"
@@ -53,6 +54,7 @@ enum t_relay_client_http_status
#define RELAY_HTTP_ERROR_INVALID_ITERATIONS "Invalid number of iterations"
#define RELAY_HTTP_ERROR_BAD_REQUEST "Bad request"
#define RELAY_HTTP_ERROR_NOT_FOUND "Resource not found"
#define RELAY_HTTP_ERROR_METHOD_NOT_ALLOWED "Method Not Allowed"
#define RELAY_HTTP_ERROR_OUT_OF_MEMORY "Out of memory"
struct t_relay_http_request
@@ -98,7 +100,8 @@ extern long relay_http_get_param_long (struct t_relay_http_request *request,
extern int relay_http_parse_method_path (struct t_relay_http_request *request,
const char *method_path);
extern int relay_http_check_auth (struct t_relay_client *client);
extern void relay_http_recv (struct t_relay_client *client, const char *data);
extern void relay_http_recv (struct t_relay_client *client,
const char *data, int size);
extern int relay_http_send (struct t_relay_client *client,
int return_code, const char *message,
const char *headers,
@@ -321,14 +321,23 @@ TEST(RelayApiProtocolWithClient, CbHandshake)
/* unknown password hash algorithm */
test_client_recv_http ("POST /api/handshake", NULL,
"{\"password_hash_algo\": [\"invalid\"]}");
STRCMP_EQUAL("HTTP/1.1 200 OK\r\n"
STRCMP_EQUAL("HTTP/1.1 400 Bad Request\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 74\r\n"
"Content-Length: 48\r\n"
"\r\n"
"{\"password_hash_algo\":null,"
"\"password_hash_iterations\":100000,"
"\"totp\":false}",
"{\"error\":\"Hash algorithm \\\"invalid\\\" not found\"}",
data_sent[0]);
/* invalid password hash algorithm */
test_client_recv_http ("POST /api/handshake", NULL,
"{\"password_hash_algo\": [{}]}");
STRCMP_EQUAL("HTTP/1.1 400 Bad Request\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 34\r\n"
"\r\n"
"{\"error\":\"Invalid hash algorithm\"}",
data_sent[0]);
/* two supported hash algorithms */
@@ -964,7 +973,7 @@ TEST(RelayApiProtocolWithClient, RecvJson)
TEST(RelayApiProtocolWithClient, RecvHttp404)
{
/* resource not found: error 404 */
test_client_recv_http ("GET / HTTP/1.1", NULL, NULL);
test_client_recv_http ("GET /", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -974,7 +983,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
data_sent[0]);
/* resource not found: error 404 */
test_client_recv_http ("GET /unknown HTTP/1.1", NULL, NULL);
test_client_recv_http ("GET /unknown", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -984,7 +993,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
data_sent[0]);
/* resource not found: error 404 */
test_client_recv_http ("GET /unknown/abc HTTP/1.1", NULL, NULL);
test_client_recv_http ("GET /unknown/abc", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -994,7 +1003,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
data_sent[0]);
/* resource not found: error 404 */
test_client_recv_http ("GET /api HTTP/1.1", NULL, NULL);
test_client_recv_http ("GET /api", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -1004,7 +1013,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
data_sent[0]);
/* resource not found: error 404 */
test_client_recv_http ("GET /api/unknown HTTP/1.1", NULL, NULL);
test_client_recv_http ("GET /api/unknown", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -1022,7 +1031,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
TEST(RelayApiProtocolWithClient, RecvHttpMissingPassword)
{
/* unauthorized: missing password */
test_client_recv_http_raw ("GET /api/version HTTP/1.1\r\n"
test_client_recv_http_raw ("GET /api/version\r\n"
"\r\n");
STRCMP_EQUAL("HTTP/1.1 401 Unauthorized\r\n"
"Access-Control-Allow-Origin: *\r\n"
@@ -1041,7 +1050,7 @@ TEST(RelayApiProtocolWithClient, RecvHttpMissingPassword)
TEST(RelayApiProtocolWithClient, RecvHttpInvalidPassword)
{
/* unauthorized: invalid password: "plain:invalid" */
test_client_recv_http_raw ("GET /api/version HTTP/1.1\r\n"
test_client_recv_http_raw ("GET /api/version\r\n"
"Authorization: Basic cGxhaW46aW52YWxpZA==\r\n"
"\r\n");
STRCMP_EQUAL("HTTP/1.1 401 Unauthorized\r\n"
@@ -1052,3 +1061,44 @@ TEST(RelayApiProtocolWithClient, RecvHttpInvalidPassword)
"{\"error\":\"Invalid password\"}",
data_sent[0]);
}
/*
* Tests functions:
* relay_api_protocol_recv_http (method not allowed)
*/
TEST(RelayApiProtocolWithClient, RecvHttpMethodNotAllowed)
{
/* method not allowed (PATCH) with existing resource (/api/ping) */
test_client_recv_http ("PATCH /api/ping", NULL, "{\"data\": \"abcdef\"}");
STRCMP_EQUAL("HTTP/1.1 405 Method Not Allowed\r\n"
"Allow: GET, POST, PUT, DELETE\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 30\r\n"
"\r\n"
"{\"error\":\"Method Not Allowed\"}",
data_sent[0]);
/* method not allowed (PATCH) with unknown resource (/api/unknown) */
test_client_recv_http ("PATCH /api/unknown", NULL, "{\"data\": \"abcdef\"}");
STRCMP_EQUAL("HTTP/1.1 405 Method Not Allowed\r\n"
"Allow: GET, POST, PUT, DELETE\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 30\r\n"
"\r\n"
"{\"error\":\"Method Not Allowed\"}",
data_sent[0]);
/* method not allowed (PATCH) with unknown resource (/unknown) */
test_client_recv_http ("PATCH /unknown", NULL, "{\"data\": \"abcdef\"}");
STRCMP_EQUAL("HTTP/1.1 405 Method Not Allowed\r\n"
"Allow: GET, POST, PUT, DELETE\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 30\r\n"
"\r\n"
"{\"error\":\"Method Not Allowed\"}",
data_sent[0]);
}
-89
View File
@@ -1,89 +0,0 @@
#!/bin/sh
#
# SPDX-FileCopyrightText: 2024-2025 Sébastien Helleu <flashcode@flashtux.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
# This file is part of WeeChat, the extensible chat client.
#
# WeeChat is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# WeeChat is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with WeeChat. If not, see <https://www.gnu.org/licenses/>.
#
#
# Test WeeChat relay HTTP REST API.
#
# Environment variables that can be used:
#
# RELAY_PASSWORD Password for WeeChat relay
#
set -o errexit
# default values for options from environment variables
default_relay_password="test"
usage ()
{
rc=$1
cat <<-EOF
Syntax: $0 url
url URL of the running WeeChat with relay api (without "/api")
Environment variables used:
RELAY_PASSWORD password for the relay (default: "${default_relay_password}")
Example:
RELAY_PASSWORD="test" $0 http://localhost:9000
EOF
exit "${rc}"
}
error_usage ()
{
echo >&2 "ERROR: $*"
usage 1
}
# ================================== START ==================================
# relay password
[ -z "${RELAY_PASSWORD}" ] && RELAY_PASSWORD="${default_relay_password}"
# check command line arguments
if [ $# -eq 0 ]; then
usage 0
fi
if [ $# -lt 1 ]; then
error_usage "missing arguments"
fi
# command line arguments
url="$1"
schemathesis run \
--checks all \
--show-trace \
--validate-schema=true \
--experimental=openapi-3.1 \
--base-url "${url}/api" \
--auth "plain:${RELAY_PASSWORD}" \
./src/plugins/relay/api/weechat-relay-api.yaml \
;
exit 0
+2 -2
View File
@@ -41,8 +41,8 @@
# devel-number the devel version as hex number ("0x04010000" for "4.1.0-dev")
#
weechat_stable="4.6.3"
weechat_devel="4.7.0-dev"
weechat_stable="4.7.0"
weechat_devel="4.7.0"
stable_major=$(echo "${weechat_stable}" | cut -d"." -f1)
stable_minor=$(echo "${weechat_stable}" | cut -d"." -f2)