diff options
author | mdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524> | 2007-01-04 01:07:52 +0000 |
---|---|---|
committer | mdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524> | 2007-01-04 01:07:52 +0000 |
commit | 8d4243f1bd81497181a3cc135239422c43364105 (patch) | |
tree | 2e77e9d22c47002edf397bb38d7c86c6830d75c7 /Tools/Python/EdkIIWorkspace.py | |
parent | 64bbd2e3c6b72ed2377efd2df6f41ed16abba0a8 (diff) | |
download | edk2-platforms-8d4243f1bd81497181a3cc135239422c43364105.tar.xz |
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
Diffstat (limited to 'Tools/Python/EdkIIWorkspace.py')
-rw-r--r-- | Tools/Python/EdkIIWorkspace.py | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/Tools/Python/EdkIIWorkspace.py b/Tools/Python/EdkIIWorkspace.py new file mode 100644 index 0000000000..935ffadc09 --- /dev/null +++ b/Tools/Python/EdkIIWorkspace.py @@ -0,0 +1,148 @@ +#!/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 |