0

このスクリプトを使用して、trac で svn commit を設定しようとしています。

問題なく呼び出されていますが、問題は次の行です。

144 repos = self.env.get_repository()

これをリモートで呼び出しているため、 self.env_get_repository() は、ローカル ドライブ マッピングではなく、サーバー ドライブを使用してリポジトリを検索します。つまり、Y:/Projects/sv/InfoProj ではなく、E:/Projects/svn/InfoProj を探しています。

get_repository() を呼び出してパスを変数として渡すことができるように設定されたtracの変更セットに気付きましたが、これはまだ最新の安定版リリースにはなっていないようです。

このバージョンのスクリプト(コード モンキーによって提出されたもの) は、動作が異なるように見えますが、関連すると思われるエラーをスローしています。

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 をセットアップしています。Python 2.6 で安定版の trac 0.11 を使用しています。

この問題に遭遇したサーバー間でコミットしようとしている人はもっとたくさんいると思いました。私は周りを見回しましたが、解決策を見つけることができませんでした。Linux には、これを処理するためのより適切な方法があると思います。

前もって感謝します。

4

1 に答える 1

0

これは完全に実行可能で、いくつかの小さなハックが必要なだけです...うわー!

私が抱えていた問題は、get_repository が trac.ini ファイルから svn リポジトリの値を読み取ることです。これは、Y:/ ではなく E:/ を指していました。簡単な修正では、リポジトリがrepository_dirにあるかどうかを確認し、そうでない場合は、新しい変数remote_repository_dirを確認します。修正の 2 番目の部分では、現在のリポジトリ アドレスが渡されたものと一致するかどうかを確認する cache.py からエラー メッセージを削除します。

いつものように、これは自己責任で使用し、事前にすべてをバックアップしてください!!!

最初に trac.ini ファイルを開き、新しい変数 'remote_repository_dir' を 'repository_dir' 変数の下に追加します。リモート リポジトリ 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 ファイルのアラートを削除する必要があります (これは最善の方法ではないことに注意してください。チェックの一部としてリモート変数を含めることができるはずですが、今のところは機能します)。

:97 付近の cache.py では、次のようになります。

    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))

警告!これを行うと、ディレクトリが変更され、再同期が必要な場合にエラーが発生しなくなります。

これが誰かに役立つことを願っています。

于 2009-07-22T01:52:00.367 に答える