5

hg convertOS X 10.8でSVNリポジトリを使用できるようにするための、できればクリーンでシンプルなソリューションを探しています。

現在、SVN リポジトリを変換しようとすると、could not load Subversion python bindingsエラーが発生します。

注: Alex Martelli は別の回答で、OS X 用の CollabNet サブバージョン ディストリビューションをインストールすることを推奨しましたが、最新の CollabNet バージョンは OS X 10.8 にインストールできないようです (インストーラーがロックします)。

4

4 に答える 4

15

自作を使用する

これを機能させる最も簡単な方法は、フラグsubversionを使用してソースからインストールすることです。homebrew--with-python

まず、コマンドライン ツールがインストールされていることを確認します。Mavericks と Xcode 5 ではcc、コマンド ライン ツールが完全にインストールされていなくても、ほとんどのコマンドは機能します。ディレクトリがない場合は/usr/include、最初に実行する必要があります

$ xcode-select --install

コマンドライン ツールをインストールしたら、次を実行します。

$ brew install subversion --with-python
$ mkdir -p ~/Library/Python/2.7/lib/python/site-packages
$ echo $(brew --cellar)/subversion/1.8.5/lib/svn-python \
    > ~/Library/Python/2.7/lib/python/site-packages/svn.pth

単体テストを実行してバインディングをテストできます。

$ svn co http://svn.apache.org/repos/asf/subversion/tags/1.8.5/subversion/bindings/swig/python/tests
$ cd tests && python run_all.py

Apple のソースコードを使用する

これは Mountain Lion では機能しますが、Mavericks では微調整が必​​要であり、単体テストに失敗します。この質問に対する Simon Wright の回答を参照してください。

Apple のバージョンの Subversion ソース コードを使用して、Python 用の Subversion バインディングを構築することができます。結果として得られるモジュールは完全に互換性があり、すべてのシステム ライブラリに対してリンクされます。そして、hg convertちょうど動作します。

