SVN: установка свойств только для каталогов


В SVN есть ли способ задать свойства (bugtraq) для всех каталогов в дереве без проверки всего дерева?

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

Есть редкие проверки-но если я установлю глубину пустой для каждого каталога, то установка свойств рекурсивно не будет работать, даже если я вручную проверю каждый подкаталог.

Я мог бы проверить весь репозиторий и использовать Tortoise для рекурсивной установки свойств bugtraq в каталогах (по умолчанию они не применяются к файлам). Но это потребует, чтобы я проверил все хранилище только для этого.

Есть ли лучший способ сделать это, который я упускаю?

Правка:

Я попытался проверить весь репозиторий и изменить свойства в корень-но фиксация нарушила наш крюк предварительной фиксации: не может изменить свойства тегов. Без удаления крючка, похоже, мне придется вручную изменить свойства (на всем, кроме тегов).

2 3

2 ответа:

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

  1. Создайте текстовый файл с содержимым репозитория:

    Список Svn --глубина бесконечности https://myrepository.com/svn/path/to/root/directory > все.txt

  2. Урежьте его только до каталогов. Все каталоги будут заканчиваться косой чертой:

    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())