This patch clean some coding style issues, majorly for space character. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19080 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			320 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			320 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
## @file
 | 
						|
# This is the base class for applications that operate on an EDK II Workspace 
 | 
						|
#
 | 
						|
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
 | 
						|
# This program and the accompanying materials
 | 
						|
# are licensed and made available under the terms and conditions of the BSD License
 | 
						|
# which accompanies this distribution.  The full text of the license may be found at
 | 
						|
# http://opensource.org/licenses/bsd-license.php
 | 
						|
#
 | 
						|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
#
 | 
						|
 | 
						|
##
 | 
						|
# Import Modules
 | 
						|
#
 | 
						|
import Common.LongFilePathOs as os, sys, time
 | 
						|
from DataType import *
 | 
						|
from Common.LongFilePathSupport import OpenLongFilePath as open
 | 
						|
from Common.MultipleWorkspace import MultipleWorkspace as mws
 | 
						|
 | 
						|
## EdkIIWorkspace
 | 
						|
#
 | 
						|
# Collect WorkspaceDir from the environment, the Verbose command line flag, and detect an icon bitmap file.
 | 
						|
# 
 | 
						|
# @var StartTime:       Time of build system starting
 | 
						|
# @var PrintRunTime:    Printable time of build system running
 | 
						|
# @var PrintRunStatus:  Printable status of build system running
 | 
						|
# @var RunStatus:       Status of build system running
 | 
						|
#
 | 
						|
