远程仓库中的trac-past-commit-hook
我正在尝试使用这个脚本来设置svn提交和trac的连接。
脚本调用没有问题,但这里有个问题:
144 repos = self.env.get_repository()
因为我是在远程调用,所以self.env_get_repository()会使用服务器的驱动器来查找仓库,而不是本地的驱动器映射。也就是说,它在找E:/Projects/svn/InfoProj,而不是Y:/Projects/svn/InfoProj。
我注意到trac上有一个更新,是为了能调用get_repository()并把路径作为变量传入,但似乎这个更新还没有包含在最新的稳定版本中。
这个版本的脚本(由code monkey提交的那个)似乎做得不一样,但抛出了一个相关的错误:
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'未定义
我第一次在Windows上设置trac,使用的是远程仓库。我用的是trac 0.11稳定版和Python 2.6。
我原以为会有很多人遇到跨服务器提交的问题,但我找了很久也没找到解决方案。我猜Linux在处理这个问题时会更优雅一些。
提前谢谢大家。
1 个回答
这完全是可以做到的,只需要几个小技巧...太棒了!
我遇到的问题是,get_repository 从 trac.ini 文件中读取 SVN 仓库的地址。这个地址指向了 E:/ 而不是 Y:/。解决这个问题的方法很简单,就是先检查一下仓库是否在 repository_dir 指定的位置,如果不在,再去检查一个新的变量 remote_repository_dir。解决方案的第二部分是去掉 cache.py 文件中检查当前仓库地址是否与传入地址匹配的错误提示。
像往常一样,使用这些方法要小心,记得提前备份所有内容!!!
首先打开你的 trac.ini 文件,在 'repository_dir' 变量下面添加一个新的变量 'remote_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))
警告!这样做会导致如果你的目录发生变化而需要重新同步时,不再给你错误提示。
希望这能帮助到某些人。