2

リポジトリ全体で、すべての絶対svn:externalsURLを相対URLに変換したいとします。

あるいは、svn:externalsドキュメントのヒント(「明示的なリビジョン番号の使用を真剣に検討する必要があります...」)に注意すると、リポジトリ全体の多くの場所で外部の新しいリビジョンを定期的にプルする必要がある場合があります。

多数のsvn:externalsプロパティをプログラムで更新するための最良の方法は何ですか?

私の解決策は以下に掲載されています。

4

1 に答える 1

4

svn:externals プロパティの 1 行からパーツを抽出するクラスは次のとおりです。

from urlparse import urlparse
import re
class SvnExternalsLine:
    '''Consult https://subversion.apache.org/docs/release-notes/1.5.html#externals for parsing algorithm.
    The old svn:externals format consists of:
        <local directory> [revision] <absolute remote URL>

    The NEW svn:externals format consists of:
        [revision] <absolute or relative remote URL> <local directory>

    Therefore, "relative" remote paths always come *after* the local path.
    One complication is the possibility of local paths with spaces.
    We just assume that the remote path cannot have spaces, and treat all other
    tokens (except the revision specifier) as part of the local path.
    '''

    REVISION_ARGUMENT_REGEXP = re.compile("-r(\d+)")

    def __init__(self, original_line):
        self.original_line = original_line

        self.pinned_revision_number = None
        self.repo_url = None
        self.local_pathname_components = []

        for token in self.original_line.split():

            revision_match = self.REVISION_ARGUMENT_REGEXP.match(token)
            if revision_match:
                self.pinned_revision_number = int(revision_match.group(1))
            elif urlparse(token).scheme or any(map(lambda p: token.startswith(p), ["^", "//", "/", "../"])):
                self.repo_url = token
            else:
                self.local_pathname_components.append(token)

    # ---------------------------------------------------------------------
    def constructLine(self):
        '''Reconstruct the externals line in the Subversion 1.5+ format'''

        tokens = []

        # Update the revision specifier if one existed
        if self.pinned_revision_number is not None:
            tokens.append( "-r%d" % (self.pinned_revision_number) )

        tokens.append( self.repo_url )
        tokens.extend( self.local_pathname_components )

        if self.repo_url is None:
            raise Exception("Found a bad externals property: %s; Original definition: %s" % (str(tokens), repr(self.original_line)))

        return " ".join(tokens)

ライブラリを使用してpysvn、svn:externals プロパティを持つすべてのディレクトリを再帰的に反復し、そのプロパティ値を改行で分割し、解析された .xml に従って各行に作用しますSvnExternalsLine

このプロセスは、リポジトリのローカル チェックアウトで実行する必要があります。pysvn( propget ) を使用して外部データを取得する方法は次のとおりです。

client.propget( "svn:externals", base_checkout_path, recurse=True)

この関数の戻り値を繰り返し処理し、各ディレクトリのプロパティを変更した後、

client.propset("svn:externals", new_externals_property, path)
于 2011-06-23T01:10:21.933 に答える