2009-06-10 7 views
16

J'ai entendu des discussions sur la façon dont les fichiers OpenOffice (ODF) sont des fichiers compressés compressés de fichiers XML et d'autres données. Donc, faire une minuscule modification au fichier peut potentiellement changer totalement les données, donc la compression delta ne fonctionne pas bien dans les systèmes de contrôle de version.Décompresser les fichiers OpenOffice pour un meilleur stockage dans le contrôle de version

J'ai effectué des tests de base sur un fichier OpenOffice, le décompressant et le remettant à zéro sans compression. J'ai utilisé l'utilitaire de compression Linux pour mes tests. OpenOffice sera toujours heureux de l'ouvrir. Donc, je me demande si cela vaut la peine de développer un petit utilitaire pour s'exécuter sur des fichiers ODF chaque fois avant de commettre le contrôle de version. Des pensées sur cette idée? De meilleures alternatives possibles? Deuxièmement, quelle serait une bonne et robuste façon de mettre en œuvre ce petit utilitaire? Bash shell qui appelle zip (probablement Linux uniquement)? Python? Des pièges auxquels vous pouvez penser? Évidemment, je ne veux pas altérer accidentellement un fichier, et il y a plusieurs façons de le faire.

gotchas possibles que je peux penser:

  • Espace disque insuffisant
  • Une autre problème d'autorisations qui empêche l'écriture du fichier ou les fichiers temporaires
  • documents ODF est crypté (devrait probablement juste laisser ces seuls; le cryptage provoque probablement aussi de gros changements de fichiers et empêche ainsi une compression delta efficace)

Répondre

6

Vous pouvez envisager de stocker des documents au format FODT - format XML plat.
Ceci est une solution alternative relativement nouvelle disponible.

Le document est simplement dézippé.

Plus d'informations sont disponibles au https://wiki.documentfoundation.org/Libreoffice_and_subversion.

+0

L'utilisation des formats * .fodt et * .fods pour les documents est le moyen le plus simple de conserver les fichiers de calcul et d'écriture libreoffice dans le contrôle de version. Pas besoin d'utilitaires ou de hooks de validation et les avantages du contrôle de version en texte brut sont tous là. – FvD

14

Premièrement, le système de contrôle de version que vous voulez utiliser d les crochets de support qui sont invoqués pour transformer le fichier de la version dans le référentiel en celui dans la zone de travail, comme par exemple les filtres clean/smudge dans Git de gitattributes.

Deuxièmement, vous pouvez trouver un tel filtre, au lieu d'écrire un vous-même, par exemple rezip de « Management of opendocument (openoffice.org) files in git » fil sur la liste de diffusion git (mais voir l'avertissement dans « Followup: management of OO files - warning about "rezip" approach »),

Vous pouvez aussi parcourir réponses dans le fil "Tracking OpenOffice files/other compressed files with Git", ou essayez de trouver la réponse dans le fil "[PATCH 2/2] Add keyword unexpansion support to convert.c".

Hope qui aide

+0

Informations importantes. Je suis plus intéressé par Subversion et Mercurial en ce moment. Je ne pense pas que Subversion ait une fonction de type clean/smudge. Aucune idée de Mercurial-je suis relativement nouveau à cela. –

+0

@Craig: Mercurial a des crochets. – Borealid

1

Voici un script Python que je l'ai mis en place. Il a eu un minimum de tests jusqu'à présent. J'ai fait des tests de base en Python 2.6. Mais je préfère l'idée de Python en général, car il devrait s'interrompre avec une exception si une erreur survient, alors que ce n'est pas le cas d'un script bash.

Cette première vérifie que le fichier d'entrée est valide et n'est pas déjà décompressé. Ensuite, il copie le fichier d'entrée dans un fichier "backup" avec l'extension ".bak". Ensuite, il décompresse le fichier original, en l'écrasant. Je suis sûr qu'il y a des choses que j'ai oubliées. N'hésitez pas à donner votre avis. Il s'agit d'un Mercurial repository in BitBucket.

3

J'ai modifié le programme python en Craig McQueen's answer juste un peu.Les changements comprennent:

  • En fait vérifier le retour de testZip (selon les documents, il semble que le programme original se fera un plaisir procéder à une fichier zip corrompu passé l'étape de checkzip).

  • Réécrivez la boucle for pour vérifier que les fichiers déjà décompressés sont une seule instruction if.

Voici le nouveau programme:

#!/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() 
2

Voici un autre programme que je suis tombé sur: store_zippies_uncompressed par Mirko Friedenhagen. Le wiki montre également comment l'intégrer avec Mercurial.

0

Si vous n'avez pas besoin des économies de stockage, mais que vous voulez simplement pouvoir comparer les fichiers OpenOffice.org stockés dans votre système de contrôle de version, vous pouvez utiliser les instructions sur le oodiff page, qui indique comment faire oodiff par défaut diff pour les formats OpenDocument sous git et mercurial. (Il mentionne également SVN, mais il a été si longtemps que je SVN régulièrement, je ne sais pas si ce sont des instructions ou des limitations.)

(je trouve cela en utilisant Mirko Friedenhagen's page (cité par Craig McQueen ci-dessus))