Bug 40826 - aptitude показывает только первую строчку в описании
Summary: aptitude показывает только первую строчку в описании
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: aptitude (show other bugs)
Version: unstable
Hardware: x86 Linux
: P5 normal
Assignee: Gleb F-Malinovskiy
QA Contact: qa-sisyphus
URL:
Keywords: regression
Depends on:
Blocks:
 
Reported: 2021-08-30 05:22 MSK by Roman Yakovlev
Modified: 2023-06-08 17:47 MSK (History)
6 users (show)

See Also:


Attachments
aptitude desc (90.93 KB, image/png)
2021-08-30 05:22 MSK, Roman Yakovlev
no flags Details
Патч для починки многострочного описания (522 bytes, patch)
2023-05-07 22:37 MSK, Anton Golubev
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Roman Yakovlev 2021-08-30 05:22:33 MSK
Created attachment 9624 [details]
aptitude desc

В aptitude tui в десятом альте показывает только первую строчку в описании программы. В девятом показывало нормально, все строчки.

Также в поиске в aptitude уже несколько лет сломан backspace.
Comment 1 Sek 2022-03-27 20:24:54 MSK
Никто не знает, как это исправить? :(
Comment 2 Anton Golubev 2023-05-07 22:37:40 MSK
Created attachment 13139 [details]
Патч для починки многострочного описания

Почему-то в форматирующую функцию make_level_fragment передаётся значение indent=1, что, судя по документации к функции является количеством пробелов слева в данной строке. Если в строке пробелов меньше, то форматирование "фрагмента" заканчивается. Поскольку почти всегда первая строка описания не имеет пробелов вначале, форматирование на ней и заканчивается.

Данный патч чинит это, функция вызывается с indent=0, и форматируется всё описание.
Comment 3 Anton Golubev 2023-05-07 22:58:53 MSK
(Ответ для Roman Yakovlev на комментарий #0)

> Также в поиске в aptitude уже несколько лет сломан backspace.

Кстати обратил внимание, что при запуске через tmux проблем с backspace в поиске нет.
Comment 4 Ivan Zakharyaschev 2023-05-24 06:45:29 MSK
(Ответ для Anton Golubev на комментарий #3)
> (Ответ для Roman Yakovlev на комментарий #0)
> 
> > Также в поиске в aptitude уже несколько лет сломан backspace.
> 
> Кстати обратил внимание, что при запуске через tmux проблем с backspace в
> поиске нет.

Не стоит смешивать две разные проблемы. Лучше завести про backspace отдельный багрепорт с подробным описанием, как воспроизвести.
Comment 5 Ivan Zakharyaschev 2023-05-24 12:18:42 MSK
(Ответ для Anton Golubev на комментарий #2)
> Создано вложение 13139 [details] [подробности]
> Патч для починки многострочного описания
> 
> Почему-то в форматирующую функцию make_level_fragment передаётся значение
> indent=1, что, судя по документации к функции является количеством пробелов
> слева в данной строке. Если в строке пробелов меньше, то форматирование
> "фрагмента" заканчивается. Поскольку почти всегда первая строка описания не
> имеет пробелов вначале, форматирование на ней и заканчивается.
> 
> Данный патч чинит это, функция вызывается с indent=0, и форматируется всё
> описание.

Спасибо сообщившему об ошибке и за предложенный патч!

Это место в aptitude не менялось. Причина в другом.

После http://git.altlinux.org/gears/a/apt.git?p=apt.git;a=commitdiff;h=1ebe1d7079b5f12f0fa145e18ed60eb30660ad2e
формат LongDesc() в apt ещё дальше отклонился от дебиановского. Думаю, сейчас сближу его обратно.

diff --git a/apt-pkg/rpm/rpmrecords.cc b/apt-pkg/rpm/rpmrecords.cc
index 3e21b03..1e8a857 100644
--- a/apt-pkg/rpm/rpmrecords.cc
+++ b/apt-pkg/rpm/rpmrecords.cc
@@ -114,42 +114,7 @@ string rpmRecordParser::ShortDesc()
 /* */
 string rpmRecordParser::LongDesc()
 {
-   char *str, *ret, *x, *y;
-   rpm_tagtype_t type;
-   rpm_count_t count;
-   int len;
-   assert(HeaderP != NULL);
-   int rc = headerGetEntry(HeaderP, RPMTAG_DESCRIPTION,
-			   &type, (void**)&str, &count);
-   if (rc != 1)
-      return "";
-
-   // Count size plus number of newlines
-   for (x = str, len = 0; *x; x++, len++)
-      if (*x == '\n')
-	 len++;
-
-   ret = (char*)malloc(len+1);
-   if (ret == NULL)
-      return "out of mem";
-
-   // Copy string, inserting a space after each newline
-   for (x = str, y = ret; *x; x++, y++)
-   {
-      *y = *x;
-      if (*x == '\n')
-	 *++y = ' ';
-   }
-   *y = 0;
-
-   // Remove spaces and newlines from end of string
-   for (y--; y > ret && (*y == ' ' || *y == '\n'); y--)
-      *y = 0;
-
-   string Ret = string(ret);
-   free(ret);
-
-   return Ret;
+   return Handler->Description();
 }
 									/*}}}*/
 // RecordParser::Changelog - Return package changelog if any		/*{{{*/


* * *

Это отражается и на выводе описания через packagekit:

# LC_ALL=C pkcon get-details apt
Package description
  package:     apt-0.5.15lorg2-alt82:p10+306076.60.5.1@1668092323.x86_64
  summary:     Debian's Advanced Packaging Tool with RPM support
  license:     unknown
  group:       admin-tools
  description: r at least for Conectiva. It provides the apt-get utility that rovides a simpler, safer way to install and upgrade packages. PT features complete installation ordering, multiple source apability and several other unique features. This package is still under development.
  size:        368814 bytes
  url:         

LC_ALL=C rpm -qi apt покажет отрезанные символы и строчку:

Summary     : Debian's Advanced Packaging Tool with RPM support
Description :
A port of Debian's APT tools for RPM based distributions,
or at least for Conectiva. It provides the apt-get utility that
provides a simpler, safer way to install and upgrade packages.
APT features complete installation ordering, multiple source
capability and several other unique features.

This package is still under development.

* * *

Только synaptic оказался более готовым к особому формату в случае apt-rpm, но ценой неоптимального line-wrapping для своего окна:

static char *parseDescription(const string &descr)
{

   if (descr.size() + 1 > size_t(descrBufferSize)) {
      delete[] descrBuffer;
      descrBufferSize = descr.size() + 1;
      descrBuffer = new char[descrBufferSize];
   }
#ifdef HAVE_RPM
   int parser = _config->FindI("Synaptic::descriptionParser", NO_PARSER);
#else
   int parser = _config->FindI("Synaptic::descriptionParser", DEB_PARSER);
#endif
   switch (parser) {
      case DEB_PARSER:
         return debParser(descr);
      case STRIP_WS_PARSER:
         return stripWsParser(descr);
      case RPM_PARSER:
         return rpmParser(descr);
      case NO_PARSER:
      default:
         strcpy(descrBuffer, descr.c_str());
         return descrBuffer;
   }
}
Comment 6 Ivan Zakharyaschev 2023-05-24 20:24:36 MSK
Парсеры для этого формата есть и в synaptic, и в packagekit (там с особым вниманием и даже ссылкой на описание формата). apt-cache show не нуждается в том, чтобы это обрабатывать, потому что готовит вывод сама, беря информацию "напрямую".

http://git.altlinux.org/gears/s/synaptic.git?p=synaptic.git;a=blob;f=synaptic/common/rpackage.cc;h=ba9c3bae22f6cdfe414adc019b772be143a99d63;hb=HEAD#l1058

http://git.altlinux.org/gears/p/packagekit.git?p=packagekit.git;a=blob;f=backends/aptcc/apt-cache-file.cpp;h=b98a242239bfdfbad5a09786881627e326b65cc0;hb=HEAD#l566

// Policy page on package descriptions
// http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description
Comment 7 Ivan Zakharyaschev 2023-05-24 20:29:44 MSK
Можно было бы эти парсеры сделать более терпимыми к тому случаю, когда последующие строчки не начинаются с пробела (сейчас они удаляют, не проверяя, что это действительно пробел), но большого смысла в этом не вижу, потому что они ещё и удаляют первую строчку безусловно (в отличие от aptitude). И тут сделать их на будущее на всякий случай более совместимыми с нашим нынешним случаем так просто невозможно.
Comment 8 Ivan Zakharyaschev 2023-05-24 20:41:18 MSK
(Ответ для Ivan Zakharyaschev на комментарий #6)
> Парсеры для этого формата есть и в synaptic, и в packagekit (там с особым
> вниманием и даже ссылкой на описание формата). apt-cache show не нуждается в
> том, чтобы это обрабатывать, потому что готовит вывод сама, беря информацию
> "напрямую".
> 
> http://git.altlinux.org/gears/s/synaptic.git?p=synaptic.git;a=blob;
> f=synaptic/common/rpackage.cc;h=ba9c3bae22f6cdfe414adc019b772be143a99d63;
> hb=HEAD#l1058
> 
> http://git.altlinux.org/gears/p/packagekit.git?p=packagekit.git;a=blob;
> f=backends/aptcc/apt-cache-file.cpp;
> h=b98a242239bfdfbad5a09786881627e326b65cc0;hb=HEAD#l566
> 
> // Policy page on package descriptions
> //
> http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description

https://www.debian.org/doc/debian-policy/ch-controlfields.html#description
Comment 9 Anton Golubev 2023-05-29 09:43:33 MSK
Да, теперь я вижу, в дебиан "спеках" в description обязательны пробелы в начале строк, например https://github.com/pioneerspacesim/pioneer/blob/master/debian/control

Но в rpm такого нет, стоит ли поддерживать это соглашение? Что aptitude, что synaptic, кажется, безнадёжно отошли от апстрима.

Удаление костыля из string rpmRecordParser::LongDesc() выглядит приятно.
Comment 10 Repository Robot 2023-06-08 01:45:33 MSK
apt-0.5.15lorg2-alt84 -> sisyphus:

 Fri Jun 02 2023 Ivan Zakharyaschev <imz@altlinux> 0.5.15lorg2-alt84
 - Fixed the display of descriptions in aptitude and packagekit (by making
   the format closer to Debian's):
   + Fixed the display of the first line, which was not shown in packagekit.
   + Fixed the regression (from 0.5.15lorg2-alt72) in the display of
     all but the first lines (in aptitude and packagekit). (ALT#40826)
   + This has also made packagekit show translated descriptions. (ALT#46251)
   + As a result, there is a cosmetic regression in synaptic: extra blanks.
 - Increased the buf for reading to 32k for effectiveness in methods:
   gzip (and other compression types), rsh, ftp.
 - Avoid compilation errors with GCC 13 (thx Alexey Sheplyakov). (ALT#46105)
Comment 11 Ivan Zakharyaschev 2023-06-08 17:47:46 MSK
(Ответ для Anton Golubev на комментарий #9)
> Да, теперь я вижу, в дебиан "спеках" в description обязательны пробелы в
> начале строк, например
> https://github.com/pioneerspacesim/pioneer/blob/master/debian/control
> 
> Но в rpm такого нет, стоит ли поддерживать это соглашение? Что aptitude, что
> synaptic, кажется, безнадёжно отошли от апстрима.

В большей степени остались в состоянии старой версии, чем расширены нашими добавками, я бы сказал. Ещё есть packagekit, и всякий такой код, в том числе новый, будет от apt этого ожидать, так что решил приблизить к Debian (может, ещё сильнее дальше, ради разметки "параграфов", отделённых пустыми строками).