2009-09-19 12 views

Odpowiedz

1
+6

pysvn jest inny zestaw powiązaniami Pythona niż te, które mam, które chcą korzystać . Ale te przykłady mogą być przydatne. – retracile

+0

+1 svnshell.py będzie całkiem przydatne. Ale nie widzę wiele związanych z kasami i fuzji, więc wciąż szukam więcej. – retracile

1

Jeśli budować Subversion od źródła powiązania Subversion Pythona nie są automatycznie dołączone. Musisz je specjalnie skompilować i uwzględnić. Na szczęście możesz to zrobić po zainstalowaniu Subversion. Źródło powiązań jest zawarte w kodzie źródłowym Subversion.

Te instrukcje dotyczą Subversion 1.5.9 i Python 2.4.3 w systemie Red Hat Enterprise Linux, ale powinny być łatwe do hakowania w przypadku najnowszych wersji Subversion i Python oraz ogólnych instalacji systemu UNIX.

Najpierw pobierz haust z http://downloads.sourceforge.net/swig

tar -xvf swig-<version>.tar.gz 
cd swig-<version> 

W tym momencie trzeba podjąć decyzję. Możesz zainstalować swig dla wszystkich obsługiwanych języków lub możesz zainstalować dla tego, czego potrzebujesz. "sprawdzenie" może potrwać do godziny i może się nie powieść z powodu błędów z języków, których nie dotyczy.

Jeśli chcesz korzystać ze wszystkich obsługiwanych języków uruchomić:

./configure 

Jeśli chcesz zakresie do zaledwie pytona, uruchom:

./configure --with-python=/usr/local/bin/python2.4 --without-perl --without-ruby --without-php4 

następnie uruchom:

make 

Jeśli zdecydowałeś się na pełną instalację, uruchom:

make -k check 

Jeśli zawężona do zaledwie python wystarczy uruchomić testy Pythonie

make check-python-examples 
make check-python-test-suite 

Jeśli wszystko jest w porządku, jesteś gotowy do zainstalowania haust:

make install

Odtąd instalowanie powiązań pythra z subversion powinno być dość proste:

tar -xvf subversion-1.5.9.tar.gz --gzip 
cd subversion-1.5.9 
make swig-py 
make install-swig-py 
touch /usr/lib64/python2.4/site-packages/svn-python.pth 
echo /usr/local/lib/svn-python > /usr/lib64/python2.4/site-packages/svn-python.pth 

Jak zawsze, przebieg może się różnić w zależności od konkretnych wersji i architektury. Powodzenia.

+5

Chociaż może to być pomocne dla tych, którzy szukają informacji o sposobie instalowania powiązań, to nie rozwiązuje mojego pytania o _using_ powiązania. Szukam API i dokumentacji programistycznej, a nie pomocy instalacyjnej. – retracile

5

Chciałam tylko dodać trochę wyjaśnienia.

Dzięki powyższym dwie odpowiedzi (@BenjaminWohlwend i @Logan), dowiedziałem się, że istnieje więcej niż jeden zestaw powiązań/interfejsów Python dla Subversion; Zrobiłem to na moim Ubuntu 11.04 pudełka:

$ apt-cache search '[Ss]vn|[Ss]ubversion' | grep -i python 
python-svn - A(nother) Python interface to Subversion 
python-svn-dbg - A(nother) Python interface to Subversion (debug extension) 
python-subversion - Python bindings for Subversion 
python-subversion-dbg - Python bindings for Subversion (debug extension) 
python-opster - a python command line parsing speedster 
python-py - Advanced Python testing tool and networking lib 
python-rope - Python refactoring library 
python-subvertpy - Alternative Python bindings for Subversion 

Można spojrzeć na listy plików pakietu Debiana, aby określić, które odnoszą się do biblioteki; mamy więc:

... i ja też znalazłem innego w repozytorium:

