2009-07-17 3 views
0

Попытка настроить svn commit с помощью trac с использованием сценария this.trac-past-commit-hook на удаленном репозитории

Он вызывается без проблем, но проблема эта линия здесь:

144 repos = self.env.get_repository() 

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

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

This version of the script (один представленный код обезьяны), как представляется, делать вещи по-разному, но бросает ошибку, которая, кажется, связанный:

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: «ул» объект не отозваны

10.3 stable version сценария бросает совершенно другая ошибка: Предупреждение: NameError: глобальное имя «ядро» не определен

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

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

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

+0

Согласно http://trac.edgewall.org/wiki/TracInstall#VersionControlSystem, Trac не поддерживает удаленные репозитории, будь то Linux или Windows, - это настоящая проблема здесь? –

+0

Hi Richard, Спасибо за ответ. Репозиторий находится в том же месте, что и trac, но фиксация выполняется удаленно. Не уверен, что это считается одним и тем же? – going

ответ

0

Это полностью готово и просто требуется несколько небольших хаков ... woo hoo!

Проблема, с которой я столкнулась, заключается в том, что 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) 

F вам нужно будет удалить предупреждение в файле 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 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)) 

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

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

Смежные вопросы