远程仓库中的trac-past-commit-hook

0 投票
1 回答
678 浏览
提问于 2025-04-15 12:58

我正在尝试使用这个脚本来设置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 个回答

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 文件大约第 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))

警告!这样做会导致如果你的目录发生变化而需要重新同步时,不再给你错误提示。

希望这能帮助到某些人。

撰写回答