Форматирование Clearcase cleartool найти вывод
В контексте динамического "представления по умолчанию", когда я выполняю следующие команды:
$ cd Dir_A/Dir_B
$ ct find . -all -nvi -type f -ele 'brtype(my_branch)' -print
Для каждой строки я получаю странный вывод, который выглядит так:
/vobs/vob_name/Dir_A/Dir_B@@/main/Branch_A/Branch_B/n1/Dir_C/main/Branch_C/n2/Dir_D/main/Branch_D/n3/Filename@@
Как заставить команду find просто напечатать стандартный путь к операционной системе без всей промежуточной информации о версии для каждого каталога?
Я пытался -exec 'ct des -fmt'
безрезультатно.
1 ответ:
Этот странный формат называется расширенное имя пути.
Как объяснено здесь , результат такой:\proj_vob\foo.c@@\main\bugfix\4
На самом деле называется version-extended path name.
В вашем случае:
/vobs/vob_name/Dir_A/Dir_B@@/main/Branch_A/Dir_C/[...]/n3/Filename@@
- этоимя расширенного пути vob .
Он ссылается на элементы (файл или каталог), которые больше не видны в представлении (поскольку они были переименованы, то есть удалены).
Вы можете получить доступ к любому версия элемента, используя его идентификатор версии, который определяет его точное расположение в дереве версий.
, что позволяет получить доступ к версиям, которые не видны в представлении (т. е. выбраны спецификацией конфигурации представления), в котором вы выполняете
cleartool find
(так как представление является требованием для поиска).
Попробуйте также вариант
-nxname
:ct find . -all -nvi -nxname -type f -ele "brtype(my_branch)" -print
(но это уберет только окончательный
@@
)
Fmt_ccase имеет некоторый способ форматирования это, но вы также можете попробовать (как здесь):
-exec "echo %CLEARCASE_PN%"
(здесь это не работает, так как для найденной версии нет" имени пути": представление не выбирает его напрямую, так что версия не видна, и
%CLEARCASE_PN%
устанавливается в%CLEARCASE_XPN%
, расширенное имя пути).Проверьте также, что возвращает имя листа:
-exec "cleartool descr -fmt \"%Ln\" \"%CLEARCASE_XPN%\""
Но это возвращает только имя файла, а не его путь.
Если вам нужен простой путь (который не будет представлять собой "реальный" путь, потому что эти элементы не все видны в представлении), вам нужно будет обработать каждую строку, чтобы удалить
/main/.../n1
, оставив толькоDir_C\dir_D\element
.Вот одна библиотека, которая, как предполагается, сделает это: ClearCase-Tools
$explicitPath = '/vobTag/users/.@@/main/1/llf/main/12/install/main/1/README/main/2'; $canonPath = ClearCase::Vob::CanonPath->parse( $explicitPath ); $canonPath = $cpathObj->parse( $explicitPath );
Где
$canonPath
в этом примере будет содержать следующую строку:/vobTag/users/llf/install/README
Вы можете найти источникив этих rpm , в
usr/lib/perl5/vendor_perl/5.6.1/ClearCase/Vob/CanonPath.pm
.Реализация не тривиальна, но выполнима: очень мала выдержка:
push @branches, "main"; while (@leaves && !(($leaves[0] =~ "^[0-9]+\$") || ($leaves[0] =~ "^CHECKEDOUT\.[0-9]+\$"))) { $leaf = shift(@leaves); push @branches, $leaf if defined($leaf); $self->dpr("dump(3) $leaf") if defined($leaf); }