目前,如果您尝试转换SVN存储库,则会出现错误。
注意:Alex Martelli在另一个答案中建议安装CollabNet subversion distribution for OS X,但似乎最新的CollabNet版本无法安装在OS X 10.8上(安装程序被锁定)。
最简单的方法是使用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
就能正常工作了。
以下是具体步骤:
解压缩并进行配置:
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 ../../.. \
-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语言模块在哪里找到公共代码的动态库。
/usr/lib
(标准位置)中唯一的 SVN 动态库是例如 /usr/lib/libsvn_client-1.0.0.0.dylib
。该库的内部名称(使用 otool -L
查找)告诉动态加载器查找 libsvn_client-1.0.dylib
。通常,这也会作为指向实际库的符号链接在 /usr/lib
中。在 andrewdotn 的 Makefile
中,编辑 LDFLAGS
(第二行),使其变为:
/Library/Developer/CommandLineTools/usr/lib/libsvn_*-1.0.dylib \
设置 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_PATH
。dyld(1) man page的末尾记录了@loader_path
/@executable_path
/@rpath
等内容,但不幸的是几乎无法理解。但是,测试仍将失败:/从源代码安装1.8.5会生成通过单元测试的绑定,但是从源代码安装目前很麻烦。 - andrewdotnsudo port install subversion-python27bindings
。你可以尝试使用hgsubversion和subvertpy代替hg convert。
brew install subversion --with-python
很快就可以正常工作,并且已经向上游报告了错误,以便将来可能会自动正常工作。 - andrewdotnbrew
,不管那是什么 :))需要进行一个小的(不是大规模的)更改才能在Mavericks上运行。我没有一个更好的答案。你的回答(删除后的部分)已经很好了。但是我不应该用“我”来代替其他人认为是你在说话。抱歉。 - Simon Wrightgit show-ref
命令无法工作。 - Ian Gilham