ClearCase: поиск файлов, имеющих ровно одну конкретную метку и не более

Я хотел бы найти в ClearCase файлы, которые помечены определенной меткой, но не имеют других установленных меток.

Например, если у меня есть файлы, помеченные так:

file1 LBL_A, LBL_B
file2 LBL_A

Я хотел бы иметь запрос, который дает мне только file2, а не file1.

Есть ли способ сделать это с помощью cleartool find? Если это невозможно сделать с одним запросом, я также буду рад любым идеям, как сделать это в несколько шагов (я буду вызывать cleartool из сценария perl, поэтому будет легко сохранять списки файлов временно и запускать дальнейшие команды на них).

Заранее большое спасибо!

январь

3 ответа

Решение

Предполагая, что LBL_A является (единственной) меткой, которую вы хотите запустить

cleartool find /some/dir -version 'lbtype(LBL_A)' -print | xargs cleartool describe -fmt "%n: %l"

должен дать

file1: (LBL_A, LBL_B)
file2: (LBL_A)

в качестве вывода, который вы затем можете проверить в вашем Perl-скрипте или отфильтровать sed -n 's/\(.*\): (LBL_A)/\1/p' (при условии отсутствия двоеточий в именах файлов).

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

cleartool find ... -print | tr '\012' '\000' | xargs -0 cleartool ....

который переведет переводы строки в ascii null и затем Xargs использует это как разделитель.

Вы можете сделать это напрямую, без необходимости передавать:

cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print

Ответ hlovdal показывает, что в этом случае вам нужно найти больше элементов, чем вам нужно, и затем отфильтровать их (несмотря на все функции поиска ClearCase).

Замечания:

 cleartool find . -type f -element 'lbtype_sub(LBL_A)' -print

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

С помощью fmt_ccase вы можете настроить вывод так, чтобы получить именно то, что потребуется вашему сценарию perl:

 cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","
  • -fmt "%En %l\n" отобразит полный путь к элементу (вместо версии: / a / b / myFile @@ / main / myVersion) => /a/b/myFile'. the ' \ n` обеспечить один результат на строку.
  • -version а также -fmt "%n %l\n" будет отображать версию
  • \"$CLEARCASE_XPN\": двойные кавычки по расширенному пути найденной версии гарантируют, что файл с пробелами в его имени все еще будет работать.
  • grep -v ",": если есть запятая, это означает, что "более одного ярлыка"
  • %Cl: избегать отображения всего списка меток. В любом случае, если их больше одного, вам это не интересно!

Итак, для нахождения точной версии:

 cleartool find . -type f -version 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%n %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","|awk '{sub(/ \(.*/,"");print}'

Замечания:
Выше работает с синтаксисом Unix. Синтаксис Windows будет:

cleartool find . -type f -element "lbtype(LBL_A)" -exec "cleartool describe -fmt \"%n %Cl\n\" \"%CLEARCASE_XPN%\"" | grep -v "," | gawk "{gsub(/ \(.*,"");print}"

, который бы перечислял версию файлов только с одной (правильной) меткой.

  • awk '{sub(/ \(.*/,"");print}' преобразится myFile@@/main/myVersion (LBL_A) "в"myFile@@/main/myVersion"
Другие вопросы по тегам