如何在Mac OS X 10.8上安装hg convert所需的python subversion绑定?

时间:2013-01-26 15:40:07

标签: python macos svn mercurial

我正在寻找一个解决方案,最好是干净简单,以使hg convert能够在带有SVN存储库的OS X 10.8上工作。

目前,如果您尝试转换SVN存储库,则会出现could not load Subversion python bindings错误。

注意:Alex Martelli在另一个答案中建议为OS X安装CollabNet subversion发行版,但似乎最新的CollabNet版本无法安装在OS X 10.8上(安装程序锁定)。

4 个答案:

答案 0 :(得分:15)

使用自制程序

最简单的方法是从源代码安装subversion 使用homebrew--with-python标记。

首先,确保安装了命令行工具。随着小牛队 和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,但需要对小牛队进行调整并获得结果 单元测试失败;见Simon Wright’s answer to this question

是的 可以使用Apple版本的subversion源代码为Python构建subversion绑定。结果模块 将与所有系统库完全兼容并链接。然后hg convert将起作用。

以下是如何操作:

  1. subversion tarball

  2. 下载opensource.apple.com
  3. 打开包装并进行配置:

    cd subversion-52/subversion && ./configure
    
  4. 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

  5. 如果在最后一步中通过了单元测试,那么您现在可以完全正常运行 颠覆的Python绑定!如果您满意,请运行make install hg convert将开始工作。


  6. 通常情况下,重写构建系统更容易 划伤而不是找出现有的。

    Apple和Subversion的所有脚本确实使它复杂化,但您真正需要做的就是复制.py文件,使用公共代码构建共享库,然后构建每个C语言Python模块。确定要使用哪些包含文件和库是很简单的:尝试在没有任何包含或库的情况下开始构建它,并且当构建失败时,添加对导致构建失败的缺少包含路径或库的引用。棘手的部分是告诉像_core.so这样的C语言模块在哪里找到公共代码的动态库。

答案 1 :(得分:1)

使用MacPorts中的hg,我需要sudo port install subversion-python27bindings

答案 2 :(得分:1)

这是小牛队对andrewdotn's answer以上的更新。

在Mavericks下,/usr/lib(标准位置)中唯一的SVN动态库就是/usr/lib/libsvn_client-1.0.0.0.dylib。此库的内部名称(使用otool -L查找)告诉动态加载程序查找libsvn_client-1.0.dylib通常这也是/usr/lib中作为真实图书馆的符号链接。

试试这个:

  1. 在andrewdotn的Makefile中,修改LDFLAGS(第二行)说

    / Library / Developer / CommandLineTools / usr / lib / libsvn _ * - 1.0.dylib \

  2. 设置DYLD_LIBRARY_PATH

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

  3. 然后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;希望不是那么经常!

答案 3 :(得分:0)

您可以尝试使用带有subvertpy的hgsubversion而不是hg convert。