Форматирование вывода Clearcase cleartool find

В контексте динамического «представления по умолчанию», когда я запускаю следующие команды:

$ 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', но безуспешно.


person ThomasMcLeod    schedule 11.07.2013    source источник


Ответы (1)


Этот странный формат называется расширенным путем.
Как объяснено здесь, результат будет примерно таким:

\proj_vob\foo.c@@\main\bugfix\4

на самом деле называется путем с расширенной версией.

В твоем случае:

/vobs/vob_name/Dir_A/Dir_B@@/main/Branch_A/Dir_C/[...]/n3/Filename@@

- это расширенный путь vob.

Он ссылается на элементы (файл или каталог), которые больше не видны в представлении (поскольку они были названы rm, которые удаляются).

Вы можете получить доступ к любой версии элемента, используя его идентификатор версии, который указывает его точное расположение в дереве версий.

Это позволяет получить доступ к версиям, которые не видны в представлении (т.е. выбраны спецификацией конфигурации представления), в которых вы выполняете 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%, расширенное имя пути ).

Также проверьте, что возвращает имя Leaf:

-exec "cleartool  descr -fmt \"%Ln\" \"%CLEARCASE_XPN%\""

Но это возвращает только имя файла, а не его путь.


Если вам нужен простой путь (который не будет представлять «фактический» путь, потому что не все эти элементы видны в представлении), вам нужно будет обработать каждую строку, чтобы удалить /main/.../n1, оставив только Dir_C\dir_D\element.

Вот одна библиотека, которая должна это делать: Инструменты ClearCase

 $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);
}
person VonC    schedule 11.07.2013
comment
Первая команда возвращает тот же расширенный путь с информацией о версии, прикрепленной к промежуточным каталогам. Вторая команда возвращает имя файла без пути. Мне просто нужен путь к ОС для каждого элемента. Я не понимаю, почему это так сложно. - person ThomasMcLeod; 11.07.2013
comment
@ThomasMcLeod это так сложно, потому что find -all будет просматривать всю историю всех vobs, что означает, что результаты не будут видны / доступны из представления (отсюда расширенный путь, который фактически доступен из любого динамического представления). Доступный означает, что если вы выполните тип \ простой \ путь \ результат, он вернет значение «не найдено». Эти результаты не видны непосредственно в представлении. Я отредактировал ответ, чтобы добавить больше информации. - person VonC; 11.07.2013
comment
Спасибо за подробный ответ. - person ThomasMcLeod; 11.07.2013