Форматирование 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 2

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);
}