class EdkIIWorkspace:
 | 
						|
    def __init__(self):
 | 
						|
        self.StartTime = time.time()
 | 
						|
        self.PrintRunTime = False
 | 
						|
        self.PrintRunStatus = False
 | 
						|
        self.RunStatus = ''
 | 
						|
        
 | 
						|
        #
 | 
						|
        # Check environment valiable 'WORKSPACE'
 | 
						|
        #
 | 
						|
        if os.environ.get('WORKSPACE') == None:
 | 
						|
            print 'ERROR: WORKSPACE not defined.    Please run EdkSetup from the EDK II install directory.'
 | 
						|
            return False
 | 
						|
 | 
						|
        self.CurrentWorkingDir = os.getcwd()
 | 
						|
        
 | 
						|
        self.WorkspaceDir = os.path.realpath(os.environ.get('WORKSPACE'))
 | 
						|
        (Drive, Path) = os.path.splitdrive(self.WorkspaceDir)
 | 
						|
        if Drive == '':
 | 
						|
            (Drive, CwdPath) = os.path.splitdrive(self.CurrentWorkingDir)
 | 
						|
            if Drive != '':
 | 
						|
                self.WorkspaceDir = Drive + Path
 | 
						|
        else:
 | 
						|
            self.WorkspaceDir = Drive.upper() + Path
 | 
						|
 | 
						|
        self.WorkspaceRelativeWorkingDir = self.WorkspaceRelativePath (self.CurrentWorkingDir)
 | 
						|
            
 | 
						|
        try:
 | 
						|
            #
 | 
						|
            # Load TianoCoreOrgLogo, used for GUI tool
 | 
						|
            #
 | 
						|
            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
 | 
						|
    
 | 
						|
    ## Close build system
 | 
						|
    #
 | 
						|
    # Close build system and print running time and status
 | 
						|
    #
 | 
						|
    def Close(self):
 | 
						|
        if self.PrintRunTime:
 | 
						|
            Seconds = int(time.time() - self.StartTime)
 | 
						|
            if Seconds < 60:
 | 
						|
                print 'Run Time: %d seconds' % (Seconds)
 | 
						|
            else:
 | 
						|
                Minutes = Seconds / 60
 | 
						|
                Seconds = Seconds % 60
 | 
						|
                if Minutes < 60:
 | 
						|
                    print 'Run Time: %d minutes %d seconds' % (Minutes, Seconds)
 | 
						|
                else:
 | 
						|
                    Hours = Minutes / 60
 | 
						|
                    Minutes = Minutes % 60
 | 
						|
                    print 'Run Time: %d hours %d minutes %d seconds' % (Hours, Minutes, Seconds)
 | 
						|
        if self.RunStatus != '':
 | 
						|
            print self.RunStatus
 | 
						|
 | 
						|
    ## Convert to a workspace relative filename
 | 
						|
    #
 | 
						|
    # Convert a full path filename to a workspace relative filename.
 | 
						|
    #
 | 
						|
    # @param FileName:  The filename to be Converted
 | 
						|
    #
 | 
						|
    # @retval None    Workspace dir is not found in the full path
 | 
						|
    # @retval string  The relative filename
 | 
						|
    #
 | 
						|
    def WorkspaceRelativePath(self, FileName):
 | 
						|
        FileName = os.path.realpath(FileName)
 | 
						|
        if FileName.find(self.WorkspaceDir) != 0:
 | 
						|
            return None
 | 
						|
        return FileName.replace (self.WorkspaceDir, '').strip('\\').strip('/')
 | 
						|
 | 
						|
    ## Convert to a full path filename
 | 
						|
    #
 | 
						|
    # Convert a workspace relative filename to a full path filename.
 | 
						|
    #
 | 
						|
    # @param FileName:  The filename to be Converted
 | 
						|
    #
 | 
						|
    # @retval string  The full path filename
 | 
						|
    #
 | 
						|
    def WorkspaceFile(self, FileName):
 | 
						|
        return os.path.realpath(mws.join(self.WorkspaceDir,FileName))
 | 
						|
 | 
						|
    ## Convert to a real path filename
 | 
						|
    #
 | 
						|
    # Convert ${WORKSPACE} to real path
 | 
						|
    #
 | 
						|
    # @param FileName:  The filename to be Converted
 | 
						|
    #
 | 
						|
    # @retval string  The full path filename
 | 
						|
    #
 | 
						|
    def WorkspacePathConvert(self, FileName):
 | 
						|
        return os.path.realpath(FileName.replace(TAB_WORKSPACE, self.WorkspaceDir))
 | 
						|
 | 
						|
    ## Convert XML into a DOM
 | 
						|
    #
 | 
						|
    # Parse an XML file into a DOM and return the DOM.
 | 
						|
    #
 | 
						|
    # @param FileName:  The filename to be parsed
 | 
						|
    #
 | 
						|
    # @retval XmlParseFile (self.WorkspaceFile(FileName))
 | 
						|
    #
 | 
						|
    def XmlParseFile (self, FileName):
 | 
						|
        if self.Verbose:
 | 
						|
            print FileName
 | 
						|
        return XmlParseFile (self.WorkspaceFile(FileName))
 | 
						|
 | 
						|
    ## Convert a XML section
 | 
						|
    #
 | 
						|
    # Parse a section of an XML file into a DOM(Document Object Model) and return the DOM.
 | 
						|
    #
 | 
						|
    # @param FileName:    The filename to be parsed
 | 
						|
    # @param SectionTag:  The tag name of the section to be parsed
 | 
						|
    #
 | 
						|
    # @retval XmlParseFileSection (self.WorkspaceFile(FileName), SectionTag)
 | 
						|
    #
 | 
						|
    def XmlParseFileSection (self, FileName, SectionTag):
 | 
						|
        if self.Verbose:
 | 
						|
            print FileName
 | 
						|
        return XmlParseFileSection (self.WorkspaceFile(FileName), SectionTag)
 | 
						|
 | 
						|
    ## Save a XML file
 | 
						|
    #
 | 
						|
    # Save a DOM(Document Object Model) into an XML file.
 | 
						|
    #
 | 
						|
    # @param Dom:       The Dom to be saved
 | 
						|
    # @param FileName:  The filename
 | 
						|
    #
 | 
						|
    # @retval XmlSaveFile (Dom, self.WorkspaceFile(FileName))
 | 
						|
    #
 | 
						|
    def XmlSaveFile (self, Dom, FileName):
 | 
						|
        if self.Verbose:
 | 
						|
            print FileName
 | 
						|
        return XmlSaveFile (Dom, self.WorkspaceFile(FileName))
 | 
						|
 | 
						|
    ## Convert Text File To Dictionary
 | 
						|
    #
 | 
						|
    # Convert a workspace relative text file to a dictionary of (name:value) pairs.
 | 
						|
    #
 | 
						|
    # @param FileName:             Text filename
 | 
						|
    # @param Dictionary:           Dictionary to store data
 | 
						|
    # @param CommentCharacter:     Comment char, be used to ignore comment content
 | 
						|
    # @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char
 | 
						|
    # @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values
 | 
						|
    # @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char
 | 
						|
    #
 | 
						|
    # @retval ConvertTextFileToDictionary(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)
 | 
						|
    #
 | 
						|
    def ConvertTextFileToDictionary(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):
 | 
						|
        if self.Verbose:
 | 
						|
            print FileName
 | 
						|
        return ConvertTextFileToDictionary(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)
 | 
						|
 | 
						|
    ## Convert Dictionary To Text File
 | 
						|
    #
 | 
						|
    # Convert a dictionary of (name:value) pairs to a workspace relative text file.
 | 
						|
    #
 | 
						|
    # @param FileName:             Text filename
 | 
						|
    # @param Dictionary:           Dictionary to store data
 | 
						|
    # @param CommentCharacter:     Comment char, be used to ignore comment content
 | 
						|
    # @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char
 | 
						|
    # @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values
 | 
						|
    # @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char
 | 
						|
    #
 | 
						|
    # @retval ConvertDictionaryToTextFile(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)
 | 
						|
    #
 | 
						|
    def ConvertDictionaryToTextFile(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):
 | 
						|
        if self.Verbose:
 | 
						|
            print FileName
 | 
						|
        return ConvertDictionaryToTextFile(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)
 | 
						|
 | 
						|
