如何在Mac OS X 10.8上安装hg转换所需的Python Subversion绑定?

5
我正在寻找一种解决方案,最好是干净简单的方法,以便在OS X 10.8上使用SVN存储库启用。
目前,如果您尝试转换SVN存储库,则会出现错误。
注意:Alex Martelli在另一个答案中建议安装CollabNet subversion distribution for OS X,但似乎最新的CollabNet版本无法安装在OS X 10.8上(安装程序被锁定)。
4个回答

15

使用Homebrew

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

首先确保您已经安装了命令行工具。在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的subversion绑定。生成的模块将与所有系统库完全兼容并链接。然后hg convert就能正常工作了。

以下是具体步骤:

  1. opensource.apple.com下载subversion tarball

  2. 解压缩并进行配置:

    cd subversion-52/subversion && ./configure
    
    subversion/bindings/swig/python 目录下,添加此 Makefile,并确保将前导空格更改为制表符:
  3. 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

    如果单元测试在上一步中通过,则现在您拥有完全功能的Subversion Python绑定! 如果您满意,请运行make install,然后hg convert将开始工作。


    常常情况下,从头重写构建系统比弄清现有的构建系统更容易。

    所有来自苹果和Subversion的脚本确实使它变得复杂,但您实际上只需要复制.py文件,使用共同代码构建共享库,然后构建每个C语言Python模块。找出要使用哪些包含文件和库很简单:尝试从没有任何包含或库开始构建它,当构建失败时,添加对导致构建失败的缺失包含路径或库的引用即可。棘手的部分是告诉像_core.so这样的C语言模块在哪里找到公共代码的动态库。


“install”目标可能需要“-mkdir -p $(DESTDIR)”命令。除此之外,非常好! - Simon Wright
1
@SimonWright 请在未经与我沟通的情况下不要对我的答案进行大规模更改。如果您有更好的答案,请发布您自己的答案。如果您有问题或评论,请发表评论。谢谢。 - andrewdotn
@SimonWright已经提交了Pull request,以便brew install subversion --with-python很快就可以正常工作,并且已经向上游报告了错误,以便将来可能会自动正常工作。 - andrewdotn
好的,你的回答(其中包括获取苹果版本的Subversion代码,而不是使用brew,不管那是什么 :))需要进行一个小的(不是大规模的)更改才能在Mavericks上运行。我没有一个更好的答案。你的回答(删除后的部分)已经很好了。但是我不应该用“我”来代替其他人认为是你在说话。抱歉。 - Simon Wright
没有错误信息,我只是得到了苹果崩溃转储界面。git show-ref 命令无法工作。 - Ian Gilham
显示剩余5条评论

1
这是 Mavericks 的更新,用于上面 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

然后运行 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 也能正常工作。
我猜想每次运行 hg convert 都需要设置如上所述的 DYLD_LIBRARY_PATH,但希望不会太频繁。

你可以在LDFLAGS中添加-rpath /Library/Developer/CommandLineTools/usr,以避免需要设置DYLD_LIBRARY_PATHdyld(1) man page的末尾记录了@loader_path/@executable_path/@rpath等内容,但不幸的是几乎无法理解。但是,测试仍将失败:/从源代码安装1.8.5会生成通过单元测试的绑定,但是从源代码安装目前很麻烦。 - andrewdotn

1
使用来自MacPorts的hg,我需要sudo port install subversion-python27bindings

0

你可以尝试使用hgsubversion和subvertpy代替hg convert。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接