system76-edk2/Tools/Python/EdkIIWorkspace.py
mdkinney 8d4243f1bd 1) Update XmlRoutines.py to strip all whitespace
2) Add function to read section of an XML file
3) Add class to handle workspace relative paths
4) Add utility to manage target.txt
5) Add utility to manage FrameworkDatabase.db



git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2164 6f19259b-4bc3-4df7-8a09-765794883524
2007-01-04 01:07:52 +00:00

149 lines
5.3 KiB
Python

#!/usr/bin/env python
# This is the base class for applications that operate on an EDK II Workspace
import os, sys
from XmlRoutines import *
class EdkIIWorkspace:
def __init__(self):
"""Collect WorkspaceDir from the environment, the Verbose command line flag, and detect an icon bitmap file."""
if os.environ.get('WORKSPACE') == None:
print 'ERROR: WORKSPACE not defined. Please run EdkSetup from the EDK II install directory.'
return False
self.WorkspaceDir = os.path.realpath(os.environ.get('WORKSPACE'))
(Drive, Path) = os.path.splitdrive(self.WorkspaceDir)
if Drive == '':
(Drive, CwdPath) = os.path.splitdrive(os.getcwd())
if Drive != '':
self.WorkspaceDir = Drive + Path
else:
self.WorkspaceDir = Drive.upper() + Path
try:
self.Icon = wx.Icon(self.WorkspaceFile('tools/Python/TianoCoreOrgLogo.gif'),wx.BITMAP_TYPE_GIF)
except:
self.Icon = None
self.Verbose = False
for arg in sys.argv:
if arg.lower() == '-v':
self.Verbose = True
return True
def WorkspaceRelativePath(self, FileName):
"""Convert a full path filename to a workspace relative filename."""
FileName = os.path.realpath(FileName)
if FileName.find(self.WorkspaceDir) != 0:
return ''
return FileName.replace (self.WorkspaceDir, '').strip('\\').strip('/')
def WorkspaceFile(self, FileName):
"""Convert a workspace relative filename to a full path filename."""
return os.path.realpath(os.path.join(self.WorkspaceDir,FileName))
def XmlParseFile (self, FileName):
"""Parse an XML file into a DOM and return the DOM."""
if self.Verbose:
print FileName
return XmlParseFile (self.WorkspaceFile(FileName))
def XmlParseFileSection (self, FileName, SectionTag):
"""Parse a section of an XML file into a DOM(Document Object Model) and return the DOM."""
if self.Verbose:
print FileName
return XmlParseFileSection (self.WorkspaceFile(FileName), SectionTag)
def XmlSaveFile (self, Dom, FileName):
"""Save a DOM(Document Object Model) into an XML file."""
if self.Verbose:
print FileName
return XmlSaveFile (Dom, self.WorkspaceFile(FileName))
def ConvertTextFileToDictionary(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):
"""Convert a workspace relative text file to a dictionary of (name:value) pairs."""
if self.Verbose:
print FileName
return ConvertTextFileToDictionary(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)
def ConvertDictionaryToTextFile(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):
"""Convert a dictionary of (name:value) pairs to a workspace relative text file."""
if self.Verbose:
print FileName
return ConvertDictionaryToTextFile(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)
#
# Convert a text file to a dictionary
#
def ConvertTextFileToDictionary(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):
"""Convert a text file to a dictionary of (name:value) pairs."""
try:
f = open(FileName,'r')
except:
return False
Keys = []
for Line in f:
LineList = Line.split(KeySplitCharacter,1)
if len(LineList) >= 2:
Key = LineList[0].split()
if len(Key) == 1 and Key[0][0] != CommentCharacter and Key[0] not in Keys:
if ValueSplitFlag:
Dictionary[Key[0]] = LineList[1].replace('\\','/').split(ValueSplitCharacter)
else:
Dictionary[Key[0]] = LineList[1].strip().replace('\\','/')
Keys += [Key[0]]
f.close()
return True
def ConvertDictionaryToTextFile(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):
"""Convert a dictionary of (name:value) pairs to a text file."""
try:
f = open(FileName,'r')
Lines = []
Lines = f.readlines()
f.close()
except:
Lines = []
Keys = Dictionary.keys()
MaxLength = 0
for Key in Keys:
if len(Key) > MaxLength:
MaxLength = len(Key)
Index = 0
for Line in Lines:
LineList = Line.split(KeySplitCharacter,1)
if len(LineList) >= 2:
Key = LineList[0].split()
if len(Key) == 1 and Key[0][0] != CommentCharacter and Key[0] in Dictionary:
if ValueSplitFlag:
Line = '%-*s %c %s\n' % (MaxLength, Key[0], KeySplitCharacter, ' '.join(Dictionary[Key[0]]))
else:
Line = '%-*s %c %s\n' % (MaxLength, Key[0], KeySplitCharacter, Dictionary[Key[0]])
Lines.pop(Index)
if Key[0] in Keys:
Lines.insert(Index,Line)
Keys.remove(Key[0])
Index += 1
for RemainingKey in Keys:
if ValueSplitFlag:
Line = '%-*s %c %s\n' % (MaxLength, RemainingKey, KeySplitCharacter,' '.join(Dictionary[RemainingKey]))
else:
Line = '%-*s %c %s\n' % (MaxLength, RemainingKey, KeySplitCharacter, Dictionary[RemainingKey])
Lines.append(Line)
try:
f = open(FileName,'w')
except:
return False
f.writelines(Lines)
f.close()
return True
# This acts like the main() function for the script, unless it is 'import'ed into another
# script.
if __name__ == '__main__':
# Nothing to do here. Could do some unit tests.
pass