SVN: установить свойства только для каталогов - PullRequest
3 голосов
/ 17 июля 2009

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

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

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

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

Есть ли лучший способ сделать это, что мне не хватает?

Edit:

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

Ответы [ 2 ]

4 голосов
/ 23 июля 2009

В итоге я написал скрипт для этого, используя привязки 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())
4 голосов
/ 18 июля 2009

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

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

    svn list --depth infinity https://myrepository.com/svn/path/to/root/directory> everything.txt

  2. Обрежьте это до только каталогов. Каталоги заканчиваются косой чертой:

    grep "/ $" everything.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' нуждается в базовой ревизии . Не уверен, есть ли способ обойти это.

...