def main(): import hkcToDom import headerToDom master = headerToDom.headerToDom( r'E:\DEV\serialize\havok\source\hkbase\class\hkClass.h' ) edited = hkcToDom.hkcToDom( "edited.hkclass" ) print >>open("master.hkclass","w"), bindingToXml.bindingToXml("file",master.file) rejectFileName = "masterXml.rej" print >>open(rejectFileName,"w"), '\n'.join(mergeBind(master.file, edited.file, master.name)) print >>open("merged.hkclass","w"), bindingToXml.bindingToXml("file",master.file)
def headerToClass(headerfile, options): if options.verbose: print "Processing '%s'" % headerfile classfile = headerfile.replace(".h", ".hkclass") master = headerToDom.headerToDom(headerfile) if options.verbose: print "Found:", ", ".join([c.name for c in master.file._class]) if os.path.exists(classfile): edited = hkcToDom.hkcToDom(classfile) rejects = mergeBind.mergeBind(master.file, edited.file, master.name) if len(rejects): rejfile = "%s.rej" % classfile open(rejfile, "a").write("\n".join(rejects) + "\n") print "%s:1:Conflicts found" % headerfile pch_file = options.pch_file cppfile = master.file.destinationFilename( master.origfilename, "Class%s.cpp" % options.version_suffix) if master.file.overridedestination: pch_file = hkcToDom.Document(cppfile).pchfile try: cpptext = domToClass.domToClass(master, collectAll=False, pchfile=pch_file) except: print "Error in: " + headerfile raise try: writeIfDifferent(cpptext, cppfile, options.force_output) except IOError: print "Error in: %(headerfile)s\n\nDestination class file path is wrong:\n%(cppfile)s.\n" % locals( ) raise if options.dump_xml: xmltext = bindingToXml.bindingToXml("document", master) try: xmlfile = genPathToFile( headerfile.replace(".h", "Class%s.xml" % options.version_suffix), destSpecifier) writeIfDifferent(xmltext, xmlfile, options.force_output) except IOError: print "Error in: %(headerfile)s\n\nDestination class file path is wrong:\n%(xmlfile)s.\n" % locals( ) raise if options.cvsignore: removeFromCvsignore(headerfile) addToCvsignore(cppfile) addToCvsignore(classfile)
def headerToClass(headerfile, options): if options.verbose: print "Processing '%s'" % headerfile classfile = headerfile.replace(".h", ".hkclass") master = headerToDom.headerToDom(headerfile) if options.verbose: print "Found:", ", ".join( [c.name for c in master.file._class] ) if os.path.exists(classfile): edited = hkcToDom.hkcToDom(classfile) rejects = mergeBind.mergeBind(master.file, edited.file, master.name) if len(rejects): rejfile = "%s.rej" % classfile open(rejfile,"a").write( "\n".join(rejects)+"\n" ) print "%s:1:Conflicts found" % headerfile pch_file = options.pch_file cppfile = master.file.destinationFilename(master.origfilename, "Class%s.cpp" % options.version_suffix ) if master.file.overridedestination: pch_file = hkcToDom.Document(cppfile).pchfile try: cpptext = domToClass.domToClass(master, collectAll=False, pchfile=pch_file) except: print "Error in: " + headerfile raise try: writeIfDifferent( cpptext, cppfile, options.force_output ) except IOError: print "Error in: %(headerfile)s\n\nDestination class file path is wrong:\n%(cppfile)s.\n" % locals() raise if options.dump_xml: xmltext = bindingToXml.bindingToXml("document",master) try: xmlfile = genPathToFile(headerfile.replace(".h", "Class%s.xml" % options.version_suffix ), destSpecifier) writeIfDifferent( xmltext, xmlfile, options.force_output ) except IOError: print "Error in: %(headerfile)s\n\nDestination class file path is wrong:\n%(xmlfile)s.\n" % locals() raise if options.cvsignore: removeFromCvsignore(headerfile) addToCvsignore(cppfile) addToCvsignore(classfile)
def mergeBind(master, edited, context): """Merge changes from "edited" into "master" """ rejects = [] for slot in master.__slots__: mitem = getattr(master, slot) eitem = getattr(edited, slot) if type(mitem) in (type(""), type(u"")): if not mitem: setattr(master, slot, eitem) elif mitem != eitem: rejects.append("<!-- +++CONFLICT+++\t(%s.%s)\n%s\n%s\n-->" % (context, slot, mitem, eitem)) elif type(mitem) in (type(0), type(0.0)): if mitem != eitem: rejects.append("<!-- +++CONFLICT+++\t(%s.%s)\n%s\n%s\n-->" % (context, slot, mitem, eitem)) elif type(mitem) == type([]): edict = {} for e in eitem: edict[e.name] = e for m in mitem: #print '\n\n\n slot:%s\n e: %s\n eitem: %s\n m: %s\n mitem: %s' % (slot, e,eitem,m,mitem) e = edict.get(m.name, None) if e: eitem.remove(e) rejects += mergeBind(m, e, '%s.%s' % (context, m.name)) for e in eitem: rejects.append( "<!-- +++UNUSED+++\t(%s.%s)\n%s\n-->" % (context, slot, bindingToXml.bindingToXml(slot, e))) elif mitem: rejects += mergeBind(mitem, eitem, '%s.%s' % (context, mitem.name)) elif eitem: setattr(master, slot, eitem) return rejects
def mergeBind(master, edited, context): """Merge changes from "edited" into "master" """ rejects = [] for slot in master.__slots__: mitem = getattr(master,slot) eitem = getattr(edited,slot) if type(mitem) in (type(""), type(u"")): if not mitem: setattr(master, slot, eitem) elif mitem != eitem: rejects.append("<!-- +++CONFLICT+++\t(%s.%s)\n%s\n%s\n-->" % (context, slot, mitem, eitem)) elif type(mitem) in (type(0), type(0.0)): if mitem != eitem: rejects.append("<!-- +++CONFLICT+++\t(%s.%s)\n%s\n%s\n-->" % (context, slot, mitem, eitem)) elif type(mitem) == type([]): edict = {} for e in eitem: edict[e.name] = e for m in mitem: #print '\n\n\n slot:%s\n e: %s\n eitem: %s\n m: %s\n mitem: %s' % (slot, e,eitem,m,mitem) e = edict.get(m.name, None) if e: eitem.remove(e) rejects += mergeBind(m,e,'%s.%s' % (context, m.name)) for e in eitem: rejects.append("<!-- +++UNUSED+++\t(%s.%s)\n%s\n-->" % (context, slot, bindingToXml.bindingToXml(slot,e))) elif mitem: rejects += mergeBind(mitem, eitem,'%s.%s' % (context, mitem.name)) elif eitem: setattr(master, slot, eitem) return rejects