diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Opm_List.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Opm_List.os" index 229ce70..b695b87 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Opm_List.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Opm_List.os" @@ -8,6 +8,8 @@ КомандаПриложения.Опция("q quiet", Ложь, """Тихий"" режим вывода без лишних сообщений."); КомандаПриложения.Опция("r remote", Ложь, "Вывести список пакетов в хабе"); КомандаПриложения.Опция("a all", Ложь, "Вывести список всех пакетов установленных и доступных в хабе"); + КомандаПриложения.Опция("p path", Ложь, "Выводить путь к пакетам"); + КомандаПриложения.Опция("l local", Ложь, "Вывести список пакетов, установленных локально в текущий каталог"); КонецПроцедуры @@ -17,6 +19,8 @@ ВыводВсехПакетов = КомандаПриложения.ЗначениеОпции("all"); ВыводПакетовНаХабе = КомандаПриложения.ЗначениеОпции("remote") ИЛИ ВыводВсехПакетов; ВыводУстановленныхПакетов = НЕ КомандаПриложения.ЗначениеОпции("remote") ИЛИ ВыводВсехПакетов; + ВыводЛокальныхПакетов = КомандаПриложения.ЗначениеОпции("local"); + ВыводитьПутьКПакетам = КомандаПриложения.ЗначениеОпции("path"); Если ВыводВсехПакетов Тогда @@ -30,9 +34,11 @@ МенеджерПолучения = Новый МенеджерПолученияПакетов(); ДоступныеПакеты = МенеджерПолучения.ПолучитьДоступныеПакеты(); - - ПутьККаталогуПакетов = ПолучитьЗначениеСистемнойНастройки("lib.system"); - КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(ПутьККаталогуПакетов); + + КаталогПоиска = ?(ВыводЛокальныхПакетов, + ОбъединитьПути(ТекущийКаталог(), КонстантыOpm.ЛокальныйКаталогУстановкиПакетов), + ""); + КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогПоиска); УстановленныеПакеты = КэшУстановленныхПакетов.ПолучитьУстановленныеПакеты(); Если НЕ ТихийРежим Тогда @@ -40,10 +46,11 @@ КонецЕсли; Пакеты = Новый ТаблицаЗначений(); - Пакеты.Колонки.Добавить("ИмяПакета"); - Пакеты.Колонки.Добавить("ИменаСерверов"); - Пакеты.Колонки.Добавить("Версия"); - Пакеты.Колонки.Добавить("Выводить"); + Пакеты.Колонки.Добавить("ИмяПакета", , "Пакет"); + Пакеты.Колонки.Добавить("ИменаСерверов", , "Имена серверов"); + Пакеты.Колонки.Добавить("Версия", , "Версия"); + Пакеты.Колонки.Добавить("Выводить", , ""); + Пакеты.Колонки.Добавить("КаталогПакета", , ?(ВыводитьПутьКПакетам, "Каталог пакета", "")); Для Каждого ДоступныйПакет Из ДоступныеПакеты Цикл @@ -62,6 +69,7 @@ КонецЦикла; Для Каждого УстановленныйПакет Из УстановленныеПакеты Цикл + ИмяПакета = УстановленныйПакет.Ключ; ОписаниеПакета = УстановленныйПакет.Значение.МетаданныеПакета; Версия = "<НЕТ>"; @@ -69,18 +77,19 @@ Версия = ОписаниеПакета.Свойства().Версия; КонецЕсли; - ДобавленныйПакет = Пакеты.НайтиСтроки(Новый Структура("ИмяПакета", ИмяПакета)); - Если ДобавленныйПакет.Количество() Тогда - ДобавленныйПакет[0].Версия = Версия; - ДобавленныйПакет[0].Выводить = ИСТИНА; // Пакет есть и на хабе и локально, стоит вывести - Продолжить; + ДобавленныйПакет = Пакеты.НайтиСтроки(Новый Структура("ИмяПакета", ИмяПакета)); + Если ЗначениеЗаполнено(ДобавленныйПакет) Тогда + ИнфоОПакете = ДобавленныйПакет[0]; + ИнфоОПакете.Выводить = Истина; // Пакет есть и на хабе и локально, стоит вывести + Иначе + ИнфоОПакете = Пакеты.Добавить(); + ИнфоОПакете.ИмяПакета = ИмяПакета; + ИнфоОПакете.Выводить = ВыводУстановленныхПакетов; + ИнфоОПакете.ИменаСерверов = "Локальный"; КонецЕсли; - - ИнфоОПакете = Пакеты.Добавить(); - ИнфоОПакете.ИмяПакета = ИмяПакета; + ИнфоОПакете.Версия = Версия; - ИнфоОПакете.ИменаСерверов = "Локальный"; - ИнфоОПакете.Выводить = ВыводУстановленныхПакетов; + ИнфоОПакете.КаталогПакета = УстановленныйПакет.Значение.КаталогПакета; КонецЦикла; @@ -94,11 +103,12 @@ КонецПроцедуры -Процедура ВывестиИнформациюОПакетах(Пакеты) - - ДлинаИмени = СтрДлина("Пакет"); - ДлинаИменСерверов = СтрДлина("Имена серверов"); - ДлинаВерсии = СтрДлина("Версия"); +Процедура ВывестиИнформациюОПакетах(Знач Пакеты) + + Длины = Новый Массив; + Для НомерКолонки = 0 По Пакеты.Колонки.Количество() - 1 Цикл + Длины.Добавить(СтрДлина(Пакеты.Колонки[НомерКолонки].Заголовок)); + КонецЦикла; Для Каждого ИнфоОПакете Из Пакеты Цикл @@ -106,41 +116,95 @@ Продолжить; КонецЕсли; - ДлинаИмени = Макс(СтрДлина(ИнфоОПакете.ИмяПакета), ДлинаИмени); - ДлинаВерсии = Макс(СтрДлина(ИнфоОПакете.Версия), ДлинаВерсии); - ДлинаИменСерверов = Макс(СтрДлина(ИнфоОПакете.ИменаСерверов), ДлинаИменСерверов); + Для НомерКолонки = 0 По Пакеты.Колонки.Количество() - 1 Цикл + + Колонка = Пакеты.Колонки[НомерКолонки]; + Если ЗначениеЗаполнено(Колонка.Заголовок) Тогда + Длины[НомерКолонки] = Макс(СтрДлина(ИнфоОПакете[Колонка.Имя]), Длины[НомерКолонки]); + КонецЕсли; + + КонецЦикла; КонецЦикла; - ВывестиШапкуИнфо(ДлинаИмени, ДлинаВерсии, ДлинаИменСерверов); + ВывестиШапкуИнфо(Пакеты, Длины); Для Каждого ИнфоОПакете Из Пакеты Цикл Если НЕ ИнфоОПакете.Выводить Тогда Продолжить; КонецЕсли; - ВывестиСтрокуИнфо(ДлинаИмени, ИнфоОПакете.ИмяПакета, ДлинаВерсии, ИнфоОПакете.Версия, ДлинаИменСерверов, ИнфоОПакете.ИменаСерверов); + ВывестиСтрокуИнфо(ИнфоОПакете, Длины); КонецЦикла; - ВывестиШапкуИнфо(ДлинаИмени, ДлинаВерсии, ДлинаИменСерверов); + ВывестиШапкуИнфо(Пакеты, Длины); КонецПроцедуры -Процедура ВывестиШапкуИнфо(ДлинаИмени, ДлинаВерсии, ДлинаИменСерверов) +Процедура ВывестиШапкуИнфо(Знач Пакеты, Знач Длины) + + ПодстрокаРазделитель = " |"; + + ОбщаяДлина = 0; + Для Каждого мДлина Из Длины Цикл + + Если мДлина <> 0 Тогда + ОбщаяДлина = ОбщаяДлина + мДлина + СтрДлина(ПодстрокаРазделитель); + КонецЕсли; + + КонецЦикла; - ПустаяСтрока = " "; - Сообщить(СтрЗаменить(Лев(ПустаяСтрока, ДлинаИмени + ДлинаВерсии + ДлинаИменСерверов + 6), " ", "-")); - ВывестиСтрокуИнфо(ДлинаИмени, "Пакет", ДлинаВерсии, "Версия", ДлинаИменСерверов, "Имена серверов"); - Сообщить(СтрЗаменить(Лев(ПустаяСтрока, ДлинаИмени + ДлинаВерсии + ДлинаИменСерверов + 6), " ", "-")); + ПустаяСтрока = ШаблоннаяСтрока(" ", ОбщаяДлина); + СтрокаОтрез = ШаблоннаяСтрока("-", ОбщаяДлина); + Сообщить(СтрокаОтрез); + + ПодстрокиСообщения = Новый Массив; + Для НомерКолонки = 0 По Пакеты.Колонки.Количество() - 1 Цикл + + Колонка = Пакеты.Колонки[НомерКолонки]; + Если ЗначениеЗаполнено(Колонка.Заголовок) Тогда + КоличествоСимволовДобора = Длины[НомерКолонки] - СтрДлина(Колонка.Заголовок); + ПодстрокиСообщения.Добавить(Колонка.Заголовок + Лев(ПустаяСтрока, КоличествоСимволовДобора)); + КонецЕсли; + + КонецЦикла; + Сообщить(СтрСоединить(ПодстрокиСообщения, ПодстрокаРазделитель)); + Сообщить(СтрокаОтрез); КонецПроцедуры -Процедура ВывестиСтрокуИнфо(ДлинаИмени, ИмяПакета, ДлинаВерсии, Версия, ДлинаИменСерверов, ИменаСерверов) +Процедура ВывестиСтрокуИнфо(Знач ИнфоОПакете, Знач Длины) + + Пакеты = ИнфоОПакете.Владелец(); + + ПодстрокаРазделитель = " |"; + + ОбщаяДлина = 0; + Для Каждого мДлина Из Длины Цикл + + Если мДлина <> 0 Тогда + ОбщаяДлина = ОбщаяДлина + мДлина + СтрДлина(ПодстрокаРазделитель); + КонецЕсли; - ПустаяСтрока = " "; - Шаблон = "%1" + Лев(ПустаяСтрока, ДлинаИмени - СтрДлина(ИмяПакета)) - + " | %2" + Лев(ПустаяСтрока, ДлинаВерсии - СтрДлина(Версия)) - + " | %3" + Лев(ПустаяСтрока, ДлинаИменСерверов - СтрДлина(ИменаСерверов)); - Сообщить(СтрШаблон(Шаблон, ИмяПакета, Версия, ИменаСерверов)); + КонецЦикла; + + ПустаяСтрока = ШаблоннаяСтрока(" ", ОбщаяДлина); + + ПодстрокиСообщения = Новый Массив; + Для НомерКолонки = 0 По Пакеты.Колонки.Количество() - 1 Цикл + Колонка = Пакеты.Колонки[НомерКолонки]; + Если ЗначениеЗаполнено(Колонка.Заголовок) Тогда + ВыводимоеЗначение = Строка(ИнфоОПакете[Колонка.Имя]); + КоличествоСимволовДобора = Длины[НомерКолонки] - СтрДлина(ВыводимоеЗначение); + ПодстрокиСообщения.Добавить(ВыводимоеЗначение + Лев(ПустаяСтрока, КоличествоСимволовДобора)); + КонецЕсли; + + КонецЦикла; + Сообщить(СтрСоединить(ПодстрокиСообщения, ПодстрокаРазделитель)); + КонецПроцедуры + +Функция ШаблоннаяСтрока(Знач Символ, Знач Длина) + Возврат СтрСоединить(Новый Массив(Длина), Символ); +КонецФункции