方法は次のとおりです。

  1. opensource.apple.comからSubversion tarballをダウンロードします。

  2. 解凍して構成します。

    cd subversion-52/subversion && ./configure
    
  3. subversion/bindings/swig/python、先頭の空白をタブに変更して、この Makefile を追加します。

    SHELL = /bin/bash -eu
    
    CC = gcc -g -O2
    CFLAGS = -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK \
        -I ../proxy \
        -I ../../.. \
        -I ../../../include \
        -I /usr/include/apr-1 \
        -I libsvn_swig_py \
        -I /System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 \
    
    LDFLAGS = \
        /System/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib \
        /usr/lib/libsvn_*-1.0.dylib \
        /usr/lib/libapr-1.dylib \
    
    .PHONY: build egg test clean install
    
    test: egg
        mkdir -p tmp && cd tmp \
          && PYTHONPATH=../egg python -S -m svn.tests.run_all
    
    DESTDIR=$(HOME)/Library/Python/2.7/lib/python/site-packages
    install: egg
            mkdir -p "${DESTDIR}"
        rm -rf "$(DESTDIR)/svn.egg"
        cp -R egg "$(DESTDIR)/svn.egg"
        echo './svn.egg' > "$(DESTDIR)/svn.pth"
    
    egg: build
        rm -rf egg
        mkdir egg
        cp -R svn egg
        cp -R tests egg/svn
        touch egg/svn/tests/__init__.py
        mkdir egg/libsvn
        cp *.py egg/libsvn
        cp *.so *.dylib egg/libsvn
        # https://blogs.oracle.com/dipol/entry/dynamic_libraries_rpath_and_mac
        for F in egg/libsvn/*.so; do \
          install_name_tool -change libsvn_swig_py.dylib \
            '@loader_path/libsvn_swig_py.dylib' "$$F"; \
        done
        strip -x egg/libsvn/*.so
        touch egg/libsvn/__init__.py
        mkdir -p egg/EGG-INFO
        echo 'Version: 1.6.8' > egg/EGG-INFO/PKG-INFO
    
    build: libsvn_swig_py.dylib _client.so _core.so _delta.so _diff.so _fs.so _ra.so _repos.so _wc.so
    
    libsvn_swig_py.dylib:
        $(CC) $(CFLAGS) -shared -dynamic libsvn_swig_py/swigutil_py.c -o $@ $(LDFLAGS)
    
    _client.so: svn_client.c
    _core.so: core.c
    _delta.so: svn_delta.c
    _diff.so: svn_diff.c
    _fs.so: svn_fs.c
    _repos.so: svn_repos.c
    _wc.so: svn_wc.c
    
    _%.so: svn_%.c libsvn_swig_py.dylib
        $(CC) $(CFLAGS) -bundle $^ -o $@ $(LDFLAGS)
    _%.so: %.c libsvn_swig_py.dylib
        $(CC) $(CFLAGS) -bundle $^ -o $@ $(LDFLAGS)
    
    clean:
        rm -rf *.o *.so *.dylib *.dSYM
    

    次にmake、そのディレクトリで実行します。

  4. 最後のステップで単体テストに合格した場合は、subversion 用の完全に機能する Python バインディングが完成しました! make install満足したら 実行し、hg convert作業を開始します。


よくあることですが、既存のビルド システムを把握するよりも、ビルド システムをゼロから書き直す方が簡単でした。

Apple と Subversion のすべてのスクリプトは非常に複雑ですが、実際に行う必要があるのは、.pyファイルをコピーし、共通コードを使用して共有ライブラリを構築し、次に各 C 言語 Python モジュールを構築することだけです。どのインクルード ファイルとライブラリを使用するかを判断するのは簡単です。インクルードまたはライブラリを使用せずにビルドを開始し、ビルドが失敗した場合は、ビルドの失敗の原因となっている見つからないインクルード パスまたはライブラリへの参照を追加します。_core.so注意が必要なのは、C 言語モジュールに、共通コードの動的ライブラリの場所などを伝えることです。

于 2013-06-05T22:12:03.983 に答える
1

これは、上記の andrewdotn の回答に対する Mavericks の更新です。

Mavericks では、/usr/lib(標準的な場所) にある唯一の SVN 動的ライブラリは、たとえば/usr/lib/libsvn_client-1.0.0.0.dylib. このライブラリの内部名 (find using otool -L) は、ダイナミック ローダーに を探すように指示しますlibsvn_client-1.0.dylib通常/usr/lib、これは実際のライブラリへのシンボリック リンクとしても含まれます。

これを試して:

  1. andrewdotn'sで、 (2 行目) を次のMakefileように編集します。LDFLAGS

    /ライブラリ/Developer/CommandLineTools/usr/lib/libsvn_*-1.0.dylib \

  2. セットDYLD_LIBRARY_PATH:

    export DYLD_LIBRARY_PATH=/Library/Developer/CommandLineTools/usr/lib

それからmake。2 つのエラーが発生しました。

======================================================================
ERROR: test_get_pristine_copy_path (svn.tests.wc.SubversionWorkingCopyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "../egg/svn/tests/wc.py", line 192, in test_get_pristine_copy_path
    self.assertEqual(path_to_text_base, wc.get_pristine_copy_path(path_to_file))
  File "../egg/libsvn/wc.py", line 2447, in svn_wc_get_pristine_copy_path
    return apply(_wc.svn_wc_get_pristine_copy_path, args)
SubversionException: ("The node '/var/folders/_q/fvnxz46903z9hjh38fz0lyhm0000gs/T/tmp7vMRZu/foo' was not found.", 155010)

======================================================================
ERROR: test_lock (svn.tests.wc.SubversionWorkingCopyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "../egg/svn/tests/wc.py", line 48, in test_lock
    lock = wc.add_lock(self.path, core.svn_lock_create(core.Pool()), self.wc)
  File "../egg/libsvn/wc.py", line 2601, in svn_wc_add_lock
    return apply(_wc.svn_wc_add_lock, args)
SubversionException: ('sqlite: LOCK.lock_token may not be NULL', 200035)

----------------------------------------------------------------------

とにかくインストールして問題なく動作しhg convertました。

DYLD_LIBRARY_PATH実行する必要があるたびに、上記のように設定する必要があると思いますhg convert; うまくいけば、それほど頻繁ではありません!

于 2014-01-25T09:13:17.903 に答える
0

hg convert の代わりに、subvertpy で hgsubversion を使用してみてください。

于 2013-02-04T12:11:57.083 に答える