Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 103 additions & 39 deletions src/cmd/Классы/КомандаOpm_List.os
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
КомандаПриложения.Опция("q quiet", Ложь, """Тихий"" режим вывода без лишних сообщений.");
КомандаПриложения.Опция("r remote", Ложь, "Вывести список пакетов в хабе");
КомандаПриложения.Опция("a all", Ложь, "Вывести список всех пакетов установленных и доступных в хабе");
КомандаПриложения.Опция("p path", Ложь, "Выводить путь к пакетам");
КомандаПриложения.Опция("l local", Ложь, "Вывести список пакетов, установленных локально в текущий каталог");

КонецПроцедуры

Expand All @@ -17,6 +19,8 @@
ВыводВсехПакетов = КомандаПриложения.ЗначениеОпции("all");
ВыводПакетовНаХабе = КомандаПриложения.ЗначениеОпции("remote") ИЛИ ВыводВсехПакетов;
ВыводУстановленныхПакетов = НЕ КомандаПриложения.ЗначениеОпции("remote") ИЛИ ВыводВсехПакетов;
ВыводЛокальныхПакетов = КомандаПриложения.ЗначениеОпции("local");
ВыводитьПутьКПакетам = КомандаПриложения.ЗначениеОпции("path");

Если ВыводВсехПакетов Тогда

Expand All @@ -30,20 +34,23 @@

МенеджерПолучения = Новый МенеджерПолученияПакетов();
ДоступныеПакеты = МенеджерПолучения.ПолучитьДоступныеПакеты();

ПутьККаталогуПакетов = ПолучитьЗначениеСистемнойНастройки("lib.system");
КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(ПутьККаталогуПакетов);

КаталогПоиска = ?(ВыводЛокальныхПакетов,
ОбъединитьПути(ТекущийКаталог(), КонстантыOpm.ЛокальныйКаталогУстановкиПакетов),
"");
КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогПоиска);
УстановленныеПакеты = КэшУстановленныхПакетов.ПолучитьУстановленныеПакеты();

Если НЕ ТихийРежим Тогда
Сообщить(ТекстСообщения);
КонецЕсли;

Пакеты = Новый ТаблицаЗначений();
Пакеты.Колонки.Добавить("ИмяПакета");
Пакеты.Колонки.Добавить("ИменаСерверов");
Пакеты.Колонки.Добавить("Версия");
Пакеты.Колонки.Добавить("Выводить");
Пакеты.Колонки.Добавить("ИмяПакета", , "Пакет");
Пакеты.Колонки.Добавить("ИменаСерверов", , "Имена серверов");
Пакеты.Колонки.Добавить("Версия", , "Версия");
Пакеты.Колонки.Добавить("Выводить", , "");
Пакеты.Колонки.Добавить("КаталогПакета", , ?(ВыводитьПутьКПакетам, "Каталог пакета", ""));

Для Каждого ДоступныйПакет Из ДоступныеПакеты Цикл

Expand All @@ -62,25 +69,27 @@
КонецЦикла;

Для Каждого УстановленныйПакет Из УстановленныеПакеты Цикл

ИмяПакета = УстановленныйПакет.Ключ;
ОписаниеПакета = УстановленныйПакет.Значение.МетаданныеПакета;
Версия = "<НЕТ>";
Если ТипЗнч(ОписаниеПакета) <> Тип("Булево") Тогда
Версия = ОписаниеПакета.Свойства().Версия;
КонецЕсли;

ДобавленныйПакет = Пакеты.НайтиСтроки(Новый Структура("ИмяПакета", ИмяПакета));
Если ДобавленныйПакет.Количество() Тогда
ДобавленныйПакет[0].Версия = Версия;
ДобавленныйПакет[0].Выводить = ИСТИНА; // Пакет есть и на хабе и локально, стоит вывести
Продолжить;
ДобавленныйПакет = Пакеты.НайтиСтроки(Новый Структура("ИмяПакета", ИмяПакета));
Если ЗначениеЗаполнено(ДобавленныйПакет) Тогда
ИнфоОПакете = ДобавленныйПакет[0];
ИнфоОПакете.Выводить = Истина; // Пакет есть и на хабе и локально, стоит вывести
Иначе
ИнфоОПакете = Пакеты.Добавить();
ИнфоОПакете.ИмяПакета = ИмяПакета;
ИнфоОПакете.Выводить = ВыводУстановленныхПакетов;
ИнфоОПакете.ИменаСерверов = "Локальный";
КонецЕсли;

ИнфоОПакете = Пакеты.Добавить();
ИнфоОПакете.ИмяПакета = ИмяПакета;

ИнфоОПакете.Версия = Версия;
ИнфоОПакете.ИменаСерверов = "Локальный";
ИнфоОПакете.Выводить = ВыводУстановленныхПакетов;
ИнфоОПакете.КаталогПакета = УстановленныйПакет.Значение.КаталогПакета;

КонецЦикла;

Expand All @@ -94,53 +103,108 @@

КонецПроцедуры

Процедура ВывестиИнформациюОПакетах(Пакеты)

ДлинаИмени = СтрДлина("Пакет");
ДлинаИменСерверов = СтрДлина("Имена серверов");
ДлинаВерсии = СтрДлина("Версия");
Процедура ВывестиИнформациюОПакетах(Знач Пакеты)

Длины = Новый Массив;
Для НомерКолонки = 0 По Пакеты.Колонки.Количество() - 1 Цикл
Длины.Добавить(СтрДлина(Пакеты.Колонки[НомерКолонки].Заголовок));
КонецЦикла;

Для Каждого ИнфоОПакете Из Пакеты Цикл

Если НЕ ИнфоОПакете.Выводить Тогда
Продолжить;
КонецЕсли;

ДлинаИмени = Макс(СтрДлина(ИнфоОПакете.ИмяПакета), ДлинаИмени);
ДлинаВерсии = Макс(СтрДлина(ИнфоОПакете.Версия), ДлинаВерсии);
ДлинаИменСерверов = Макс(СтрДлина(ИнфоОПакете.ИменаСерверов), ДлинаИменСерверов);
Для НомерКолонки = 0 По Пакеты.Колонки.Количество() - 1 Цикл

Колонка = Пакеты.Колонки[НомерКолонки];
Если ЗначениеЗаполнено(Колонка.Заголовок) Тогда
Длины[НомерКолонки] = Макс(СтрДлина(ИнфоОПакете[Колонка.Имя]), Длины[НомерКолонки]);
КонецЕсли;

КонецЦикла;

КонецЦикла;

ВывестиШапкуИнфо(ДлинаИмени, ДлинаВерсии, ДлинаИменСерверов);
ВывестиШапкуИнфо(Пакеты, Длины);
Для Каждого ИнфоОПакете Из Пакеты Цикл

Если НЕ ИнфоОПакете.Выводить Тогда
Продолжить;
КонецЕсли;

ВывестиСтрокуИнфо(ДлинаИмени, ИнфоОПакете.ИмяПакета, ДлинаВерсии, ИнфоОПакете.Версия, ДлинаИменСерверов, ИнфоОПакете.ИменаСерверов);
ВывестиСтрокуИнфо(ИнфоОПакете, Длины);

КонецЦикла;
ВывестиШапкуИнфо(ДлинаИмени, ДлинаВерсии, ДлинаИменСерверов);
ВывестиШапкуИнфо(Пакеты, Длины);

КонецПроцедуры

Процедура ВывестиШапкуИнфо(ДлинаИмени, ДлинаВерсии, ДлинаИменСерверов)
Процедура ВывестиШапкуИнфо(Знач Пакеты, Знач Длины)

ПодстрокаРазделитель = " |";

ОбщаяДлина = 0;
Для Каждого мДлина Из Длины Цикл

Если мДлина <> 0 Тогда
ОбщаяДлина = ОбщаяДлина + мДлина + СтрДлина(ПодстрокаРазделитель);
КонецЕсли;

КонецЦикла;

ПустаяСтрока = " ";
Сообщить(СтрЗаменить(Лев(ПустаяСтрока, ДлинаИмени + ДлинаВерсии + ДлинаИменСерверов + 6), " ", "-"));
ВывестиСтрокуИнфо(ДлинаИмени, "Пакет", ДлинаВерсии, "Версия", ДлинаИменСерверов, "Имена серверов");
Сообщить(СтрЗаменить(Лев(ПустаяСтрока, ДлинаИмени + ДлинаВерсии + ДлинаИменСерверов + 6), " ", "-"));
ПустаяСтрока = ШаблоннаяСтрока(" ", ОбщаяДлина);
СтрокаОтрез = ШаблоннаяСтрока("-", ОбщаяДлина);
Сообщить(СтрокаОтрез);

ПодстрокиСообщения = Новый Массив;
Для НомерКолонки = 0 По Пакеты.Колонки.Количество() - 1 Цикл

Колонка = Пакеты.Колонки[НомерКолонки];
Если ЗначениеЗаполнено(Колонка.Заголовок) Тогда
КоличествоСимволовДобора = Длины[НомерКолонки] - СтрДлина(Колонка.Заголовок);
ПодстрокиСообщения.Добавить(Колонка.Заголовок + Лев(ПустаяСтрока, КоличествоСимволовДобора));
КонецЕсли;

КонецЦикла;
Сообщить(СтрСоединить(ПодстрокиСообщения, ПодстрокаРазделитель));
Сообщить(СтрокаОтрез);

КонецПроцедуры

Процедура ВывестиСтрокуИнфо(ДлинаИмени, ИмяПакета, ДлинаВерсии, Версия, ДлинаИменСерверов, ИменаСерверов)
Процедура ВывестиСтрокуИнфо(Знач ИнфоОПакете, Знач Длины)

Пакеты = ИнфоОПакете.Владелец();

ПодстрокаРазделитель = " |";

ОбщаяДлина = 0;
Для Каждого мДлина Из Длины Цикл

Если мДлина <> 0 Тогда
ОбщаяДлина = ОбщаяДлина + мДлина + СтрДлина(ПодстрокаРазделитель);
КонецЕсли;

ПустаяСтрока = " ";
Шаблон = "%1" + Лев(ПустаяСтрока, ДлинаИмени - СтрДлина(ИмяПакета))
+ " | %2" + Лев(ПустаяСтрока, ДлинаВерсии - СтрДлина(Версия))
+ " | %3" + Лев(ПустаяСтрока, ДлинаИменСерверов - СтрДлина(ИменаСерверов));
Сообщить(СтрШаблон(Шаблон, ИмяПакета, Версия, ИменаСерверов));
КонецЦикла;

ПустаяСтрока = ШаблоннаяСтрока(" ", ОбщаяДлина);

ПодстрокиСообщения = Новый Массив;
Для НомерКолонки = 0 По Пакеты.Колонки.Количество() - 1 Цикл

Колонка = Пакеты.Колонки[НомерКолонки];
Если ЗначениеЗаполнено(Колонка.Заголовок) Тогда
ВыводимоеЗначение = Строка(ИнфоОПакете[Колонка.Имя]);
КоличествоСимволовДобора = Длины[НомерКолонки] - СтрДлина(ВыводимоеЗначение);
ПодстрокиСообщения.Добавить(ВыводимоеЗначение + Лев(ПустаяСтрока, КоличествоСимволовДобора));
КонецЕсли;

КонецЦикла;
Сообщить(СтрСоединить(ПодстрокиСообщения, ПодстрокаРазделитель));

КонецПроцедуры

Функция ШаблоннаяСтрока(Знач Символ, Знач Длина)
Возврат СтрСоединить(Новый Массив(Длина), Символ);
КонецФункции
Loading