我正在寻找一种解决方案,最好是干净和简单,使hg convert
能够在带有SVN存储库的OSX10.8上工作。
目前,如果你尝试转换一个SVN仓库,你会得到一个could not load Subversion python bindings
错误。
注: Alex Martelli在另一个答案中建议为OS X安装CollabNet subversion发行版,但似乎最新的CollabNet版本不能安装在OS X 10.8上(安装程序锁定)。
发布于 2013-06-06 06:12:04
使用自制软件
最简单的方法是使用homebrew
和--with-python
标志从源代码安装subversion
。
首先,确保安装了命令行工具。在Mavericks和Xcode5中,即使命令行工具没有完全安装,像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’s answer to this question。
可以使用Apple版本的subversion源代码构建Python的subversion绑定。生成的模块将完全兼容并链接到所有系统库。然后hg convert
就能正常工作了。
下面是如何做的:
cd subversion-52/subversion && ./configure
subversion/bindings/swig/python
,添加此Makefile,确保将前导空格更改为制表符:SHELL = /bin/bash -eu CC = gcc -g -O2 CFLAGS = -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK \ -I ../proxy \ -I ../../..\lib../include\ -I /usr/include/apr-1 \ -I libsvn_swig_py \ -I lib\ 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:构建DESTDIR=$(HOME)/Library/Python/2.7/lib/python/site-packages测试干净安装测试: egg mkdir -p tmp && cd tmp \ && PYTHONPATH=../egg python -S -m svn.tests.run_all 1.dylib安装: 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测试egg/svn touch egg/svn/-R/__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‘版本: 1.6.8’>EGG/EGG-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) $(文件标签) -shared -dynamic libsvn_swigutil_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 $(CC) $(CFLAGS) -bundle $^ -o $@ $(LDFLAGS) _%.so:%.c libsvn_swig_py.dylib $(CC) $(CFLAGS) -bundle $^ -o $@ $(LDFLAGS) clean: rm -rf *.o *.so *.dylib *.dSYM
然后在上一步中通过单元测试的directory.
make
,您现在就拥有了subversion的全功能Python绑定!如果你愿意,就运行make install
,hg convert
就会开始工作。与通常的情况一样,从头开始重写构建系统要比弄清楚现有的构建系统更容易。
来自苹果和Subversion的所有脚本都使它变得复杂,但您真正需要做的就是复制.py
文件,使用公共代码构建一个共享库,然后构建每个C语言Python模块。确定要使用哪些包含文件和库很简单:尝试在不包含任何包含或库的情况下开始构建,当构建失败时,添加对导致构建失败的缺少的包含路径或库的引用。棘手的部分是告诉像_core.so
这样的C语言模块在哪里可以找到通用代码的动态库。
发布于 2013-06-27 12:37:54
使用来自MacPorts的hg,我需要sudo port install subversion-python27bindings
。
发布于 2014-01-25 17:13:18
这是小牛对上面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
中作为指向真实库的符号链接。
试试这个:
Makefile
中,将LDFLAGS
(第二行)编辑为/Library/Developer/CommandLineTools/usr/lib/libsvn_*-1.0.dylib \
DYLD_LIBRARY_PATH
:导出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
;希望不是那么频繁!
https://stackoverflow.com/questions/14538468
复制相似问题