Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apéndice B traducido #41

Merged
merged 15 commits into from
Apr 5, 2016
8 changes: 4 additions & 4 deletions book/B-embedding-git/1-embedding-git.asc
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[appendix]
== Embedding Git in your Applications
== Integrando Git en tus Aplicaciones

If your application is for developers, chances are good that it could benefit from integration with source control.
Even non-developer applications, such as document editors, could potentially benefit from version-control features, and Git's model works very well for many different scenarios.
Si tu aplicación es para desarrolladores, es muy probable que pueda beneficiarse de la integración con el control de código fuente.
Incluso las aplicaciones que no sean para desarrolladores, tales como editores de documentos, podrían beneficiarse de las características de control de versiones, y el modelo de Git funciona muy bien para muchos escenarios diferentes.

If you need to integrate Git with your application, you have essentially three choices: spawning a shell and using the Git command-line tool; Libgit2; and JGit.
Si necesitas integrar Git con tu aplicación, tienes básicamente tres opciones: generar un shell y usar la herramienta de línea de comandos de Git; Libgit2; y JGit.

include::sections/command-line.asc[]

Expand Down
24 changes: 12 additions & 12 deletions book/B-embedding-git/sections/command-line.asc
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
=== Command-line Git
=== Git mediante Línea de Comandos

One option is to spawn a shell process and use the Git command-line tool to do the work.
This has the benefit of being canonical, and all of Git's features are supported.
This also happens to be fairly easy, as most runtime environments have a relatively simple facility for invoking a process with command-line arguments.
However, this approach does have some downsides.
Una opción es generar un proceso shell y utilizar la herramienta de línea de comandos de Git para hacer el trabajo.
Esto tiene la ventaja de ser canónico, y todas las características de Git estan soportadas.
Esto también resulta ser bastante fácil, ya que la mayoría de los entornos de ejecución tienen una forma relativamente sencilla para invocar un proceso con argumentos de la línea de comandos.
Sin embargo, este enfoque tiene algunas desventajas.

One is that all the output is in plain text.
This means that you'll have to parse Git's occasionally-changing output format to read progress and result information, which can be inefficient and error-prone.
Una es que toda la salida es un texto plano.
Esto significa que tendrás que analizar el formato de salida cambiante de Git para leer la información de progreso y de resultado, lo que puede ser ineficiente y propenso a errores.

Another is the lack of error recovery.
If a repository is corrupted somehow, or the user has a malformed configuration value, Git will simply refuse to perform many operations.
Otra es la falta de recuperación de errores.
Si un repositorio está dañado de alguna manera, o el usuario tiene un valor de configuración con formato incorrecto, Git simplemente se negará a realizar muchas operaciones.

Yet another is process management.
Git requires you to maintain a shell environment on a separate process, which can add unwanted complexity.
Trying to coordinate many of these processes (especially when potentially accessing the same repository from several processes) can be quite a challenge.
Otra más es la gestión de procesos.
Git requiere que mantengas un entorno de shell en un proceso separado, lo que puede añadir complejidad no deseada.
Tratar de coordinar muchos de estos procesos (especialmente cuando se accede potencialmente el mismo repositorio de varios procesos) puede ser todo un reto.
106 changes: 52 additions & 54 deletions book/B-embedding-git/sections/jgit.asc
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
=== JGit

(((jgit)))(((java)))
If you want to use Git from within a Java program, there is a fully featured Git library called JGit.
JGit is a relatively full-featured implementation of Git written natively in Java, and is widely used in the Java community.
The JGit project is under the Eclipse umbrella, and its home can be found at http://www.eclipse.org/jgit[].
Si deseas utilizar Git desde dentro de un programa Java, hay una biblioteca Git completamente funcional llamada JGit.
JGit es una implementación relativamente completa de Git escrita de forma nativa en Java, y que se utiliza ampliamente en la comunidad Java.
El proyecto JGit está bajo el paraguas de Eclipse, y su "casa" puede encontrarse en http://www.eclipse.org/jgit[].

==== Getting Set Up