Link http://svn.apache.org/repos/asf/subversion (które dostałem od @BenjaminWohlwend) jest najwyraźniej Apache Software Foundation (ASF?) Repozytorium Subversion dla samego kodu źródłowego Subversion.

Zadanie OP związane z dokumentacją wydaje się być związane z python-subversion (lub wiązaniami SWIG (lub libsvn), których instrukcja kompilacji z źródła znajduje się w poście @Logan.Nie mogłem znaleźć lepszego źródła dokumentacji od svn.developer: Using the APIs, o którym już mowa w OP, z wyjątkiem bindings/swig/python/README; wyjaśnia, jak SWIG generuje interfejsy Pythona z C:

tłumaczenia PARAMETRÓW LISTĘ

argument-redukcje prawa do czegoś wiązaniami haust wyglądać
tym:

- The module prefix can be omitted. o: 

    void *some_C_function = svn_client_foo; 

    becomes: 

    import svn.client 
    func = svn.client.foo 

[... ]

Następnie można zajrzeć, powiedzmy, svn/core.py i znaleźć funkcję s (i "Symbole zdefiniowane jawnie"), takie jak svn_mergeinfo_merge; zauważając, że core.py - gdzie libsvn - prawdopodobnie odnosi się do obiektów współdzielonych (.so) zbudowanych z pliku C libsvn_swig_py/swigutil_py.c.

Następnie możemy wyszukać svn_mergeinfo_merge i znaleźć komunikat zatwierdzenia, taki jak SVNSearch: Subversion (commit 23570 05.03.2007), który odnosi się do tej funkcji, oraz svn_mergeinfo.h; patrząc na ten plik dalej, znajdziemy go w repozytorium ASF: svn_mergeinfo.h, który rzeczywiście zawiera:

/** Like svn_mergeinfo_merge2, but uses only one pool. 
* 
* @deprecated Provided for backward compatibility with the 1.5 API. 
*/ 
SVN_DEPRECATED 
svn_error_t * 
svn_mergeinfo_merge(svn_mergeinfo_t mergeinfo, 
        svn_mergeinfo_t changes, 
        apr_pool_t *pool); 

Widząc DEPRECATED tam, to chyba dobry tutaj, aby zapoznać się svn commit: r1175903 (Mon Sep 26 2011):

  • Subversion /libsvn_subr/mergeinfo.c

    (svn_mergeinfo_merge2): Nowy.

    (svn_mergeinfo_merge): Przejdź do pliku deprecated.c.

    (svn_mergeinfo_catalog_merge): Użyj nowego interfejsu API.

To znaczy - że dana funkcja została zaniechana w 2011 roku - więc miejmy nadzieję, jeden za Wiązania Python SVN i instalacja SVN powinny być dopasowane ...

0

nadzieję, że jest OK, z innym Post Re: python-subversion : Chciałem spróbować Example 8.3. A Python status crawler - Using the APIs (svnbook). w systemie Ubuntu 11.04, Python 2.7, svn_client_status2 rozbił się na nazwie pliku ze znakami UTF-8 z "Błąd (22): Błąd podczas przekształcania wpisu w katalogu 'path' na UTF-8" - rozwiązaniem jest wywołanie setlocale przed wzywa do tej funkcji.

Zdałem sobie również sprawę, że w interfejsie API Pythona są svn_client_status3 i svn_client_status4; svn_client_status3 ma nieco inne połączenie, a także potrzebuje setlocale. Jednak NIE powinno się używać svn_client_status4 - jest to segfault, ponieważ potrzebuje strukturalnego argumentu, którego Python nie może dostarczyć; więcej, zobacz #16027750 Debugging: stepping through Python script using gdb?.

Podsumowując, oto przykład 8.3 z ustawieniami regionalnymi który wykorzystuje svn_client_status3 - a nie katastrofy na moim systemie (nawet w nazwach plików z UTF-8 znaków):

#!/usr/bin/env python 

# modified from: 
# http://svnbook.red-bean.com/en/1.5/svn.developer.usingapi.html 
# does the same as `svn status`, and is marked: 
"""Crawl a working copy directory, printing status information.""" 

# tested on Python 2.7, Ubuntu Natty 11.04; needs: 
# sudo apt-get install python-subversion 

import locale 
print locale.getlocale() # (None, None) - in C: ANSI_X3.4-1968 
locale.setlocale(locale.LC_ALL, '') # would print en_US.UTF-8 
print locale.getlocale() # NOW it is ('en_US', 'UTF-8') 

import sys 
import os.path 

import getopt 
import svn.core, svn.client, svn.wc 


def generate_status_code(status): 
    """Translate a status value into a single-character status code, 
    using the same logic as the Subversion command-line client.""" 
    code_map = { svn.wc.svn_wc_status_none  : ' ', 
       svn.wc.svn_wc_status_normal  : ' ', 
       svn.wc.svn_wc_status_added  : 'A', 
       svn.wc.svn_wc_status_missing  : '!', 
       svn.wc.svn_wc_status_incomplete : '!', 
       svn.wc.svn_wc_status_deleted  : 'D', 
       svn.wc.svn_wc_status_replaced : 'R', 
       svn.wc.svn_wc_status_modified : 'M', 
       svn.wc.svn_wc_status_merged  : 'G', 
       svn.wc.svn_wc_status_conflicted : 'C', 
       svn.wc.svn_wc_status_obstructed : '~', 
       svn.wc.svn_wc_status_ignored  : 'I', 
       svn.wc.svn_wc_status_external : 'X', 
       svn.wc.svn_wc_status_unversioned : '?', 
      } 
    return code_map.get(status, '?') 


def do_status(wc_path, verbose): 
    # Build a client context baton. 
    ctx = svn.client.svn_client_ctx_t() 

    def _status_callback(path, status): 
     """A callback function for svn_client_status.""" 

     # Print the path, minus the bit that overlaps with the root of 
     # the status crawl 
     text_status = generate_status_code(status.text_status) 
     prop_status = generate_status_code(status.prop_status) 
     print '%s%s %s' % (text_status, prop_status, path) 

    # Do the status crawl, using _status_callback() as our callback function. 
    revision = svn.core.svn_opt_revision_t() 
    revision.type = svn.core.svn_opt_revision_head 
    #~ svn.client.svn_client_status2(wc_path, revision, _status_callback, 
           #~ svn.core.svn_depth_infinity, verbose, 
           #~ 0, 0, 1, ctx) 
    svn.client.svn_client_status3(wc_path, revision, _status_callback, 
           svn.core.svn_depth_infinity, verbose, 
           0, 0, 1,(), ctx) 
    # DO NOT USE svn_client_status4! (needs a C struct argument) 


def usage_and_exit(errorcode): 
    """Print usage message, and exit with ERRORCODE.""" 
    stream = errorcode and sys.stderr or sys.stdout 
    stream.write("""Usage: %s OPTIONS WC-PATH 
Options: 
    --help, -h : Show this usage message 
    --verbose, -v : Show all statuses, even uninteresting ones 
""" % (os.path.basename(sys.argv[0]))) 
    sys.exit(errorcode) 

if __name__ == '__main__': 
    # Parse command-line options. 
    try: 
    opts, args = getopt.getopt(sys.argv[1:], "hv", ["help", "verbose"]) 
    except getopt.GetoptError: 
    usage_and_exit(1) 
    verbose = 0 
    for opt, arg in opts: 
    if opt in ("-h", "--help"): 
     usage_and_exit(0) 
    if opt in ("-v", "--verbose"): 
     verbose = 1 
    if len(args) != 1: 
    usage_and_exit(2) 

    # Canonicalize the repository path. 
    wc_path = svn.core.svn_path_canonicalize(args[0]) 

    # Do the real work. 
    try: 
    do_status(wc_path, verbose) 
    except svn.core.SubversionException, e: 
    sys.stderr.write("Error (%d): %s\n" % (e.apr_err, e.message)) 
    sys.exit(1)