【问题标题】:How to install python subversion bindings needed by hg convert on Mac OS X 10.8?如何在 Mac OS X 10.8 上安装 hg convert 所需的 python 颠覆绑定?
【发布时间】:2013-01-10 09:36:35
【问题描述】:

我正在寻找一种解决方案,最好是简洁明了,以使 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 上安装(安装程序锁定)。

【问题讨论】:

    标签: python macos svn mercurial


    【解决方案1】:

    您可以尝试将 hgsubversion 与 subvertpy 一起使用,而不是 hg convert。

    【讨论】:

      【解决方案2】:

      使用自制软件

      最简单的方法是从源代码安装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
      

      使用苹果的源代码

      这适用于山狮,但需要对小牛队进行调整并导致 单元测试失败;见Simon Wright’s answer to this question

      这是 可以使用 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. 如果单元测试在最后一步通过,那么您现在拥有完整的功能 用于颠覆的 Python 绑定!如果您满意,请运行make install,然后 hg convert 将开始工作。


      通常情况下,从 从头开始而不是找出现有的。

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

      【讨论】:

      • install 目标可能需要-mkdir -p $(DESTDIR)。除此之外 - 太棒了!
      • @andrewdotn:先生,您是人类中的神。
      • @andrewdotn:非常感谢!
      • @SimonWright 请不要在没有先与我交谈的情况下对我的答案进行大量更改。如果您有更好的答案,请发布您自己的答案。如果您有任何问题或评论,请发表评论。谢谢。
      • @SimonWright Pull request 已打开,以便 brew install subversion --with-python 很快将成为 Just Work™ 和 bug reported upstream,以便它在未来可能只是 Just Work™。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这是 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:

          导出 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;希望不要那么频繁!

        【讨论】:

        • 您可以将-rpath /Library/Developer/CommandLineTools/usr 添加到LDFLAGS 以避免需要设置DYLD_LIBRARY_PATHdyld(1) man page 的结尾记录了 @loader_path/@executable_path/@rpath 不幸的几乎无法理解的东西。但是是的,测试仍然会失败:/ 从源代码安装 1.8.5 会生成通过单元测试的绑定,但是从源代码安装目前很痛苦。
        猜你喜欢
        • 2013-07-19
        • 1970-01-01
        • 2013-07-12
        • 2023-04-09
        • 2012-03-10
        • 2013-02-06
        • 2012-10-15
        • 2013-04-17
        • 1970-01-01
        相关资源
        最近更新 更多