There are a number of ways to connect your project with JGit and start writing code against it.
Probably the easiest is to use Maven – the integration is accomplished by adding the following snippet to the `<dependencies>` tag in your pom.xml file:
Hay varias formas de conectar tu proyecto con JGit y empezar a escribir código usando éste.
Probablemente la más fácil sea utilizar Maven -la integración se consigue añadiendo el siguiente fragmento a la etiqueta `<dependencies>` en tu archivo pom.xml:

[source,xml]
----
Expand All @@ -19,25 +19,25 @@ Probably the easiest is to use Maven – the integration is accomplished by addi
</dependency>
----

The `version` will most likely have advanced by the time you read this; check http://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit[] for updated repository information.
Once this step is done, Maven will automatically acquire and use the JGit libraries that you'll need.
La `version` es bastante probable que habrá avanzado para el momento en que leas esto; comprueba http://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit[] para obtener información actualizada del repositorio.
Una vez que se realiza este paso, Maven automáticamente adquirirá y utilizará las bibliotecas JGit que necesites.

If you would rather manage the binary dependencies yourself, pre-built JGit binaries are available from http://www.eclipse.org/jgit/download[].
You can build them into your project by running a command like this:
Si prefieres gestionar las dependencias binarias tú mismo, binarios JGit pre-construidos están disponibles en http://www.eclipse.org/jgit/download[].
Puedes construirlos en tu proyecto ejecutando un comando como el siguiente:

[source,console]
----
javac -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App.java
java -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App
----

==== Plumbing
==== Fontanería

JGit has two basic levels of API: plumbing and porcelain.
The terminology for these comes from Git itself, and JGit is divided into roughly the same kinds of areas: porcelain APIs are a friendly front-end for common user-level actions (the sorts of things a normal user would use the Git command-line tool for), while the plumbing APIs are for interacting with low-level repository objects directly.
JGit tiene dos niveles básicos de la API: fontanería y porcelana.
La terminología de éstos proviene de Git, y JGit se divide en más o menos los mismos tipos de áreas: las API de porcelana son un front-end amigable para las acciones comunes a nivel de usuario (el tipo de cosas para las que un usuario normal utilizaría la herramienta de línea de comandos de Git), mientras que las API de fontanería son para interactuar directamente a bajo nivel con los objetos del repositorio.

The starting point for most JGit sessions is the `Repository` class, and the first thing you'll want to do is create an instance of it.
For a filesystem-based repository (yes, JGit allows for other storage models), this is accomplished using `FileRepositoryBuilder`:
El punto de partida para la mayoría de las sesiones JGit es la clase `Repository`, y la primera cosa que querrás hacer es crear una instancia de la misma.
Para un repositorio basado en sistema de archivos (sí, JGit permite otros modelos de almacenamiento), esto se logra utilizando `FileRepositoryBuilder`:

[source,java]
----
Expand All @@ -51,11 +51,10 @@ Repository existingRepo = new FileRepositoryBuilder()
.build();
----

