sirve que portable para openoffice open office historia caracteristicas version-control openoffice.org

version control - que - Descomprima los archivos de OpenOffice para un mejor almacenamiento en el control de versiones



openoffice calc (6)

He escuchado una discusión sobre cómo los archivos OpenOffice (ODF) son archivos zip comprimidos de XML y otros datos. Por lo tanto, hacer un pequeño cambio en el archivo puede cambiar totalmente los datos, por lo que la compresión delta no funciona bien en los sistemas de control de versiones.

He realizado pruebas básicas en un archivo de OpenOffice, descomprimiéndolo y luego volviéndolo a comprimir sin compresión. Utilicé la utilidad zip de Linux para mis pruebas. OpenOffice todavía lo abrirá felizmente.

Así que me pregunto si vale la pena desarrollar una pequeña utilidad para ejecutar archivos ODF cada vez antes de comprometerme con el control de versiones. ¿Alguna idea sobre esta idea? ¿Posibles mejores alternativas?

En segundo lugar, ¿cuál sería una manera buena y robusta de implementar esta pequeña utilidad? ¿Bash shell que llama zip (probablemente solo para Linux)? ¿Pitón? ¿Alguna trampa que puedas imaginar? Obviamente no quiero destrozar un archivo accidentalmente, y hay varias formas en que podría suceder.

Posibles errores que se me ocurren:

  • Espacio en disco insuficiente
  • Algún otro problema de permisos que impide escribir el archivo o archivos temporales
  • El documento ODF está cifrado (probablemente debería dejar esto solo; el cifrado probablemente también cause grandes cambios en los archivos y, por lo tanto, evita una compresión delta eficiente)


Aquí hay un script de Python que he reunido. Ha tenido pruebas mínimas hasta ahora. He hecho pruebas básicas en Python 2.6. Pero prefiero la idea de Python en general porque debería abortar con una excepción si se produce algún error, mientras que un script de bash puede que no.

Este primero comprueba que el archivo de entrada es válido y no está descomprimido. Luego copia el archivo de entrada a un archivo de "copia de seguridad" con la extensión ".bak". Luego descomprime el archivo original, sobrescribiéndolo.

Estoy seguro de que hay cosas que he pasado por alto. Por favor, siéntase libre de dar su opinión.

#!/usr/bin/python # Note, written for Python 2.6 import sys import shutil import zipfile # Get a single command-line argument containing filename commandlineFileName = sys.argv[1] backupFileName = commandlineFileName + ".bak" inFileName = backupFileName outFileName = commandlineFileName checkFilename = commandlineFileName # Check input file # First, check it is valid (not corrupted) checkZipFile = zipfile.ZipFile(checkFilename) checkZipFile.testzip() # Second, check that it''s not already uncompressed isCompressed = False for fileObject in checkZipFile.infolist(): if fileObject.compress_type != zipfile.ZIP_STORED: isCompressed = True if isCompressed == False: raise Exception("File is already uncompressed") checkZipFile.close() # Copy to "backup" file and use that as the input shutil.copy(commandlineFileName, backupFileName) inputZipFile = zipfile.ZipFile(inFileName) outputZipFile = zipfile.ZipFile(outFileName, "w", zipfile.ZIP_STORED) # Copy each input file''s data to output, making sure it''s uncompressed for fileObject in inputZipFile.infolist(): fileData = inputZipFile.read(fileObject) outFileObject = fileObject outFileObject.compress_type = zipfile.ZIP_STORED outputZipFile.writestr(outFileObject, fileData) outputZipFile.close()

Esto está en un repositorio de Mercurial en BitBucket .


He modificado un poco el programa python en la respuesta de Craig McQueen . Los cambios incluyen:

  • En realidad, verificando la devolución de testZip (de acuerdo con los documentos, parece que el programa original con gusto procederá con un archivo zip dañado que pasa el paso de checkzip).

  • Reescriba el bucle for para verificar que los archivos ya sin comprimir sean una sola sentencia if.

Aquí está el nuevo programa:

#!/usr/bin/python # Note, written for Python 2.6 import sys import shutil import zipfile # Get a single command-line argument containing filename commandlineFileName = sys.argv[1] backupFileName = commandlineFileName + ".bak" inFileName = backupFileName outFileName = commandlineFileName checkFilename = commandlineFileName # Check input file # First, check it is valid (not corrupted) checkZipFile = zipfile.ZipFile(checkFilename) if checkZipFile.testzip() is not None: raise Exception("Zip file is corrupted") # Second, check that it''s not already uncompressed if all(f.compress_type==zipfile.ZIP_STORED for f in checkZipFile.infolist()): raise Exception("File is already uncompressed") checkZipFile.close() # Copy to "backup" file and use that as the input shutil.copy(commandlineFileName, backupFileName) inputZipFile = zipfile.ZipFile(inFileName) outputZipFile = zipfile.ZipFile(outFileName, "w", zipfile.ZIP_STORED) # Copy each input file''s data to output, making sure it''s uncompressed for fileObject in inputZipFile.infolist(): fileData = inputZipFile.read(fileObject) outFileObject = fileObject outFileObject.compress_type = zipfile.ZIP_STORED outputZipFile.writestr(outFileObject, fileData) outputZipFile.close()


Primero, el sistema de control de versión que desea usar debe ser compatible con los enganches que se invocan para transformar el archivo de la versión en el repositorio al del área de trabajo, como por ejemplo los filtros de limpieza / borrón en Git desde gitattributes .

En segundo lugar, puede encontrar dicho filtro, en lugar de escribir uno mismo, por ejemplo, rezip desde el tema " Administración de archivos de opendocument (openoffice.org) en git " en la lista de correo de git (pero vea la advertencia en " Seguimiento: administración de archivos OO - advertencia sobre el enfoque " rezip "),

También puede buscar respuestas en el tema " Seguimiento de archivos de OpenOffice / otros archivos comprimidos con Git ", o intente encontrar la respuesta en el tema " [PATCH 2/2] Agregue el soporte para la extensión de palabras clave a convert.c ".

Espero que ayude



Si no necesita ahorros de almacenamiento, pero solo desea poder diferenciar los archivos de OpenOffice.org almacenados en su sistema de control de versiones, puede usar las instrucciones en la página de oodiff , que le indica cómo hacer de oodiff la diferencia predeterminada para OpenDocument Formatos bajo git y mercurial. (También menciona SVN, pero ha pasado tanto tiempo desde que usé SVN regularmente, no estoy seguro de si son instrucciones o limitaciones).

(Encontré esto usando wiki (citado por Craig McQueen arriba))