Pergunta

Estou usando o MySQL Workbench para manter o esquema de banco de dados para um aplicativo. o .mwb O arquivo que o Workbench usa, que é um documento XML com zíper, é mantido em um repositório de subversão.

O arquivo é tratado como dados binários por subversão, então não posso usar svn diff para mostrar as mudanças, por exemplo, antes de se comprometer.

Como os dados são realmente XML, estou pensando que pode haver alguma maneira de mostrar o diferencial de qualquer maneira, talvez algum script que descubra o arquivo antes, ou algum plugin para svn diff.

A solução ideal permitiria isto:

$ svn diff db-model.mwb

ou mesmo usando MELD:

$ meld db-model.mwb

Que abordagem você pode pensar para conseguir isso? Talvez outra pessoa tenha tido esse problema de mostrar os diff para arquivos de texto arquivados na subversão.

Foi útil?

Solução

A subversão permite que você use Ferramentas de diferenciação externas . O que você pode fazer é escrever um script de wrapper e dizer à subversão para usá -lo como seu comando "diff". Seu invólucro analisaria os argumentos que obtém da subversão para escolher os nomes de arquivos "esquerda" e "direita", operará neles e devolver um código de erro que a subversão interpretará como sucesso ou falha. No seu caso, o invólucro pode descompactar os arquivos XML e passar os resultados descompactados para "diff" ou outra ferramenta de sua escolha.

A subversão se recusará aos arquivos diff-ing que foram detectados como "binários" quando foram verificados. A opção "-Force" permite substituir essa verificação, para que seu script de wrapper seja executado mesmo que os arquivos de entrada sejam verificados como binários.

Outras dicas

Eu escrevi um script Diff para arquivos de bancada de trabalho que podem ser integrados ao TortoisesVN e TortoiseGit, o que fará exatamente o que Jim Lewis sugere: extrair o XML real do arquivo e diff ele.

O script também eliminará todos os ptr-Atribua ruído no diff. A fusão não é possível e seria um pouco mais complicada (descubra como o ptr-atltributes se comportariam, reuniria novamente o XML no arquivo, o que há com os outros metadados no arquivo?, ...)

O script Python está disponível no Pastebin sob 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top