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

5 投票
4 回答
3658 浏览
提问于 2025-04-17 13:45

我在寻找一个解决方案,希望能简单明了,让 hg convert 在 OS X 10.8 上能够处理 SVN 仓库。

现在,如果你尝试转换一个 SVN 仓库,就会出现 could not load Subversion python bindings 的错误。

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

4 个回答

1

这是对Mavericks系统的一个更新,针对andrewdotn的回答

在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

然后运行make。我遇到了两个错误:

======================================================================
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运行得很好。

我怀疑每次运行hg convert时都需要像上面那样设置DYLD_LIBRARY_PATH;希望你不需要太频繁地这样做!

1

我在用MacPorts安装hg的时候,需要输入这个命令:sudo port install subversion-python27bindings

15

使用 Homebrew

想要顺利安装,最简单的方法就是通过homebrew来从源代码安装subversion,并加上--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

使用苹果的源代码

这个方法在 Mountain Lion 上有效,但在 Mavericks 上需要一些调整,并且可能会导致单元测试失败;可以参考Simon Wright 对这个问题的回答

你可以使用苹果版本的 subversion 源代码来构建 Python 的绑定。这样生成的模块会完全兼容,并且可以链接到所有系统库。然后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. 如果上一步的单元测试通过了,你现在就有了完全功能的 Python 绑定!如果满意,就运行make install,这样hg convert就可以开始工作了。


像往常一样,重写构建系统比搞清楚现有的系统要简单得多。

苹果和 Subversion 的所有脚本让事情变得复杂,但其实你只需要复制.py文件,构建一个包含公共代码的共享库,然后为每个 C 语言的 Python 模块构建。弄清楚要用哪些包含文件和库很简单:尝试从不包含任何文件或库开始构建,当构建失败时,添加缺失的包含路径或库的引用。比较棘手的是告诉 C 语言模块像_core.so在哪里找到公共代码的动态库。

撰写回答