Pregunta

Estoy usando MySQL Workbench para mantener el esquema de base para una aplicación. El archivo .mwb que utiliza Banco de trabajo, que es un documento XML con cremallera, se mantiene en un depósito de la subversión.

El archivo se trata como datos binarios por Subversion, por lo que no se puede utilizar svn diff para mostrar los cambios, por ejemplo antes de comprometerse.

Dado que los datos XML es realmente, estoy pensando que podría haber alguna manera de mostrar el diff de todos modos, tal vez algún script que descomprime el archivo antes de, o algún plugin para svn diff.

La solución ideal sería permitir esto:

$ svn diff db-model.mwb

o incluso usando Meld:

$ meld db-model.mwb

¿Qué enfoque se puede pensar para lograr esto? Tal vez alguien más ha tenido este problema de mostrar de diff para archivos de texto archivados en Subversion.

¿Fue útil?

Solución

Subversion le permite usar herramientas de diferenciación externos . Lo que puede hacer es escribir un guión envoltorio, y decirle a Subversion para utilizarlo como su comando "diff". Su envoltura sería analizar los argumentos que recibe de Subversion para seleccionar los nombres de archivo y de "izquierda", "derecha", operar en ellos, y devolverá un código de error que Subversion interpretará como el éxito o el fracaso. En su caso, la envoltura podría descomprimir los archivos XML, y pasar los resultados a descomprimidos "Diff" u otra herramienta de su elección.

Subversion resisten a ficheros diff-ción que se detectaron como "binario" cuando se registró. La opción "--force" le permite anular esta comprobación, por lo que se puede ejecutar el script envoltorio incluso si los archivos de entrada se comprueban en como binarios.

Otros consejos

He escrito un guión de diferencias para los archivos del banco de trabajo que se pueden integrar con TortoiseSVN y TortoiseGit, que va a hacer exactamente lo que sugiere Jim Lewis: Extraer el XML real del archivo y Diff ella.

El script también eliminará todos los ptr -Attribute ruido en el diff. La fusión no es posible y sería un poco más complicado (descubrir cómo los ptr -attributes se comportarían, volver a empaquetar el código XML en el archivo, lo que es con la otra metadatos en el archivo ?, ... )

El script en Python está disponible en Pastebin debajo CC-BY 3.0:

http://pastebin.com/AcD7dBNH

# extensions: mwb
# TortoiseSVN Diff script for MySQL Workbench scheme files
# 2012 by Oliver Iking, Z-Software GmbH, oliverikingREPLACETHISWITHANATz-software.net, http://www.z-software.net/
# This work is licensed under a Creative Commons Attribution 3.0 Unported License - http://creativecommons.org/licenses/by/3.0/

# Will produce two diffable documents, which don't resemble the FULL MWB content, but the scheme relevant data. 
# Merging is not possible

# Open your TortoiseSVN (or TortoiseSomething) settings, go to the "Diff Viewer" tab and click on "Advanced". Add 
# a row with the extension ".mwb" and a command line of 
# "path\to\python.exe" "path\to\diff-mwb.py" %base %mine
# Apply changes and now you can diff mysql workbench scheme files

import sys
import zipfile
import os
import time
import tempfile
import re

# mysql workbench XML will have _ptr_ attributes which are modified on each save for almost each XML node. Remove the visual litter, 
# make actual changes stand out.
def sanitizeMwbXml( xml ):
    return re.sub('_ptr_="([0-9a-fA-F]{8})"', '', xml)

try:
    if len(sys.argv) < 2:
        print("Not enough parameters, cannot diff documents!")
        sys.exit(1)

    docOld = sys.argv[1]
    docNew = sys.argv[2]

    if not os.path.exists(docOld) or not os.path.exists(docNew):
        print("Documents don't exist, cannot diff!")
        sys.exit(1)

    # Workbench files are actually zip archives
    zipA = zipfile.ZipFile( docOld, 'r' )
    zipB = zipfile.ZipFile( docNew, 'r' )

    tempSubpath = os.tempnam(None,"mwbcompare")

    docA = os.path.join( tempSubpath, "mine.document.mwb.xml" )
    docB = os.path.join( tempSubpath, "theirs.document.mwb.xml" )

    os.makedirs( tempSubpath )

    if os.path.exists(docA) or os.path.exists(docB):
        print("Cannot extract documents, files exist!")
        sys.exit(1)

    # Read, sanitize and write actual scheme XML contents to temporary files

    docABytes = sanitizeMwbXml(zipA.read("document.mwb.xml" ))
    docBBytes = sanitizeMwbXml(zipB.read("document.mwb.xml" ))

    docAFile = open(docA, "w")
    docBFile = open(docB, "w")

    docAFile.write(docABytes)
    docBFile.write(docBBytes)

    docAFile.close()
    docBFile.close()

    os.system("TortoiseProc /command:diff /path:\"" + docA + "\" /path2:\"" + docB + "\"");

    # TortoiseProc will spawn a subprocess so we can't delete the files. They're in the tempdir, so they
    # will be cleaned up eventually
    #os.unlink(docA)
    #os.unlink(docB)

    sys.exit(0)
except Exception as e:
    print str(e)
    # Sleep, or the command window will close
    time.sleep(5)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top