The builder has a fluent API for providing all the things it needs to find a Git repository, whether or not your program knows exactly where it's located.
It can use environment variables (`.readEnvironment()`), start from a place in the working directory and search (`.setWorkTree(…).findGitDir()`), or just open a known `.git` directory as above.
El constructor tiene una API fluida para proporcionar todo lo que necesitas para encontrar un repositorio Git, tanto si tu programa sabe exactamente donde se encuentra como si no.
Puede utilizar variables de entorno ((`.readEnvironment()`), empezar a partir de un lugar en el directorio de trabajo y buscar (`.setWorkTree(…).findGitDir()`), o simplemente abrir un directorio `.git` conocido como más arriba.

Once you have a `Repository` instance, you can do all sorts of things with it.
Here's a quick sampling:
Una vez que tengas una instancia `Repository`, se pueden hacer todo tipo de cosas con ella. He aquí una muestra rápida:

[source,java]
----
Expand Down Expand Up @@ -87,37 +86,37 @@ Config cfg = repo.getConfig();
String name = cfg.getString("user", null, "name");
----

There's quite a bit going on here, so let's go through it one section at a time.
Hay bastantes cosas que suceden aquí, así que vamos a examinarlo sección a sección.

The first line gets a pointer to the `master` reference.
JGit automatically grabs the _actual_ master ref, which lives at `refs/heads/master`, and returns an object that lets you fetch information about the reference.
You can get the name (`.getName()`), and either the target object of a direct reference (`.getObjectId()`) or the reference pointed to by a symbolic ref (`.getTarget()`).
Ref objects are also used to represent tag refs and objects, so you can ask if the tag is ``peeled,'' meaning that it points to the final target of a (potentially long) string of tag objects.
La primera línea consigue un puntero a la referencia `master`.
JGit obtiene automáticamente la referencia master _real_, que reside en `refs/heads/master`, y devuelve un objeto que te permite obtener información acerca de la referencia.
Puedes obtener el nombre (`.getName()`), y también el objeto destino de una referencia directa (`.getObjectId()`) o la referencia a la que apunta mediante una referencia simbólica (`.getTarget()`).
Los objetos Ref también se utilizan para representar referencias a etiquetas y objetos, por lo que puedes preguntar si la etiqueta está ''pelada'', lo que significa que apunta al objetivo final de una (potencialmente larga) cadena de texto de objetos etiqueta.

The second line gets the target of the `master` reference, which is returned as an ObjectId instance.
ObjectId represents the SHA-1 hash of an object, which might or might not exist in Git's object database.
The third line is similar, but shows how JGit handles the rev-parse syntax (for more on this, see <<_branch_references>>); you can pass any object specifier that Git understands, and JGit will return either a valid ObjectId for that object, or `null`.
La segunda línea obtiene el destino de la referencia `master`, que se devuelve como una instancia ObjectId.
ObjectId representa el hash SHA-1 de un objeto, que podría o no existir en la base de datos de objetos de Git.
La tercera línea es similar, pero muestra cómo maneja JGit la sintaxis rev-parse (para más información sobre esto, consulta <<_branch_references>>); puedes pasar cualquier especificador de objeto que Git entienda, y JGit devolverá una ObjectId válida para ese objeto, o `null`.

The next two lines show how to load the raw contents of an object.
In this example, we call `ObjectLoader.copyTo()` to stream the contents of the object directly to stdout, but ObjectLoader also has methods to read the type and size of an object, as well as return it as a byte array.
For large objects (where `.isLarge()` returns `true`), you can call `.openStream()` to get an InputStream-like object that can read the raw object data without pulling it all into memory at once.
Las dos líneas siguientes muestran cómo cargar el contenido en bruto de un objeto.
En este ejemplo, llamamos a `ObjectLoader.copyTo()` para transmitir el contenido del objeto directamente a la salida estándar, pero ObjectLoader también tiene métodos para leer el tipo y el tamaño de un objeto, así como devoverlo como un array de bytes.
Para objetos grandes (donde `.isLarge()` devuelve true), puedes llamar a `.openStream()` para obtener un objeto similar a InputStream del cual puedes leer los datos del objeto en bruto si almacenarlo en memoria en seguida.

The next few lines show what it takes to create a new branch.
We create a RefUpdate instance, configure some parameters, and call `.update()` to trigger the change.
Directly following this is the code to delete that same branch.
Note that `.setForceUpdate(true)` is required for this to work; otherwise the `.delete()` call will return `REJECTED`, and nothing will happen.
Las siguientes líneas muestran lo que se necesita para crear una nueva rama.
Creamos una instancia RefUpdate, configuramos algunos parámetros, y llamamos a `.update()` para activar el cambio.
Inmediatamente después de esto está el código para eliminar esa misma rama.
Ten en cuenta que se requiere `.setForceUpdate(true)` para que esto funcione; de lo contrario la llamada `.delete()` devolverá `REJECTED`, y no pasará nada.

The last example shows how to fetch the `user.name` value from the Git configuration files.
This Config instance uses the repository we opened earlier for local configuration, but will automatically detect the global and system configuration files and read values from them as well.
El último ejemplo muestra cómo buscar el valor `user.name` a partir de los archivos de configuración de Git.
Este ejemplo de configuración utiliza el repositorio que abrimos anteriormente para la configuración local, pero detectará automáticamente los archivos de configuración global y del sistema y leerá los valores de ellos también.

This is only a small sampling of the full plumbing API; there are many more methods and classes available.
Also not shown here is the way JGit handles errors, which is through the use of exceptions.
JGit APIs sometimes throw standard Java exceptions (such as `IOException`), but there are a host of JGit-specific exception types that are provided as well (such as `NoRemoteRepositoryException`, `CorruptObjectException`, and `NoMergeBaseException`).
Ésta es sólo una pequeña muestra de la API de fontanería completa; hay muchos más métodos y clases disponibles.
Tampoco se muestra aquí la forma en la que JGit maneja los errores, que es a través del uso de excepciones.
La API de JGit a veces lanza excepciones Java estándar (como `IOException`), pero también hay una gran cantidad de tipos de excepciones específicas de JGit que se proporcionan (tales como `NoRemoteRepositoryException`, `CorruptObjectException`, y `NoMergeBaseException`).

==== Porcelain
==== Porcelana

The plumbing APIs are rather complete, but it can be cumbersome to string them together to achieve common goals, like adding a file to the index, or making a new commit.
JGit provides a higher-level set of APIs to help out with this, and the entry point to these APIs is the `Git` class:
Las APIs de fontanería son bastante completas, pero puede ser engorroso encadenarlas juntas para alcanzar objetivos comunes, como la adición de un archivo en el index, o hacer un nuevo commit.
JGit proporciona un conjunto de APIs de más alto nivel para facilitar esto, y el punto de entrada a estas APIs es la clase `Git`:

[source,java]
----
Expand All @@ -126,8 +125,8 @@ Repository repo;
Git git = new Git(repo);
----

The Git class has a nice set of high-level _builder_-style methods that can be used to construct some pretty complex behavior.
Let's take a look at an example – doing something like `git ls-remote`:
La clase Git tiene un buen conjunto de métodos estilo _builder_ de alto nivel que se pueden utilizar para construir un comportamiento bastante complejo.
Echemos un vistazo a un ejemplo - haciendo algo como `git ls-remote`:

[source,java]
----
Expand All @@ -143,18 +142,17 @@ for (Ref ref : remoteRefs) {
}
----

This is a common pattern with the Git class; the methods return a command object that lets you chain method calls to set parameters, which are executed when you call `.call()`.
In this case, we're asking the `origin` remote for tags, but not heads.
Also notice the use of a `CredentialsProvider` object for authentication.
Este es un patrón común con la clase Git; los métodos devuelven un objeto de comando que te permite encadenar llamadas a métodos para establecer los parámetros, que se ejecutan cuando se llama `.call()`.
En este caso, estamos solicitando las etiquetas del repositorio remoto `origin`, pero no las cabezas (heads).
Observa también el uso de un objeto `CredentialsProvider` para la autenticación.

Many other commands are available through the Git class, including but not limited to `add`, `blame`, `commit`, `clean`, `push`, `rebase`, `revert`, and `reset`.
Muchos otros comandos están disponibles a través de la clase Git, incluyendo, aunque no limitado, a `add`, `blame`, `commit`, `clean`, `push`, `rebase`, `revert`, y `reset`.

==== Further Reading
==== Otras Lecturas

This is only a small sampling of JGit's full capabilities.
If you're interested and want to learn more, here's where to look for information and inspiration:
Esta es sólo una pequeña muestra de todas las posibilidades de JGit.
Si estás interesado y deseas aprender más, aquí tienes dónde buscar información e inspiración:

* The official JGit API documentation is available online at http://download.eclipse.org/jgit/docs/latest/apidocs[].
These are standard Javadoc, so your favorite JVM IDE will be able to install them locally, as well.
* The JGit Cookbook at https://github.com/centic9/jgit-cookbook[] has many examples of how to do specific tasks with JGit.
* There are several good resources pointed out at http://stackoverflow.com/questions/6861881[].
* La documentación API oficial de JGit está disponible en línea en http://download.eclipse.org/jgit/docs/latest/apidocs[]. Estos son Javadoc estándar, por lo que tu IDE JVM favorito será capaz de instalarlos de forma local, también.
* El "libro de cocina" de JGit en https://github.com/centic9/jgit-cookbook[] tiene muchos ejemplos de cómo realizar tareas específicas con JGit.
* Hay varios buenos recursos indicados en http://stackoverflow.com/questions/6861881[].
Loading