远程存储库上的trac-past-commit-hook

时间:2009-07-17 02:00:32

标签: python windows svn trac

尝试使用this脚本使用trac设置svn提交。

它被称为没有问题,但问题是这一行:

144 repos = self.env.get_repository()

因为我正在远程调用self.env_get_repository()使用服务器驱动器而不是本地驱动器映射来查找存储库。也就是说,它正在寻找E:/ Projects / svn / InfoProj而不是Y:/ Projects / sv / InfoProj

我注意到trac集上有一个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:'str'对象不可调用

脚本的10.3 stable version会抛出完全不同的错误: 警告:NameError:未定义全局名称“core”

我是第一次在带有远程存储库的Windows机器上设置trac。我在Python 2.6中使用了trac 0.11 stable。

我认为会有更多的人尝试在遇到这个问题的服务器上提交。我环顾四周,无法找到解决方案。我认为Linux有一种更优雅的方式来处理它。

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是完全可行的,只需要几个小黑客......哇哇!

我遇到的问题是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 near: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))

警告!这样做意味着如果您的目录已更改并且您需要重新同步,它将不再为您提供错误。

希望这有助于某人。