## Convert Text File To Dictionary
 | 
						|
#
 | 
						|
# Convert a text file to a dictionary of (name:value) pairs.
 | 
						|
#
 | 
						|
# @param FileName:             Text filename
 | 
						|
# @param Dictionary:           Dictionary to store data
 | 
						|
# @param CommentCharacter:     Comment char, be used to ignore comment content
 | 
						|
# @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char
 | 
						|
# @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values
 | 
						|
# @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char
 | 
						|
#
 | 
						|
# @retval True  Convert successfully
 | 
						|
# @retval False Open file failed
 | 
						|
#
 | 
						|
def ConvertTextFileToDictionary(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):
 | 
						|
    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
 | 
						|
 | 
						|
## Convert Dictionary To Text File
 | 
						|
#
 | 
						|
# Convert a dictionary of (name:value) pairs to a text file.
 | 
						|
#
 | 
						|
# @param FileName:             Text filename
 | 
						|
# @param Dictionary:           Dictionary to store data
 | 
						|
# @param CommentCharacter:     Comment char, be used to ignore comment content
 | 
						|
# @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char
 | 
						|
# @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values
 | 
						|
# @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char
 | 
						|
#
 | 
						|
# @retval True  Convert successfully
 | 
						|
# @retval False Open file failed
 | 
						|
#
 | 
						|
def ConvertDictionaryToTextFile(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):
 | 
						|
    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
 | 
						|
 | 
						|
## Create a new directory
 | 
						|
#
 | 
						|
# @param Directory:           Directory to be created
 | 
						|
#
 | 
						|
def CreateDirectory(Directory):
 | 
						|
    if not os.access(Directory, os.F_OK):
 | 
						|
        os.makedirs (Directory)
 | 
						|
 | 
						|
## Create a new file
 | 
						|
#
 | 
						|
# @param Directory:  Directory to be created
 | 
						|
# @param FileName:   Filename to be created
 | 
						|
# @param Mode:       The mode of open file, defautl is 'w'
 | 
						|
#
 | 
						|
def CreateFile(Directory, FileName, Mode='w'):
 | 
						|
    CreateDirectory (Directory)
 | 
						|
    return open(os.path.join(Directory, FileName), Mode)
 | 
						|
 | 
						|
##
 | 
						|
#
 | 
						|
# 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 |