Bug 21080 - Всегда пишет в юникоде в pipe
Summary: Всегда пишет в юникоде в pipe
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: mpc (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Anton Farygin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-08-14 21:01 MSD by Slava Semushin
Modified: 2009-09-19 12:02 MSD (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Slava Semushin 2009-08-14 21:01:40 MSD
Обновился до mpc-0.16-alt1 и получил кракозябры, т.к. у меня локаль CP1251, а mpc выдаёт юникод.

Проверяется так: mpc | cat
Comment 1 Slava Semushin 2009-08-15 07:08:56 MSD
Хотел помочь найти проблемный коммит, но это оказалось непросто: сделал бранч на основе 0.12.0-alt1, посмотрел а в нём только спек. Оказывается в пакете с некоторых пор используются теги. Ок, с ними конечно я не очень умею работать, но попробую: сделал бранч на основе тегов 0.12.1 и 0.14 -- в этих версиях бага ещё нет. Далее надо бы проверить версии 0.15 и 0.16, но для них тегов нет, есть только сразу же последний -- 0.16-alt1

Плохо :(

Попробовал слить репо с официального сайта:

error: transfer closed with outstanding read data remaining (curl_result = 18, http_code = 200, sha1 = fd14fe69f586531ed231c0310c0c4f37f820eb44)
error: Unable to find 946c85ad837cbd90aaf1744291e2cd7c9dde74f5 under http://git.musicpd.org/cgit/master/mpc.git
Cannot obtain needed blob 946c85ad837cbd90aaf1744291e2cd7c9dde74f5
while processing commit 551a6949315dd1c0644ec7e7862e6bf6bca2587e.
fatal: Fetch failed.

Такие дела :-(
Comment 2 Slava Semushin 2009-08-15 07:29:53 MSD
Пришлось качать тарболлы с оффсайта. Дошел до 0.14 -- в нём баг уже есть. Почему он не проявился когда я из тегов собирал -- не знаю, может не то собрал. Короче, качаю тарболлы. Вот он ваш хвалёный гит и груповая разработка -- если не следить, то легче с тарболлами дело иметь.
Comment 3 Slava Semushin 2009-08-15 07:57:52 MSD
Ага, нашел! Сломалось между 0.14 и 0.15. Вот код из src/main.c:

	charset_init(command->pipe >= 0 || isatty(STDIN_FILENO),
		     isatty(STDOUT_FILENO));

И вот прототип этой ф-ции:

charset_init(bool enable_input, bool enable_output);

В моём случае, isatty(STDOUT_FILENO) возвращал 0, т.к. вывод шел не на терминал, а в pipe и перекодировка для выводимых данных отключалась. Это же касается не только данных, которые отправляются в pipe, но и при перенаправлении в файл, например.

Исправить можно, например, так (включает безусловную перекодировку выходных данных):

-	charset_init(command->pipe >= 0 || isatty(STDIN_FILENO),
-		     isatty(STDOUT_FILENO));
+ 	charset_init(command->pipe >= 0 || isatty(STDIN_FILENO), 1);

Сейчас отпишу автору насчет этого, что он скажет.
Comment 4 Slava Semushin 2009-08-15 08:03:03 MSD
P.S. Вышел 0.17, к слову.
Comment 5 Alexey Rusakov 2009-08-16 04:12:48 MSD
(В ответ на комментарий №1)
> Хотел помочь найти проблемный коммит, но это оказалось непросто: сделал бранч
> на основе 0.12.0-alt1, посмотрел а в нём только спек. Оказывается в пакете с
> некоторых пор используются теги.
Не теги, а бранчи. Учите гит, исходники апстрима лежат в отдельном бранче. Рекомендую также пользоваться средствами визуализации: giggle, gitg...
Comment 6 Alexey Rusakov 2009-08-16 04:14:28 MSD
Теперь что касается комментария №3:
> Исправить можно, например, так (включает безусловную перекодировку выходных
> данных):
> 
> -    charset_init(command->pipe >= 0 || isatty(STDIN_FILENO),
> -             isatty(STDOUT_FILENO));
> +     charset_init(command->pipe >= 0 || isatty(STDIN_FILENO), 1);
> 
> Сейчас отпишу автору насчет этого, что он скажет.
Не знаю, что вам помешало осилить гит хотя бы в виде веб-интерфейса http://git.musicpd.org/cgit/master/mpc.git , но автор там открытым текстом пишет о своих мотивах для того, чтобы так сделать. Почитайте лог коммита  d99be092. Я не уверен, что стоит откатывать этот коммит.
Comment 7 Slava Semushin 2009-08-16 11:44:59 MSD
(В ответ на комментарий №6)
> Почитайте лог коммита  d99be092. Я не уверен, что стоит откатывать этот коммит.

Почитал (http://git.musicpd.org/cgit/master/mpc.git/commit/?id=d99be092) -- вроде как пытались позаботиться о тех у кого локаль не юникодная, а в итоге лично мне стало от этого изменения только хуже.
Comment 8 Alexey Rusakov 2009-08-16 18:41:19 MSD
Что-то я не чувствую разницы между mpc ls и mpc ls | cat у себя на машине. Кодировку выставил ru_RU.CP1251
Comment 9 Alexey Rusakov 2009-08-16 18:43:45 MSD
Т.е. выглядит это в обоих случаях так:
Сурганова и оркестр
и так далее. У mpd, правда, стоит filesystem_charset utf8.
Comment 10 Slava Semushin 2009-08-16 18:49:46 MSD
(В ответ на комментарий №9)
> Т.е. выглядит это в обоих случаях так:
> Сурганова и оркестр
> и так далее. У mpd, правда, стоит filesystem_charset utf8.

У меня filesystem_charset "cp1251"
Comment 11 Alexey Rusakov 2009-08-19 01:46:53 MSD
(В ответ на комментарий №3)
> Сейчас отпишу автору насчет этого, что он скажет.
Автор что-нибудь ответил?
Comment 12 Slava Semushin 2009-08-19 06:08:50 MSD
(В ответ на комментарий №11)
> (В ответ на комментарий №3)
> > Сейчас отпишу автору насчет этого, что он скажет.
> Автор что-нибудь ответил?

Нет ещё.
Comment 13 Slava Semushin 2009-09-13 11:00:04 MSD
(В ответ на комментарий №12)
> Автор что-нибудь ответил?

Да. Вот его ответ:

"I have reverted that patch now, you have convinced me that it was a
bad idea."
Comment 15 Repository Robot 2009-09-15 02:02:37 MSD
mpc-0.17-alt2 -> sisyphus:

* Mon Sep 14 2009 Alexey Rusakov <ktirf@altlinux> 0.17-alt2

- revert "disable character set conversion to/from pipe" (ALT #21080).
Comment 16 Slava Semushin 2009-09-19 11:05:31 MSD
Чот не помогло.
Comment 17 Alexey Rusakov 2009-09-19 12:02:21 MSD
Ну, я даже не знаю, чем помочь. Можете взять мой гит и посмотреть, правильный ли коммит я накатил. Хотя мне показалось, что правильный.