Cálculo eficiente de las diferencias entre el archivo usando el archivo DIFT -- java campo con performance campo con parsing campo con edit-distance campo con svn camp codereview Relacionados El problema

Efficiently calculating differences between file using diff file


2
vote

problema

Español

Estoy usando svnkit para obtener información de diferencia entre dos revisiones. Estoy usando la utilidad DIF para generar un archivo diff, sin embargo, todavía necesito analizarlo en números.

Implementé una solución, pero es bastante lenta. JGIT hace algo similar, sin embargo, en realidad analiza los valores en sí y devuelve un objeto, en lugar de un flujo de salida, y es mucho más rápido. No pude determinar cómo aprovechar eso para Svnkit, así lo intenté la siguiente solución:

  private Diff compareRevisions(final SVNRevision rev1, final SVNRevision rev2) throws SVNException {             final Diff diff = new Diff();              try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {                  doDiff(rev1, rev2, baos);                  int filesChanged = 0;                 int additions = 0;                 int deletions = 0;                  final String[] lines = baos.toString().split(" ");                  for (final String line : lines) {                      if (line.startsWith("---")) {                         filesChanged++;                     } else if (line.startsWith("+++")) {                         // No action needed                     } else if (line.startsWith("+")) {                         additions++;                     } else if (line.startsWith("-")) {                         deletions++;                     }                  }                  diff.additions = additions;                 diff.deletions = deletions;                 diff.changedFiles = filesChanged;                  return diff;              } catch (final IOException e) {                 LOGGER.trace("Could not close stream", e);                 return diff;     } }   

He tomado en caché los valores en los archivos para mejorar el tiempo, pero óptimamente me gustaría acelerar esto. Tal vez podría usar programas externos?

Original en ingles

I'm using SVNKit to get diff information between two revisions. I'm using the diff utility to generate a diff file, however I still need to parse it into numbers.

I implemented a solution, but it is rather slow. JGit does something similar, however it actually parses the values itself and returns an object, rather than a output stream, and is much much faster. I was unable to determine how to leverage that for SVNKit, so attempted the following solution:

private Diff compareRevisions(final SVNRevision rev1, final SVNRevision rev2) throws SVNException {             final Diff diff = new Diff();              try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {                  doDiff(rev1, rev2, baos);                  int filesChanged = 0;                 int additions = 0;                 int deletions = 0;                  final String[] lines = baos.toString().split("\n");                  for (final String line : lines) {                      if (line.startsWith("---")) {                         filesChanged++;                     } else if (line.startsWith("+++")) {                         // No action needed                     } else if (line.startsWith("+")) {                         additions++;                     } else if (line.startsWith("-")) {                         deletions++;                     }                  }                  diff.additions = additions;                 diff.deletions = deletions;                 diff.changedFiles = filesChanged;                  return diff;              } catch (final IOException e) {                 LOGGER.trace("Could not close stream", e);                 return diff;     } } 

I've taken to caching the values in files to improve time, but optimally I'd like to speed this up. Perhaps I could use external programs?

              

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Necesitas analizar el formato de archivo de parche correctamente. De lo contrario, el siguiente parche que elimina un comentario SQL confundirá su programa, ya que se ve así:

  --- old_file.sql +++ new_file.sql @@ -1,1 +1,1 @@ --- SQL comment +SELECT * FROM table;   

El código actual interpreta la línea eliminada como un archivo eliminado.

El formato de archivo se explica aquí: http: // www .gnu.org / software / difutils / manual / html_node / detalled-unified.html

Dado que hay otras personas que tenían el mismo problema, podrías aprovechar su trabajo en lugar de escribir su propio, por ejemplo, https://github.com/thombergs/diffparser .

 

You need to parse the patch file format correctly. Otherwise the next patch that deletes an SQL comment will confuse your program, as it looks like this:

--- old_file.sql +++ new_file.sql @@ -1,1 +1,1 @@ --- SQL comment +SELECT * FROM table; 

Your current code interprets the removed line as a removed file.

The file format is explained here: http://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html

Since there are other people who had the same problem, you could just build on their work instead of writing your own, e.g. https://github.com/thombergs/diffparser.

 
 
 
 

Relacionados problema

3  Función de bash para crear la siguiente etiqueta de liberación SVN  ( Bash function to create the next svn release tag ) 
He creado el siguiente script y agradecería cualquier comentario. urlA0 ...

7  Svnkit - acelerar la diferencia en los grandes repositorios  ( Svnkit speed up diff on large repositories ) 
Tengo grandes cantidades de repositorios de subversión a veces en masivos que intento escanear para encontrar el número de adiciones, eliminaciones y archivos...

0  Acelerar la copia de seguridad de SVN  ( Speed up svn backup ) 
La siguiente Batch Script se ejecuta en un programa programado Tarea en Windows 7 con un cuádruple 5.5GHz y 16GB de DDR3. Hace la svn servidor no dispon...

0  Creación de un flujo de trabajo adecuado a través del control de la versión y un makefile  ( Creating a proper workflow through version control and a makefile ) 
Descargo de responsabilidad: He publicado esto, pero la pregunta sigue siendo retenida por estar inherentemente de opinión que entiendo, solo busco una vaga d...

2  Cálculo eficiente de las diferencias entre el archivo usando el archivo DIFT  ( Efficiently calculating differences between file using diff file ) 
Estoy usando svnkit para obtener información de diferencia entre dos revisiones. Estoy usando la utilidad DIF para generar un archivo diff, sin embargo, todav...

0  Acelerar la copia de seguridad de SVN  ( Speed up svn backup ) 
La siguiente Batch Script se ejecuta en un programa programado Tarea en Windows 7 con un cuádruple 5.5GHz y 16GB de DDR3. Hace la svn servidor no dispon...

1  Mejorando el tiempo de carga de una lista de comité para una rama y etiqueta específicas de un repo de SVN  ( Improving the load time of a commit list for a specific branch and tag from a sv ) 
Mis listas de aplicaciones se compromete desde una rama y etiqueta específicas en un repo de SVN. La lista de comité se transfiere después al extremo frontal,...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos