2009-09-01 11 views
10

के लिए सबवर्जन diff मैं किसी अनुप्रयोग के लिए डेटाबेस स्कीमा को बनाए रखने के लिए MySQL वर्कबेंच का उपयोग कर रहा हूं। .mwb फ़ाइल जो वर्कबेंच का उपयोग करती है, जो एक ज़िपित XML दस्तावेज़ है, को सबवर्जन रिपोजिटरी में रखा जाता है।ज़िपित xml फ़ाइल

फ़ाइल को सबवर्जन द्वारा बाइनरी डेटा के रूप में माना जाता है, इसलिए मैं परिवर्तन दिखाने के लिए svn diff का उपयोग नहीं कर सकता, उदाहरण के लिए उदाहरण के लिए।

चूंकि डेटा वास्तव में एक्सएमएल है, इसलिए मुझे लगता है कि वैसे भी भिन्नता दिखाने का कोई तरीका हो सकता है, शायद कुछ स्क्रिप्ट जो पहले फ़ाइल को अनजिप करती है, या svn diff पर कुछ प्लगइन।

आदर्श समाधान इस अनुमति होगी:

$ svn diff db-model.mwb 

या यहाँ तक कि मिलकर एक हो जाना का उपयोग कर:

$ meld db-model.mwb 

यह पूरा करने के क्या दृष्टिकोण के बारे में सोच सकते हैं? हो सकता है कि किसी और को सबवर्सन में संग्रहित टेक्स्ट फ़ाइलों के लिए diff को दिखाने की समस्या हो।

+0

, क्या तुमने कभी एक MWB है कि वास्तव में उपयोगी साबित हुआ की एक diff रेंडर करने के लिए एक तरह से खोजा था? –

+0

ब्रैड, दुर्भाग्य से मैंने नहीं किया। अधिकांशतः क्योंकि एक्सएमएल पेड़ में जेनरेट की गई आईडी होती है जो हर बार मॉडल बदल/अपडेट होने पर काफी बदल जाती है, इसलिए पेड़ों की तुलना करना बहुत असुविधाजनक था। हालांकि यह दो साल पहले था इसलिए चीजें बदल सकती थीं? – Oskar

+0

नहीं, चीजें अभी भी वही एक्सएमएल विकृति है जो वे हमेशा थीं। उन पीआरटी गुणों में अभी भी हर बचत पर परिवर्तन होता है, और ऐसा लगता है कि आसानी से पठनीय प्रारूप में उपलब्ध अन्य जानकारी नहीं है। डिफ अभी भी सैद्धांतिक रूप से संभव हैं, लेकिन यह करने के लिए काम की एक बड़ी मात्रा होगी। –

उत्तर

8

सबवर्सन आपको external differencing tools का उपयोग करने की अनुमति देता है। आप क्या कर सकते हैं एक रैपर स्क्रिप्ट लिखना है, और सबवर्जन को इसे "diff" कमांड के रूप में उपयोग करने के लिए कहें। आपका रैपर "बाएं" और "दाएं" फ़ाइल नामों को चुनने के लिए सबवर्सन से प्राप्त तर्कों का विश्लेषण करेगा, उन पर संचालित करें, और एक त्रुटि कोड लौटाएं जो सबवर्जन सफलता या विफलता के रूप में व्याख्या करेगा। आपके मामले में, रैपर एक्सएमएल फाइलों को अनजिप कर सकता है, और अनजिप किए गए परिणाम "diff" या अपनी पसंद के किसी अन्य टूल को पास कर सकता है।

सबवर्जन अलग-अलग फाइलों पर बाल्क करेगा जो उन्हें "बाइनरी" के रूप में पहचाने जाने के दौरान पहचाना गया था। "--force" विकल्प आपको इस चेक को ओवरराइड करने देता है, इसलिए इनपुट के बावजूद आपकी रैपर स्क्रिप्ट चलाया जाएगा फ़ाइलों को बाइनरी के रूप में चेक किया जाता है।

+0

धन्यवाद। बाहर निकलना मुश्किल था। जब तक फ़ाइल में svn नहीं होता है तब तक सबवर्जन किसी भी बाहरी differencing उपकरण को कॉल नहीं करेगा: mime-type प्रॉपर्टी 'गैर मानव-पठनीय' (मेरी ज़िप फ़ाइलों की तरह) पर सेट की गई है। लेकिन उस संपत्ति को हटाने से ज़िप फ़ाइल को बाइनरी फ़ाइल के रूप में संस्करणित नहीं किया जाएगा, जो इतना अच्छा नहीं है, है ना? – Oskar

+0

मैं संपत्ति को नहीं हटाऊंगा - एसवीएन को अन्य कारणों से इसकी आवश्यकता हो सकती है। क्या आपने अपनी diff wrapper स्क्रिप्ट चलाने के लिए एसवीएन प्राप्त करने के लिए "--force" विकल्प आज़माया था? –

+0

- बल ने चाल की है! – Oskar

2

मैंने वर्कबेंच फ़ाइलों के लिए एक diff स्क्रिप्ट लिखी है जिसे टोर्टोइज एसवीएन और टोर्टोइज गिट के साथ एकीकृत किया जा सकता है, जो जिम लुईस का सुझाव देगा: संग्रह से वास्तविक एक्सएमएल निकालें और इसे अलग करें।

स्क्रिप्ट सभी पीआरटी को भी खत्म कर देगा - diff में शोर को प्रमाणित करें। विलय संभव नहीं है और थोड़ा और अधिक जटिल हो जाएगा (की खोज कैसे ptr -attributes, कैसा व्यवहार करेंगे संग्रह में एक्सएमएल फिर से पैक, क्या संग्रह में अन्य मेटाडाटा के साथ है ?, ...)

अजगर स्क्रिप्ट 3.0 सीसी के तहत pastebin पर उपलब्ध है:

जिज्ञासा ऑस्कर से बाहर

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) 
+1

पायथन 3 को 'प्रिंट" के बजाय 'प्रिंट (" ") 'की आवश्यकता है। इसके अलावा 'os.tempnam' हटा दिया गया है, मैं इसके बजाय 'tempfile.mkdtemp' का उपयोग करता हूं। अंत में मुझे 'zipA.read (...)' को 'bytes.decode (zipA.read (" docu ... ") के साथ लपेटना पड़ा था। –

संबंधित मुद्दे