2009-09-19 17 views

Respuesta

1

Esto parece una documentación bastante completa:

http://pysvn.tigris.org/docs/pysvn_prog_ref.html

Y aquí hay un par de ejemplos:

http://svn.apache.org/repos/asf/subversion/trunk/tools/examples/

+6

pysvn es un conjunto diferente de enlaces Python que los que estoy que deseen utilizar . Pero esos ejemplos pueden ser útiles. – retracile

+0

+1 svnshell.py será bastante útil. Pero no veo mucho relacionado con los pagos y las fusiones, así que sigo buscando más. – retracile

1

Si compila Subversion desde el código fuente de Subversion los enlaces Python no están incluido automáticamente Tienes que construirlos específicamente e incluirlos. Afortunadamente, puedes hacer esto luego de que hayas instalado Subversion. La fuente de los enlaces se incluye dentro del código fuente de Subversion.

Estas instrucciones son para Subversion 1.5.9 y Python 2.4.3 en Red Hat Enterprise Linux, pero deben ser fácilmente pirateables para las versiones recientes de Subversion y Python y las instalaciones genéricas de Unix.

En primer lugar, descargar trago de http://downloads.sourceforge.net/swig

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

En este punto se tiene que tomar una decisión. Puede instalar swig para todos los idiomas compatibles o puede instalar solo lo que necesita. 'make check' puede tardar hasta una hora en ejecutarse y puede fallar debido a errores en los idiomas que no le interesan.

Si desea utilizar todos los idiomas soportados Run:

./configure 

Si quieres alcance hasta justo pitón, ejecute:

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

Después, ejecute:

make 

Si optó por la instalación completa, ejecute:

make -k check 

Si a cuyo ámbito abajo apenas Python sólo es necesario para ejecutar las pruebas de Python:

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

Si todo está bien, ya está listo para instalar trago:

hacen instalar

A partir de aquí, la instalación de los enlaces python subversión debe ser bastante sencillo:

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 

Como siempre, su millaje puede variar según sus versiones y arquitectura específicas. Buena suerte.

+5

Si bien eso puede ser útil para aquellos que buscan información sobre cómo instalar los enlaces, eso no soluciona mi pregunta sobre _usar_ las ataduras. Estoy buscando API y documentación de programación, no ayuda de instalación. – retracile

5

Acabo de querer añadir un poco de aclaración aquí.

Gracias a las dos respuestas anteriores (@BenjaminWohlwend y @Logan), me di cuenta de que hay más de un conjunto de enlaces/interfaces de Python para Subversion; Hice esto en mi caja de Ubuntu 11.04:

$ 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 

Uno puede mirar en el paquete de lista de archivos Debian, para determinar cuáles son las bibliotecas estos se refieren a; por lo que tenemos:

... y también he encontrado otro en el repositorio:

El enlace http://svn.apache.org/repos/asf/subversion (que obtuve de @BenjaminWohlwend) es aparentemente la Apache Software Foundation (ASF?) Depósito de la subversión para el código fuente de Subversion en sí. búsqueda

del OP para la documentación parece estar relacionado con python-subversion (o SWIG encuadernaciones (o libsvn); cuyas instrucciones acumulación de fuente están en @Logan 's puesto.No pude encontrar mucho mejor fuente de documentación del svn.developer: Using the APIs ya referido en el PO, excepto por el bindings/swig/python/README; se explica cómo TRAGO genera interfaces de Python desde C:

TRADUCCIÓN Listas de parámetros

el argumento de la reducción de las leyes de la enlaces SWIG algo sale como
esto:

- The module prefix can be omitted. o: 

    void *some_C_function = svn_client_foo; 

    becomes: 

    import svn.client 
    func = svn.client.foo 

[... ]

Entonces, uno podría mirar, digamos, svn/core.py, y encontrar la función s (y "Símbolos definidos explícitamente") como svn_mergeinfo_merge; teniendo en cuenta que core.py importa libsvn.core - donde libsvn probablemente se refiere a los archivos de objeto compartido (.so) creados a partir del archivo C libsvn_swig_py/swigutil_py.c.

Luego, podemos buscar svn_mergeinfo_merge, y encontrar un mensaje de confirmación como SVNSearch: Subversion (commit 23570 05.03.2007), que se refiere a esa función, y un svn_mergeinfo.h; mirando hacia arriba ese archivo aún más, lo encontramos en el repositorio PPA: svn_mergeinfo.h, que de hecho contiene:

/** 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); 

Al ver DEPRECATED ahí, es probablemente bueno aquí para referirse a svn commit: r1175903 (Mon Sep 26 2011):

  • la subversión /libsvn_subr/mergeinfo.c

    (svn_mergeinfo_merge2): Nuevo.

    (svn_mergeinfo_merge): pasar a deprecated.c.

    (svn_mergeinfo_catalog_merge): use la nueva API.

Eso es - esa función en particular está en desuso en 2011 - por lo que es de esperar, uno de los enlaces de Python SVN y la instalación SVN deben estar a juego ...

0

espero que sea bien con otro post re: python-subversion : Quería probar Example 8.3. A Python status crawler - Using the APIs (svnbook). en Ubuntu 11.04, Python 2.7, svn_client_status2 se colgó en un nombre de archivo con caracteres UTF-8 con "Error (22): Error al convertir la entrada en el directorio 'ruta' a UTF-8" - la solución a esto es llamar al setlocale antes de cualquier llama a esta función.

También me di cuenta de que hay svn_client_status3 y svn_client_status4 en la API de Python; svn_client_status3 tiene una llamada ligeramente diferente, y también necesita setlocale. Sin embargo, NO se debe usar svn_client_status4, se segmenta, ya que necesita un argumento de estructura que Python no puede entregar; para más, vea #16027750 Debugging: stepping through Python script using gdb?.

Para concluir, aquí está el Ejemplo 8.3 con configuración local que utiliza svn_client_status3 - y no se cuelga en mi sistema (incluso en los nombres de archivo con caracteres UTF-8):

#!/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) 
Cuestiones relacionadas