trac-past-commit-hook на удаленном репозитории

Попытка настроить фиксацию svn с помощью trac с помощью этот скрипт.

Он вызывается без проблем, но проблема в этой строке:

144 repos = self.env.get_repository()

Поскольку я вызываю это удаленно, self.env_get_repository () ищет репозиторий, используя диск сервера, а не сопоставление локального диска. То есть ищет E: / Projects / svn / InfoProj, а не Y: / Projects / sv / InfoProj

Я заметил набор изменений в наборе трассировки для возможности вызова get_repository () и передачи path в качестве переменной, но похоже, что это еще не вошло в последний стабильный выпуск.

Эта версия скрипта (тот, который был отправлен кодовой обезьяной), похоже, работает по-другому, но выдает ошибку, которая кажется связанной:

154         if url is None:
155             url = self.env.config.get('project', 'url')
156         self.env.href = Href(url)
157         self.env.abs_href = Href(url)

Строки 156/157 выдают ошибку: Предупреждение: TypeError: объект 'str' не может быть вызван

стабильная версия 10.3 скрипта выдает совершенно другую ошибку: Предупреждение: NameError: глобальное имя 'core' не определено

Я впервые настраиваю trac на ящик Windows с удаленным репозиторием. Я использую trac 0.11 stable с Python 2.6.

Я думал, что было бы намного больше людей, пытающихся выполнить фиксацию через серверы, которые столкнулись с этой проблемой. Я осмотрелся и не нашел решения. Я полагаю, что у Linux есть более изящный способ справиться с этим.

Заранее спасибо.


person going    schedule 17.07.2009    source источник
comment
Согласно trac.edgewall.org/wiki/TracInstall#VersionControlSystem, Trac не поддержка удаленных репозиториев, будь то Linux или Windows - вот в чем настоящая проблема?   -  person Richard Dunlap    schedule 18.07.2009
comment
Привет, Ричард, Спасибо за ответ. Репозиторий находится там же, где и trac, но фиксация выполняется удаленно. Не уверены, что это одно и то же?   -  person going    schedule 18.07.2009


Ответы (1)


Это вполне выполнимо, и для этого потребуется всего лишь пара небольших приемов ... у-у-у!

Проблема, с которой я столкнулся, заключалась в том, что get_repository считывает значение репозитория svn из файла trac.ini. Это указывало на E: /, а не на Y: /. Простое исправление включает в себя проверку того, находится ли репозиторий в repository_dir, а если нет, то проверьте новую переменную remote_repository_dir. Вторая часть исправления включает удаление сообщения об ошибке из cache.py, которое проверяет, совпадает ли текущий адрес репозитория с переданным.

Как всегда, используйте это на свой страх и риск и заранее сделайте резервную копию !!!

Сначала откройте файл trac.ini и добавьте новую переменную remote_repository_dir под переменной repository_dir. Каталог удаленного репозитория будет указывать на подключенный диск на вашем локальном компьютере. Теперь это должно выглядеть примерно так:

repository_dir = E:/Projects/svn/InfoProj
remote_repository_dir = Y:/Projects/svn/InfoProj 

Затем мы изменим файл api.py, чтобы проверить наличие новой переменной, если она не может найти репозиторий в расположении repository_dir. Вокруг: 71 у вас должно получиться что-то вроде этого:

repository_dir = Option('trac', 'repository_dir', '',
    """Path to local repository. This can also be a relative path
    (''since 0.11'').""")

Под этой строкой добавьте:

remote_repository_dir = Option('trac', 'remote_repository_dir', '',
    """Path to remote repository.""")   

Рядом с: 156 у вас будет это:

            rtype, rdir = self.repository_type, self.repository_dir
            if not os.path.isabs(rdir):
                rdir = os.path.join(self.env.path, rdir)

Измените это на это:

            rtype, rdir = self.repository_type, self.repository_dir
            if not os.path.isdir(rdir):
                rdir = self.remote_repository_dir
            if not os.path.isabs(rdir):
                rdir = os.path.join(self.env.path, rdir)

Наконец, вам нужно будет удалить предупреждение в файле cache.py (обратите внимание, что это не лучший способ сделать это, вы должны иметь возможность включить удаленную переменную как часть проверки, но пока она работает).

В cache.py рядом с: 97 это должно выглядеть так:

    if repository_dir:
        # directory part of the repo name can vary on case insensitive fs
        if os.path.normcase(repository_dir) != os.path.normcase(self.name):
            self.log.info("'repository_dir' has changed from %r to %r"
                          % (repository_dir, self.name))
            raise TracError(_("The 'repository_dir' has changed, a "
                              "'trac-admin resync' operation is needed."))
    elif repository_dir is None: # 
        self.log.info('Storing initial "repository_dir": %s' % self.name)
        cursor.execute("INSERT INTO system (name,value) VALUES (%s,%s)",
                       (CACHE_REPOSITORY_DIR, self.name,))
    else: # 'repository_dir' cleared by a resync
        self.log.info('Resetting "repository_dir": %s' % self.name)
        cursor.execute("UPDATE system SET value=%s WHERE name=%s",
                       (self.name, CACHE_REPOSITORY_DIR))

Мы собираемся удалить первую часть оператора if, чтобы он выглядел так:

    if repository_dir is None: # 
        self.log.info('Storing initial "repository_dir": %s' % self.name)
        cursor.execute("INSERT INTO system (name,value) VALUES (%s,%s)",
                       (CACHE_REPOSITORY_DIR, self.name,))
    else: # 'repository_dir' cleared by a resync
        self.log.info('Resetting "repository_dir": %s' % self.name)
        cursor.execute("UPDATE system SET value=%s WHERE name=%s",
                       (self.name, CACHE_REPOSITORY_DIR))

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

Надеюсь, это кому-то поможет.

person going    schedule 22.07.2009