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 otro programa que encontré: store_zippies_uncompressed by Mirko Friedenhagen.
La wiki también muestra cómo integrarla con Mercurial.
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
Puede considerar guardar documentos en formato FODT - formato XML plano.
Esta es una solución alternativa relativamente nueva disponible.
El documento se acaba de almacenar descomprimido.
Más información está disponible en https://wiki.documentfoundation.org/Libreoffice_and_subversion .
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))