ClearCase: поиск файлов, имеющих ровно одну конкретную метку и не более - PullRequest
6 голосов
/ 24 июня 2009

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

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

file1 LBL_A, LBL_B
file2 LBL_A

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

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

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

Jan

Ответы [ 3 ]

7 голосов
/ 24 июня 2009

Предполагая, что 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 использует это как разделитель.

6 голосов
/ 06 сентября 2009

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

cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print
2 голосов
/ 24 июня 2009

ответ 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: не отображать список all . В любом случае, если их больше одного, вам это не интересно!

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

 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"
...