SVN: установка свойств только для каталогов
В SVN есть ли способ задать свойства (bugtraq) для всех каталогов в дереве без проверки всего дерева?
Я не могу установить свойства в репозитории напрямую, не устанавливая хуки. Даже если бы я мог, я не уверен, что это помогло бы - вы не можете установить рекурсивные свойства с Tortoise, и я подозреваю, что это не было бы просто с клиентом командной строки.
Есть редкие проверки-но если я установлю глубину пустой для каждого каталога, то установка свойств рекурсивно не будет работать, даже если я вручную проверю каждый подкаталог.
Я мог бы проверить весь репозиторий и использовать Tortoise для рекурсивной установки свойств bugtraq в каталогах (по умолчанию они не применяются к файлам). Но это потребует, чтобы я проверил все хранилище только для этого.
Есть ли лучший способ сделать это, который я упускаю?
Правка:
Я попытался проверить весь репозиторий и изменить свойства в корень-но фиксация нарушила наш крюк предварительной фиксации: не может изменить свойства тегов. Без удаления крючка, похоже, мне придется вручную изменить свойства (на всем, кроме тегов).
2 ответа:
Получение списка всех каталогов может быть хорошим первым шагом. Вот один из способов сделать это, фактически ничего не проверяя:
Создайте текстовый файл с содержимым репозитория:
Список Svn --глубина бесконечности https://myrepository.com/svn/path/to/root/directory > все.txt
Урежьте его только до каталогов. Все каталоги будут заканчиваться косой чертой:
Grep "/ $ " все.формат txt > just_directories.txt
В вашем случае вы захотите открыть его в текстовом редакторе и вытащить каталоги тегов, в которых задыхаются ваши крючки.
Поскольку вы проверили репозиторий, вы можете использовать этот файл непосредственно в качестве входных данных для операции propset:
svn propset myprop myvalue --targets just_directories.txt
Я хотел установить свойства непосредственно в версиях репозитория файлов, не проверяя их сначала, но это не сработало. Я добавлял к каждому имени каталога путь к хранилищу (https://myrepository.com/svn/path/to/root/directory ) и попробовал svn propset myprop mypropvalue --targets just_directories.txt но это дало ошибку: svn: установка свойства на нелокальную цель 'https://myrepository.com/svn/path/to/root/directory/subdir1 ' нуждается в базовой ревизии . Не уверен, что есть способ обойти это.
В итоге я написал сценарий, чтобы сделать это, используя привязки pysvn (которые очень просты в использовании). Она внизу, на случай, если кому-то понадобится.
import sys import os from optparse import OptionParser import pysvn import re usage = """%prog [path] property-name property-value Set property-name to property-value on all non-tag subdirectories in an svn working copy. path is an optional argument and defaults to "." """ class Usage(Exception): def __init__(self, msg): self.msg = msg def main(): try: parser = OptionParser(usage) (options, args) = parser.parse_args() if len(args) < 2: raise Usage("Must specify property-name and property-value") elif len(args) == 2: directory = "." property_name = args[0] property_value = args[1] elif len(args) == 3: directory = args[0] property_name = args[1] property_value = args[2] elif len(args) > 3: raise Usage("Too many arguments specified") print "Setting property %s to %s for non-tag subdirectories of %s" % (property_name, property_value, directory) client = pysvn.Client() for path_info in client.info2(directory): path = path_info[0] if path_info[1]["kind"] != pysvn.node_kind.dir: #print "Ignoring file directory: %s" % path continue remote_path = path_info[1]["URL"] if not re.search('(?i)(\/tags$)|(\/tags\/)', remote_path): print "%s" % path client.propset(property_name, property_value, path, depth=pysvn.depth.empty) else: print "Ignoring tag directory: %s" % path except Usage, err: parser.error(err.msg) return 2 if __name__ == "__main__": sys.exit(main())