Update error message of installation failure to avoid confusion. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hess Chen <hesheng.chen@intel.com> Reviewed-by: lhauch <larry.hauch@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17661 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			970 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			970 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # Install distribution package.
 | |
| #
 | |
| # Copyright (c) 2011 - 2015, 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.
 | |
| #
 | |
| """
 | |
| Install a distribution package
 | |
| """
 | |
| ##
 | |
| # Import Modules
 | |
| #
 | |
| from Core.FileHook import __FileHookOpen__
 | |
| import os.path
 | |
| from os import chmod
 | |
| from os import SEEK_SET
 | |
| from os import SEEK_END
 | |
| import stat
 | |
| import md5
 | |
| import copy
 | |
| from sys import stdin
 | |
| from sys import platform
 | |
| from shutil import rmtree
 | |
| from shutil import copyfile
 | |
| from traceback import format_exc
 | |
| from platform import python_version
 | |
| 
 | |
| from Logger import StringTable as ST
 | |
| from Logger.ToolError import UNKNOWN_ERROR
 | |
| from Logger.ToolError import FILE_UNKNOWN_ERROR
 | |
| from Logger.ToolError import OPTION_MISSING
 | |
| from Logger.ToolError import UPT_ALREADY_INSTALLED_ERROR
 | |
| from Logger.ToolError import FatalError
 | |
| from Logger.ToolError import ABORT_ERROR
 | |
| from Logger.ToolError import CODE_ERROR
 | |
| from Logger.ToolError import FORMAT_INVALID
 | |
| from Logger.ToolError import FILE_TYPE_MISMATCH
 | |
| import Logger.Log as Logger
 | |
| 
 | |
| from Library.Misc import Sdict
 | |
| from Library.Misc import ConvertPath
 | |
| from Library.ParserValidate import IsValidInstallPath
 | |
| from Xml.XmlParser import DistributionPackageXml
 | |
| from GenMetaFile.GenDecFile import PackageToDec
 | |
| from GenMetaFile.GenInfFile import ModuleToInf
 | |
| from Core.PackageFile import PackageFile
 | |
| from Core.PackageFile import FILE_NOT_FOUND
 | |
| from Core.PackageFile import FILE_CHECKSUM_FAILURE
 | |
| from Core.PackageFile import CreateDirectory
 | |
| from Core.DependencyRules import DependencyRules
 | |
| from Library import GlobalData
 | |
| 
 | |
| ## InstallNewPackage
 | |
| #
 | |
| # @param WorkspaceDir:   Workspace Directory
 | |
| # @param Path:           Package Path
 | |
| # @param CustomPath:     whether need to customize path at first
 | |
| #
 | |
| def InstallNewPackage(WorkspaceDir, Path, CustomPath = False):
 | |
|     if os.path.isabs(Path):
 | |
|         Logger.Info(ST.MSG_RELATIVE_PATH_ONLY%Path)
 | |
|     elif CustomPath:
 | |
|         Logger.Info(ST.MSG_NEW_PKG_PATH)
 | |
|     else:
 | |
|         Path = ConvertPath(Path)
 | |
|         Path = os.path.normpath(Path)
 | |
|         FullPath = os.path.normpath(os.path.join(WorkspaceDir, Path))
 | |
|         if os.path.exists(FullPath):
 | |
|             Logger.Info(ST.ERR_DIR_ALREADY_EXIST%FullPath)
 | |
|         else:
 | |
|             return Path
 | |
| 
 | |
|     Input = stdin.readline()
 | |
|     Input = Input.replace('\r', '').replace('\n', '')
 | |
|     if Input == '':
 | |
|         Logger.Error("InstallPkg", UNKNOWN_ERROR, ST.ERR_USER_INTERRUPT)
 | |
|     Input = Input.replace('\r', '').replace('\n', '')
 | |
|     return InstallNewPackage(WorkspaceDir, Input, False)
 | |
| 
 | |
| ## InstallNewModule
 | |
| #
 | |
| # @param WorkspaceDir:   Workspace Directory
 | |
| # @param Path:           Standalone Module Path
 | |
| # @param PathList:       The already installed standalone module Path list
 | |
| #
 | |
| def InstallNewModule(WorkspaceDir, Path, PathList = None):
 | |
|     if PathList == None:
 | |
|         PathList = []
 | |
|     Path = ConvertPath(Path)
 | |
|     Path = os.path.normpath(Path)
 | |
|     FullPath = os.path.normpath(os.path.join(WorkspaceDir, Path))
 | |
|     if os.path.exists(FullPath) and FullPath not in PathList:
 | |
|         Logger.Info(ST.ERR_DIR_ALREADY_EXIST%Path)
 | |
|     elif Path == FullPath:
 | |
|         Logger.Info(ST.MSG_RELATIVE_PATH_ONLY%FullPath)
 | |
|     else:
 | |
|         return Path
 | |
|     
 | |
|     Input = stdin.readline()
 | |
|     Input = Input.replace('\r', '').replace('\n', '')
 | |
|     if Input == '':
 | |
|         Logger.Error("InstallPkg", UNKNOWN_ERROR, ST.ERR_USER_INTERRUPT)
 | |
|     Input = Input.replace('\r', '').replace('\n', '')
 | |
|     return InstallNewModule(WorkspaceDir, Input, PathList)
 | |
| 
 | |
|     
 | |
| ## InstallNewFile
 | |
| #
 | |
| # @param WorkspaceDir:   Workspace Direction
 | |
| # @param File:      File
 | |
| #
 | |
| def InstallNewFile(WorkspaceDir, File):
 | |
|     FullPath = os.path.normpath(os.path.join(WorkspaceDir, File))
 | |
|     if os.path.exists(FullPath):
 | |
|         Logger.Info(ST.ERR_FILE_ALREADY_EXIST %File)
 | |
|         Input = stdin.readline()
 | |
|         Input = Input.replace('\r', '').replace('\n', '')
 | |
|         if Input == '':
 | |
|             Logger.Error("InstallPkg", UNKNOWN_ERROR, ST.ERR_USER_INTERRUPT)
 | |
|         Input = Input.replace('\r', '').replace('\n', '')
 | |
|         return InstallNewFile(WorkspaceDir, Input)
 | |
|     else:
 | |
|         return File
 | |
| 
 | |
| ## UnZipDp
 | |
| #
 | |
| # UnZipDp
 | |
| #
 | |
| def UnZipDp(WorkspaceDir, DpPkgFileName):
 | |
|     ContentZipFile = None
 | |
|     Logger.Quiet(ST.MSG_UZIP_PARSE_XML)
 | |
|     DistFile = PackageFile(DpPkgFileName)
 | |
|     
 | |
|     DpDescFileName, ContentFileName = GetDPFile(DistFile.GetZipFile())
 | |
|     
 | |
|     GlobalData.gUNPACK_DIR = os.path.normpath(os.path.join(WorkspaceDir, ".tmp"))
 | |
|     DistPkgFile = DistFile.UnpackFile(DpDescFileName,
 | |
|         os.path.normpath(os.path.join(GlobalData.gUNPACK_DIR, DpDescFileName)))
 | |
|     if not DistPkgFile:
 | |
|         Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_FILE_BROKEN %DpDescFileName)
 | |
|     
 | |
|     #
 | |
|     # Generate distpkg
 | |
|     #
 | |
|     DistPkgObj = DistributionPackageXml()
 | |
|     DistPkg = DistPkgObj.FromXml(DistPkgFile)
 | |
|     if DistPkg.Header.RePackage == '':
 | |
|         DistPkg.Header.RePackage = False
 | |
|     if DistPkg.Header.ReadOnly == '':
 | |
|         DistPkg.Header.ReadOnly = False
 | |
| 
 | |
|     #
 | |
|     # unzip contents.zip file
 | |
|     #
 | |
|     ContentFile = DistFile.UnpackFile(ContentFileName,
 | |
|         os.path.normpath(os.path.join(GlobalData.gUNPACK_DIR, ContentFileName)))
 | |
|     if not ContentFile:
 | |
|         Logger.Error("InstallPkg", FILE_NOT_FOUND,
 | |
|             ST.ERR_FILE_BROKEN % ContentFileName)
 | |
| 
 | |
|     FilePointer = __FileHookOpen__(ContentFile, "rb")
 | |
|     #
 | |
|     # Assume no archive comment.
 | |
|     #
 | |
|     FilePointer.seek(0, SEEK_SET)
 | |
|     FilePointer.seek(0, SEEK_END)
 | |
|     #
 | |
|     # Get file size
 | |
|     #                
 | |
|     FileSize = FilePointer.tell()
 | |
|     FilePointer.close()
 | |
|                
 | |
|     if FileSize != 0:        
 | |
|         ContentZipFile = PackageFile(ContentFile)
 | |
| 
 | |
|     #
 | |
|     # verify MD5 signature when existed
 | |
|     #
 | |
|     if DistPkg.Header.Signature != '':
 | |
|         Md5Sigature = md5.new(__FileHookOpen__(ContentFile, 'rb').read())
 | |
|         if DistPkg.Header.Signature != Md5Sigature.hexdigest():
 | |
|             ContentZipFile.Close()
 | |
|             Logger.Error("InstallPkg", FILE_CHECKSUM_FAILURE,
 | |
|                 ExtraData=ContentFile)
 | |
| 
 | |
|     return DistPkg, ContentZipFile, DpPkgFileName, DistFile
 | |
| 
 | |
| ## GetPackageList
 | |
| #
 | |
| # GetPackageList
 | |
| #
 | |
| def GetPackageList(DistPkg, Dep, WorkspaceDir, Options, ContentZipFile, ModuleList, PackageList):
 | |
|     NewDict = Sdict()
 | |
|     for Guid, Version, Path in DistPkg.PackageSurfaceArea:
 | |
|         PackagePath = Path
 | |
|         Package = DistPkg.PackageSurfaceArea[Guid, Version, Path]
 | |
|         Logger.Info(ST.MSG_INSTALL_PACKAGE % Package.GetName())
 | |
|         if Dep.CheckPackageExists(Guid, Version):
 | |
|             Logger.Info(ST.WRN_PACKAGE_EXISTED %(Guid, Version))
 | |
|         if Options.UseGuidedPkgPath:
 | |
|             GuidedPkgPath = "%s_%s_%s" % (Package.GetName(), Guid, Version)
 | |
|             NewPackagePath = InstallNewPackage(WorkspaceDir, GuidedPkgPath, Options.CustomPath)
 | |
|         else:
 | |
|             NewPackagePath = InstallNewPackage(WorkspaceDir, PackagePath, Options.CustomPath)
 | |
|         InstallPackageContent(PackagePath, NewPackagePath, Package, ContentZipFile, Dep, WorkspaceDir, ModuleList, 
 | |
|                               DistPkg.Header.ReadOnly)
 | |
|         PackageList.append(Package)
 | |
|         
 | |
|         NewDict[Guid, Version, Package.GetPackagePath()] = Package
 | |
|     
 | |
|     #
 | |
|     # Now generate meta-data files, first generate all dec for package
 | |
|     # dec should be generated before inf, and inf should be generated after
 | |
|     # all packages installed, else hard to resolve modules' package
 | |
|     # dependency (Hard to get the location of the newly installed package)
 | |
|     #
 | |
|     for Package in PackageList:
 | |
|         FilePath = PackageToDec(Package, DistPkg.Header)
 | |
|         Md5Sigature = md5.new(__FileHookOpen__(str(FilePath), 'rb').read())
 | |
|         Md5Sum = Md5Sigature.hexdigest()
 | |
|         if (FilePath, Md5Sum) not in Package.FileList:
 | |
|             Package.FileList.append((FilePath, Md5Sum))
 | |
|     
 | |
|     return NewDict
 | |
| 
 | |
| ## GetModuleList
 | |
| #
 | |
| # GetModuleList
 | |
| #
 | |
| def GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList):
 | |
|     #
 | |
|     # ModulePathList will keep track of the standalone module path that
 | |
|     # we just installed. If a new module's path in that list 
 | |
|     # (only multiple INF in one directory will be so), we will 
 | |
|     # install them directly. If not, we will try to create a new directory 
 | |
|     # for it.
 | |
|     #
 | |
|     ModulePathList = []
 | |
|     
 | |
|     #
 | |
|     # Check module exist and install
 | |
|     #
 | |
|     Module = None
 | |
|     NewDict = Sdict()        
 | |
|     for Guid, Version, Name, Path in DistPkg.ModuleSurfaceArea:
 | |
|         ModulePath = Path
 | |
|         Module = DistPkg.ModuleSurfaceArea[Guid, Version, Name, Path]
 | |
|         Logger.Info(ST.MSG_INSTALL_MODULE % Module.GetName())
 | |
|         if Dep.CheckModuleExists(Guid, Version, Name, Path):
 | |
|             Logger.Quiet(ST.WRN_MODULE_EXISTED %Path)
 | |
|         #
 | |
|         # here check for the multiple inf share the same module path cases:
 | |
|         # they should be installed into the same directory
 | |
|         #
 | |
|         ModuleFullPath = \
 | |
|         os.path.normpath(os.path.join(WorkspaceDir, ModulePath))
 | |
|         if ModuleFullPath not in ModulePathList:
 | |
|             NewModulePath = InstallNewModule(WorkspaceDir, ModulePath, ModulePathList)
 | |
|             NewModuleFullPath = os.path.normpath(os.path.join(WorkspaceDir, NewModulePath))
 | |
|             ModulePathList.append(NewModuleFullPath)
 | |
|         else:
 | |
|             NewModulePath = ModulePath
 | |
|         
 | |
|         InstallModuleContent(ModulePath, NewModulePath, '', Module, ContentZipFile, WorkspaceDir, ModuleList, None, 
 | |
|                              DistPkg.Header.ReadOnly)
 | |
|         #
 | |
|         # Update module
 | |
|         #
 | |
|         Module.SetModulePath(Module.GetModulePath().replace(Path, NewModulePath, 1))
 | |
|         
 | |
|         NewDict[Guid, Version, Name, Module.GetModulePath()] = Module
 | |
| 
 | |
|     #
 | |
|     # generate all inf for modules
 | |
|     #
 | |
|     for (Module, Package) in ModuleList:
 | |
|         CheckCNameInModuleRedefined(Module, DistPkg)
 | |
|         FilePath = ModuleToInf(Module, Package, DistPkg.Header)
 | |
|         Md5Sigature = md5.new(__FileHookOpen__(str(FilePath), 'rb').read())
 | |
|         Md5Sum = Md5Sigature.hexdigest()
 | |
|         if Package:
 | |
|             if (FilePath, Md5Sum) not in Package.FileList:
 | |
|                 Package.FileList.append((FilePath, Md5Sum))
 | |
|         else:
 | |
|             if (FilePath, Md5Sum) not in Module.FileList:
 | |
|                 Module.FileList.append((FilePath, Md5Sum))
 | |
|         #
 | |
|         # append the module unicode files to Package FileList
 | |
|         #
 | |
|         for (FilePath, Md5Sum) in Module.FileList:
 | |
|             if str(FilePath).endswith('.uni') and Package and (FilePath, Md5Sum) not in Package.FileList:
 | |
|                 Package.FileList.append((FilePath, Md5Sum))
 | |
|     
 | |
|     return NewDict
 | |
| 
 | |
| ##
 | |
| # Get all protocol/ppi/guid CNames and pcd name from all dependent DEC file
 | |
| #
 | |
| def GetDepProtocolPpiGuidPcdNames(DePackageObjList):
 | |
|     #
 | |
|     # [[Dec1Protocol1, Dec1Protocol2...], [Dec2Protocols...],...]
 | |
|     #
 | |
|     DependentProtocolCNames = []
 | |
|     DependentPpiCNames = []
 | |
|     DependentGuidCNames = []
 | |
|     DependentPcdNames = []
 | |
|     
 | |
|     for PackageObj in DePackageObjList:
 | |
|         #
 | |
|         # Get protocol CName list from all dependent DEC file
 | |
|         #
 | |
|         ProtocolCNames = []
 | |
|         for Protocol in PackageObj.GetProtocolList():
 | |
|             if Protocol.GetCName() not in ProtocolCNames:
 | |
|                 ProtocolCNames.append(Protocol.GetCName())
 | |
|   
 | |
|         DependentProtocolCNames.append(ProtocolCNames)
 | |
|             
 | |
|         #
 | |
|         # Get Ppi CName list from all dependent DEC file
 | |
|         #            
 | |
|         PpiCNames = []
 | |
|         for Ppi in PackageObj.GetPpiList():
 | |
|             if Ppi.GetCName() not in PpiCNames:
 | |
|                 PpiCNames.append(Ppi.GetCName())
 | |
| 
 | |
|         DependentPpiCNames.append(PpiCNames)
 | |
|             
 | |
|         #
 | |
|         # Get Guid CName list from all dependent DEC file
 | |
|         #      
 | |
|         GuidCNames = []
 | |
|         for Guid in PackageObj.GetGuidList():
 | |
|             if Guid.GetCName() not in GuidCNames:
 | |
|                 GuidCNames.append(Guid.GetCName())
 | |
|         
 | |
|         DependentGuidCNames.append(GuidCNames)
 | |
|         
 | |
|         #
 | |
|         # Get PcdName list from all dependent DEC file
 | |
|         #
 | |
|         PcdNames = []
 | |
|         for Pcd in PackageObj.GetPcdList():
 | |
|             PcdName = '.'.join([Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName()])
 | |
|             if PcdName not in PcdNames:
 | |
|                 PcdNames.append(PcdName)
 | |
|         
 | |
|         DependentPcdNames.append(PcdNames)
 | |
|                 
 | |
|             
 | |
|     return DependentProtocolCNames, DependentPpiCNames, DependentGuidCNames, DependentPcdNames
 | |
| 
 | |
| ##
 | |
| # Check if protocol CName is redefined
 | |
| #
 | |
| def CheckProtoclCNameRedefined(Module, DependentProtocolCNames):
 | |
|     for ProtocolInModule in Module.GetProtocolList():
 | |
|         IsCNameDefined = False
 | |
|         for PackageProtocolCNames in DependentProtocolCNames:
 | |
|             if ProtocolInModule.GetCName() in PackageProtocolCNames:
 | |
|                 if IsCNameDefined:
 | |
|                     Logger.Error("\nUPT", FORMAT_INVALID, 
 | |
|                                  File = Module.GetFullPath(), 
 | |
|                                  ExtraData = \
 | |
|                                  ST.ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC % ProtocolInModule.GetCName())
 | |
|                 else:
 | |
|                     IsCNameDefined = True
 | |
| 
 | |
| ##
 | |
| # Check if Ppi CName is redefined
 | |
| #
 | |
| def CheckPpiCNameRedefined(Module, DependentPpiCNames):
 | |
|     for PpiInModule in Module.GetPpiList():
 | |
|         IsCNameDefined = False
 | |
|         for PackagePpiCNames in DependentPpiCNames:
 | |
|             if PpiInModule.GetCName() in PackagePpiCNames:
 | |
|                 if IsCNameDefined:
 | |
|                     Logger.Error("\nUPT", FORMAT_INVALID, 
 | |
|                                  File = Module.GetFullPath(), 
 | |
|                                  ExtraData = ST.ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC % PpiInModule.GetCName())
 | |
|                 else:
 | |
|                     IsCNameDefined = True    
 | |
| 
 | |
| ##
 | |
| # Check if Guid CName is redefined
 | |
| #
 | |
| def CheckGuidCNameRedefined(Module, DependentGuidCNames):
 | |
|     for GuidInModule in Module.GetGuidList():
 | |
|         IsCNameDefined = False
 | |
|         for PackageGuidCNames in DependentGuidCNames:
 | |
|             if GuidInModule.GetCName() in PackageGuidCNames:
 | |
|                 if IsCNameDefined:
 | |
|                     Logger.Error("\nUPT", FORMAT_INVALID, 
 | |
|                                  File = Module.GetFullPath(), 
 | |
|                                  ExtraData = \
 | |
|                                  ST.ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC % GuidInModule.GetCName())
 | |
|                 else:
 | |
|                     IsCNameDefined = True
 | |
| 
 | |
| ##
 | |
| # Check if PcdName is redefined
 | |
| #
 | |
| def CheckPcdNameRedefined(Module, DependentPcdNames):
 | |
|     PcdObjs = []
 | |
|     if not Module.GetBinaryFileList():
 | |
|         PcdObjs += Module.GetPcdList()
 | |
|     else:
 | |
|         Binary = Module.GetBinaryFileList()[0]
 | |
|         for AsBuild in Binary.GetAsBuiltList():
 | |
|             PcdObjs += AsBuild.GetPatchPcdList() + AsBuild.GetPcdExList()
 | |
| 
 | |
|     for PcdObj in PcdObjs:
 | |
|         PcdName = '.'.join([PcdObj.GetTokenSpaceGuidCName(), PcdObj.GetCName()])
 | |
|         IsPcdNameDefined = False
 | |
|         for PcdNames in DependentPcdNames:
 | |
|             if PcdName in PcdNames:
 | |
|                 if IsPcdNameDefined:
 | |
|                     Logger.Error("\nUPT", FORMAT_INVALID, 
 | |
|                                  File = Module.GetFullPath(), 
 | |
|                                  ExtraData = ST.ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC % PcdName)
 | |
|                 else:
 | |
|                     IsPcdNameDefined = True
 | |
| 
 | |
| ##
 | |
| # Check if any Protocol/Ppi/Guid and Pcd name is redefined in its dependent DEC files
 | |
| #
 | |
| def CheckCNameInModuleRedefined(Module, DistPkg):
 | |
|     DePackageObjList = []
 | |
|     #
 | |
|     # Get all dependent package objects
 | |
|     # 
 | |
|     for Obj in Module.GetPackageDependencyList():
 | |
|         Guid = Obj.GetGuid()
 | |
|         Version = Obj.GetVersion()
 | |
|         for Key in DistPkg.PackageSurfaceArea:
 | |
|             if Key[0] == Guid and Key[1] == Version:
 | |
|                 if DistPkg.PackageSurfaceArea[Key] not in DePackageObjList:
 | |
|                     DePackageObjList.append(DistPkg.PackageSurfaceArea[Key])
 | |
|     
 | |
|     DependentProtocolCNames, DependentPpiCNames, DependentGuidCNames, DependentPcdNames = \
 | |
|     GetDepProtocolPpiGuidPcdNames(DePackageObjList)
 | |
| 
 | |
|     CheckProtoclCNameRedefined(Module, DependentProtocolCNames)
 | |
|     CheckPpiCNameRedefined(Module, DependentPpiCNames)
 | |
|     CheckGuidCNameRedefined(Module, DependentGuidCNames)
 | |
|     CheckPcdNameRedefined(Module, DependentPcdNames)
 | |
| 
 | |
| ## GenToolMisc
 | |
| #
 | |
| # GenToolMisc
 | |
| #
 | |
| #
 | |
| def GenToolMisc(DistPkg, WorkspaceDir, ContentZipFile):
 | |
|     ToolObject = DistPkg.Tools
 | |
|     MiscObject = DistPkg.MiscellaneousFiles
 | |
|     DistPkg.FileList = []
 | |
|     FileList = []
 | |
|     ToolFileNum = 0
 | |
|     FileNum = 0
 | |
|     RootDir = WorkspaceDir
 | |
|     
 | |
|     #
 | |
|     # FileList stores both tools files and misc files
 | |
|     # Misc file list must be appended to FileList *AFTER* Tools file list
 | |
|     #
 | |
|     if ToolObject:
 | |
|         FileList += ToolObject.GetFileList()
 | |
|         ToolFileNum = len(ToolObject.GetFileList())
 | |
|         if 'EDK_TOOLS_PATH' in os.environ:
 | |
|             RootDir = os.environ['EDK_TOOLS_PATH']
 | |
|     if MiscObject:
 | |
|         FileList += MiscObject.GetFileList()
 | |
|     for FileObject in FileList:
 | |
|         FileNum += 1
 | |
|         if FileNum > ToolFileNum:
 | |
|             #
 | |
|             # Misc files, root should be changed to WORKSPACE
 | |
|             #
 | |
|             RootDir = WorkspaceDir
 | |
|         File = ConvertPath(FileObject.GetURI())
 | |
|         ToFile = os.path.normpath(os.path.join(RootDir, File))
 | |
|         if os.path.exists(ToFile):
 | |
|             Logger.Info( ST.WRN_FILE_EXISTED % ToFile )
 | |
|             #
 | |
|             # ask for user input the new file name
 | |
|             #
 | |
|             Logger.Info( ST.MSG_NEW_FILE_NAME)
 | |
|             Input = stdin.readline()
 | |
|             Input = Input.replace('\r', '').replace('\n', '')
 | |
|             OrigPath = os.path.split(ToFile)[0]
 | |
|             ToFile = os.path.normpath(os.path.join(OrigPath, Input))
 | |
|         FromFile = os.path.join(FileObject.GetURI())
 | |
|         Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, DistPkg.Header.ReadOnly, FileObject.GetExecutable())
 | |
|         DistPkg.FileList.append((ToFile, Md5Sum))
 | |
| 
 | |
| ## Tool entrance method
 | |
| #
 | |
| # This method mainly dispatch specific methods per the command line options.
 | |
| # If no error found, return zero value so the caller of this tool can know
 | |
| # if it's executed successfully or not.
 | |
| #
 | |
| # @param  Options: command Options
 | |
| #
 | |
| def Main(Options = None):
 | |
|     ContentZipFile, DistFile = None, None
 | |
| 
 | |
|     try:
 | |
|         DataBase = GlobalData.gDB
 | |
|         WorkspaceDir = GlobalData.gWORKSPACE
 | |
|         if not Options.PackageFile:
 | |
|             Logger.Error("InstallPkg", OPTION_MISSING, ExtraData=ST.ERR_SPECIFY_PACKAGE)
 | |
|         
 | |
|         #
 | |
|         # unzip dist.pkg file
 | |
|         #
 | |
|         DistPkg, ContentZipFile, DpPkgFileName, DistFile = UnZipDp(WorkspaceDir, Options.PackageFile)
 | |
| 
 | |
|         #
 | |
|         # check dependency
 | |
|         #
 | |
|         Dep = DependencyRules(DataBase)
 | |
|         CheckInstallDpx(Dep, DistPkg)
 | |
| 
 | |
|         #
 | |
|         # Install distribution
 | |
|         #
 | |
|         InstallDp(DistPkg, DpPkgFileName, ContentZipFile, Options, Dep, WorkspaceDir, DataBase)
 | |
|         ReturnCode = 0
 | |
|         
 | |
|     except FatalError, XExcept:
 | |
|         ReturnCode = XExcept.args[0]
 | |
|         if Logger.GetLevel() <= Logger.DEBUG_9:
 | |
|             Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())
 | |
|             
 | |
|     except KeyboardInterrupt:
 | |
|         ReturnCode = ABORT_ERROR
 | |
|         if Logger.GetLevel() <= Logger.DEBUG_9:
 | |
|             Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())
 | |
|             
 | |
|     except:
 | |
|         ReturnCode = CODE_ERROR
 | |
|         Logger.Error(
 | |
|                     "\nInstallPkg",
 | |
|                     CODE_ERROR,
 | |
|                     ST.ERR_UNKNOWN_FATAL_INSTALL_ERR % Options.PackageFile,
 | |
|                     ExtraData=ST.MSG_SEARCH_FOR_HELP,
 | |
|                     RaiseError=False
 | |
|                     )
 | |
|         Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),
 | |
|             platform) + format_exc())
 | |
|     finally:
 | |
|         if ReturnCode != UPT_ALREADY_INSTALLED_ERROR:
 | |
|             Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_STARTED)
 | |
|             if DistFile:
 | |
|                 DistFile.Close()
 | |
|             if ContentZipFile:
 | |
|                 ContentZipFile.Close()
 | |
|             if GlobalData.gUNPACK_DIR:
 | |
|                 rmtree(GlobalData.gUNPACK_DIR)
 | |
|                 GlobalData.gUNPACK_DIR = None
 | |
|             Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_DONE)
 | |
|     if ReturnCode == 0:
 | |
|         Logger.Quiet(ST.MSG_FINISH)
 | |
|     return ReturnCode
 | |
| 
 | |
| # BackupDist method
 | |
| #  
 | |
| # This method will backup the Distribution file into the $(WORKSPACE)/conf/upt, and rename it 
 | |
| # if there is already a same-named distribution existed.
 | |
| #
 | |
| # @param DpPkgFileName: The distribution path
 | |
| # @param Guid:          The distribution Guid
 | |
| # @param Version:       The distribution Version
 | |
| # @param WorkspaceDir:  The workspace directory
 | |
| # @retval NewDpPkgFileName: The exact backup file name
 | |
| #
 | |
| def BackupDist(DpPkgFileName, Guid, Version, WorkspaceDir):
 | |
|     DistFileName = os.path.split(DpPkgFileName)[1]
 | |
|     DestDir = os.path.normpath(os.path.join(WorkspaceDir, GlobalData.gUPT_DIR))
 | |
|     CreateDirectory(DestDir)
 | |
|     DestFile = os.path.normpath(os.path.join(DestDir, DistFileName))
 | |
|     if os.path.exists(DestFile):
 | |
|         FileName, Ext = os.path.splitext(DistFileName)
 | |
|         NewFileName = FileName + '_' + Guid + '_' + Version + Ext
 | |
|         DestFile = os.path.normpath(os.path.join(DestDir, NewFileName))
 | |
|         if os.path.exists(DestFile):
 | |
|             #
 | |
|             # ask for user input the new file name
 | |
|             #
 | |
|             Logger.Info( ST.MSG_NEW_FILE_NAME_FOR_DIST)
 | |
|             Input = stdin.readline()
 | |
|             Input = Input.replace('\r', '').replace('\n', '')
 | |
|             DestFile = os.path.normpath(os.path.join(DestDir, Input))
 | |
|     copyfile(DpPkgFileName, DestFile)
 | |
|     NewDpPkgFileName = DestFile[DestFile.find(DestDir) + len(DestDir) + 1:]
 | |
|     return NewDpPkgFileName
 | |
| 
 | |
| ## CheckInstallDpx method
 | |
| #
 | |
| #  check whether distribution could be installed
 | |
| #
 | |
| #   @param  Dep: the DependencyRules instance that used to check dependency
 | |
| #   @param  DistPkg: the distribution object
 | |
| #
 | |
| def CheckInstallDpx(Dep, DistPkg):
 | |
|     #
 | |
|     # Check distribution package installed or not
 | |
|     #
 | |
|     if Dep.CheckDpExists(DistPkg.Header.GetGuid(),
 | |
|         DistPkg.Header.GetVersion()):
 | |
|         Logger.Error("InstallPkg", UPT_ALREADY_INSTALLED_ERROR,
 | |
|             ST.WRN_DIST_PKG_INSTALLED)
 | |
|     #
 | |
|     # Check distribution dependency (all module dependency should be
 | |
|     # satisfied)
 | |
|     #
 | |
|     if not Dep.CheckInstallDpDepexSatisfied(DistPkg):
 | |
|         Logger.Error("InstallPkg", UNKNOWN_ERROR,
 | |
|             ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY,
 | |
|             ExtraData=DistPkg.Header.Name)
 | |
| 
 | |
| ## InstallModuleContent method
 | |
| #
 | |
| # If this is standalone module, then Package should be none,
 | |
| # ModulePath should be ''
 | |
| #   @param  FromPath: FromPath
 | |
| #   @param  NewPath: NewPath
 | |
| #   @param  ModulePath: ModulePath
 | |
| #   @param  Module: Module
 | |
| #   @param  ContentZipFile: ContentZipFile
 | |
| #   @param  WorkspaceDir: WorkspaceDir
 | |
| #   @param  ModuleList: ModuleList
 | |
| #   @param  Package: Package
 | |
| #
 | |
| def InstallModuleContent(FromPath, NewPath, ModulePath, Module, ContentZipFile,
 | |
|     WorkspaceDir, ModuleList, Package = None, ReadOnly = False):
 | |
|     
 | |
|     if NewPath.startswith("\\") or NewPath.startswith("/"):
 | |
|         NewPath = NewPath[1:]
 | |
|     
 | |
|     if not IsValidInstallPath(NewPath):
 | |
|         Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%NewPath) 
 | |
|            
 | |
|     NewModuleFullPath = os.path.normpath(os.path.join(WorkspaceDir, NewPath,
 | |
|         ConvertPath(ModulePath)))
 | |
|     Module.SetFullPath(os.path.normpath(os.path.join(NewModuleFullPath,
 | |
|         ConvertPath(Module.GetName()) + '.inf')))
 | |
|     Module.FileList = []
 | |
|     
 | |
|     for MiscFile in Module.GetMiscFileList():
 | |
|         if not MiscFile:
 | |
|             continue
 | |
|         for Item in MiscFile.GetFileList():
 | |
|             File = Item.GetURI()
 | |
|             if File.startswith("\\") or File.startswith("/"):
 | |
|                 File = File[1:]
 | |
|             
 | |
|             if not IsValidInstallPath(File):
 | |
|                 Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%File)
 | |
| 
 | |
|             FromFile = os.path.join(FromPath, ModulePath, File)
 | |
|             Executable = Item.GetExecutable()            
 | |
|             ToFile = os.path.normpath(os.path.join(NewModuleFullPath, ConvertPath(File)))
 | |
|             Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly, Executable)
 | |
|             if Package and ((ToFile, Md5Sum) not in Package.FileList):
 | |
|                 Package.FileList.append((ToFile, Md5Sum))
 | |
|             elif Package:
 | |
|                 continue
 | |
|             elif (ToFile, Md5Sum) not in Module.FileList:
 | |
|                 Module.FileList.append((ToFile, Md5Sum))
 | |
|     for Item in Module.GetSourceFileList():
 | |
|         File = Item.GetSourceFile()
 | |
|         if File.startswith("\\") or File.startswith("/"):
 | |
|             File = File[1:]
 | |
|             
 | |
|         if not IsValidInstallPath(File):
 | |
|             Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%File) 
 | |
|                                
 | |
|         FromFile = os.path.join(FromPath, ModulePath, File)
 | |
|         ToFile = os.path.normpath(os.path.join(NewModuleFullPath, ConvertPath(File)))
 | |
|         Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly)
 | |
|         if Package and ((ToFile, Md5Sum) not in Package.FileList):
 | |
|             Package.FileList.append((ToFile, Md5Sum))
 | |
|         elif Package:
 | |
|             continue
 | |
|         elif (ToFile, Md5Sum) not in Module.FileList:
 | |
|             Module.FileList.append((ToFile, Md5Sum))
 | |
|     for Item in Module.GetBinaryFileList():
 | |
|         FileNameList = Item.GetFileNameList()
 | |
|         for FileName in FileNameList:              
 | |
|             File = FileName.GetFilename()          
 | |
|             if File.startswith("\\") or File.startswith("/"):
 | |
|                 File = File[1:]
 | |
|                 
 | |
|             if not IsValidInstallPath(File):
 | |
|                 Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%File)
 | |
| 
 | |
|             FromFile = os.path.join(FromPath, ModulePath, File)
 | |
|             ToFile = os.path.normpath(os.path.join(NewModuleFullPath, ConvertPath(File)))
 | |
|             Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly)       
 | |
|             if Package and ((ToFile, Md5Sum) not in Package.FileList):
 | |
|                 Package.FileList.append((ToFile, Md5Sum))
 | |
|             elif Package:
 | |
|                 continue
 | |
|             elif (ToFile, Md5Sum) not in Module.FileList:
 | |
|                 Module.FileList.append((ToFile, Md5Sum))
 | |
|     
 | |
|     InstallModuleContentZipFile(ContentZipFile, FromPath, ModulePath, WorkspaceDir, NewPath, Module, Package, ReadOnly,
 | |
|                                 ModuleList)
 | |
| 
 | |
| ## InstallModuleContentZipFile
 | |
| #
 | |
| # InstallModuleContentZipFile
 | |
| #
 | |
| def InstallModuleContentZipFile(ContentZipFile, FromPath, ModulePath, WorkspaceDir, NewPath, Module, Package, ReadOnly,
 | |
|                                 ModuleList):
 | |
|     #
 | |
|     # Extract other files under current module path in content Zip file but not listed in the description 
 | |
|     #
 | |
|     if ContentZipFile:
 | |
|         for FileName in ContentZipFile.GetZipFile().namelist():
 | |
|             FileName = os.path.normpath(FileName)
 | |
|             CheckPath = os.path.normpath(os.path.join(FromPath, ModulePath))
 | |
|             if FileUnderPath(FileName, CheckPath):
 | |
|                 if FileName.startswith("\\") or FileName.startswith("/"):
 | |
|                     FileName = FileName[1:]
 | |
|                     
 | |
|                 if not IsValidInstallPath(FileName):
 | |
|                     Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FileName)
 | |
|                                                    
 | |
|                 FromFile = FileName
 | |
|                 ToFile = os.path.normpath(os.path.join(WorkspaceDir, 
 | |
|                         ConvertPath(FileName.replace(FromPath, NewPath, 1))))
 | |
|                 CheckList = copy.copy(Module.FileList)
 | |
|                 if Package:
 | |
|                     CheckList += Package.FileList
 | |
|                 for Item in CheckList:
 | |
|                     if Item[0] == ToFile:
 | |
|                         break
 | |
|                 else:
 | |
|                     Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly)
 | |
|                     if Package and ((ToFile, Md5Sum) not in Package.FileList):
 | |
|                         Package.FileList.append((ToFile, Md5Sum))
 | |
|                     elif Package:
 | |
|                         continue
 | |
|                     elif (ToFile, Md5Sum) not in Module.FileList:
 | |
|                         Module.FileList.append((ToFile, Md5Sum))            
 | |
|     
 | |
|     ModuleList.append((Module, Package))
 | |
| 
 | |
| ## FileUnderPath
 | |
| #  Check whether FileName started with directory specified by CheckPath 
 | |
| #
 | |
| # @param FileName: the FileName need to be checked
 | |
| # @param CheckPath: the path need to be checked against
 | |
| # @return:  True or False  
 | |
| #
 | |
| def FileUnderPath(FileName, CheckPath):
 | |
|     FileName = FileName.replace('\\', '/')
 | |
|     FileName = os.path.normpath(FileName)
 | |
|     CheckPath = CheckPath.replace('\\', '/')
 | |
|     CheckPath = os.path.normpath(CheckPath)
 | |
|     if FileName.startswith(CheckPath):
 | |
|         RemainingPath = os.path.normpath(FileName.replace(CheckPath, '', 1))
 | |
|         while RemainingPath.startswith('\\') or RemainingPath.startswith('/'):
 | |
|             RemainingPath = RemainingPath[1:]
 | |
|         if FileName == os.path.normpath(os.path.join(CheckPath, RemainingPath)):
 | |
|             return True
 | |
|     
 | |
|     return False
 | |
| 
 | |
| ## InstallFile
 | |
| #  Extract File from Zipfile, set file attribute, and return the Md5Sum
 | |
| #
 | |
| # @return:  True or False  
 | |
| #
 | |
| def InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly, Executable=False):
 | |
|     if os.path.exists(os.path.normpath(ToFile)):
 | |
|         pass
 | |
|     else:
 | |
|         if not ContentZipFile or not ContentZipFile.UnpackFile(FromFile, ToFile):
 | |
|             Logger.Error("UPT", FILE_NOT_FOUND, ST.ERR_INSTALL_FILE_FROM_EMPTY_CONTENT % FromFile)
 | |
| 
 | |
|         if ReadOnly:
 | |
|             if not Executable:
 | |
|                 chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
 | |
|             else:
 | |
|                 chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)
 | |
|         elif Executable:
 | |
|             chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP |
 | |
|                   stat.S_IWOTH | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)
 | |
|         else:
 | |
|             chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH)
 | |
|                 
 | |
|     Md5Sigature = md5.new(__FileHookOpen__(str(ToFile), 'rb').read())
 | |
|     Md5Sum = Md5Sigature.hexdigest()
 | |
| 
 | |
|     return Md5Sum
 | |
| 
 | |
| ## InstallPackageContent method
 | |
| #
 | |
| #   @param  FromPath: FromPath
 | |
| #   @param  ToPath: ToPath
 | |
| #   @param  Package: Package
 | |
| #   @param  ContentZipFile: ContentZipFile
 | |
| #   @param  Dep: Dep
 | |
| #   @param  WorkspaceDir: WorkspaceDir
 | |
| #   @param  ModuleList: ModuleList
 | |
| #
 | |
| def InstallPackageContent(FromPath, ToPath, Package, ContentZipFile, Dep,
 | |
|     WorkspaceDir, ModuleList, ReadOnly = False):
 | |
|     if Dep:
 | |
|         pass
 | |
|     Package.FileList = []
 | |
|     
 | |
|     if ToPath.startswith("\\") or ToPath.startswith("/"):
 | |
|         ToPath = ToPath[1:]
 | |
|     
 | |
|     if not IsValidInstallPath(ToPath):
 | |
|         Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%ToPath)     
 | |
| 
 | |
|     if FromPath.startswith("\\") or FromPath.startswith("/"):
 | |
|         FromPath = FromPath[1:]
 | |
|     
 | |
|     if not IsValidInstallPath(FromPath):
 | |
|         Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FromPath)   
 | |
|     
 | |
|     PackageFullPath = os.path.normpath(os.path.join(WorkspaceDir, ToPath))
 | |
|     for MiscFile in Package.GetMiscFileList():
 | |
|         for Item in MiscFile.GetFileList():
 | |
|             FileName = Item.GetURI()
 | |
|             if FileName.startswith("\\") or FileName.startswith("/"):
 | |
|                 FileName = FileName[1:]
 | |
|                 
 | |
|             if not IsValidInstallPath(FileName):
 | |
|                 Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FileName)
 | |
|                             
 | |
|             FromFile = os.path.join(FromPath, FileName)
 | |
|             Executable = Item.GetExecutable()
 | |
|             ToFile =  (os.path.join(PackageFullPath, ConvertPath(FileName)))
 | |
|             Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly, Executable)
 | |
|             if (ToFile, Md5Sum) not in Package.FileList:
 | |
|                 Package.FileList.append((ToFile, Md5Sum))
 | |
|     PackageIncludeArchList = [] 
 | |
|     for Item in Package.GetPackageIncludeFileList():
 | |
|         FileName = Item.GetFilePath()
 | |
|         if FileName.startswith("\\") or FileName.startswith("/"):
 | |
|             FileName = FileName[1:]
 | |
|             
 | |
|         if not IsValidInstallPath(FileName):
 | |
|             Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FileName) 
 | |
|                    
 | |
|         FromFile = os.path.join(FromPath, FileName)
 | |
|         ToFile = os.path.normpath(os.path.join(PackageFullPath, ConvertPath(FileName)))
 | |
|         RetFile = ContentZipFile.UnpackFile(FromFile, ToFile)
 | |
|         if RetFile == '':
 | |
|             #
 | |
|             # a non-exist path in Zipfile will return '', which means an include directory in our case
 | |
|             # save the information for later DEC creation usage and also create the directory
 | |
|             #
 | |
|             PackageIncludeArchList.append([Item.GetFilePath(), Item.GetSupArchList()])
 | |
|             CreateDirectory(ToFile)
 | |
|             continue
 | |
|         if ReadOnly:
 | |
|             chmod(ToFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)
 | |
|         else:
 | |
|             chmod(ToFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)            
 | |
|         Md5Sigature = md5.new(__FileHookOpen__(str(ToFile), 'rb').read())
 | |
|         Md5Sum = Md5Sigature.hexdigest()
 | |
|         if (ToFile, Md5Sum) not in Package.FileList:
 | |
|             Package.FileList.append((ToFile, Md5Sum))
 | |
|     Package.SetIncludeArchList(PackageIncludeArchList)
 | |
|     
 | |
|     for Item in Package.GetStandardIncludeFileList():
 | |
|         FileName = Item.GetFilePath()
 | |
|         if FileName.startswith("\\") or FileName.startswith("/"):
 | |
|             FileName = FileName[1:]
 | |
|             
 | |
|         if not IsValidInstallPath(FileName):
 | |
|             Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%FileName) 
 | |
|                     
 | |
|         FromFile = os.path.join(FromPath, FileName)
 | |
|         ToFile = os.path.normpath(os.path.join(PackageFullPath, ConvertPath(FileName)))
 | |
|         Md5Sum = InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly)
 | |
|         if (ToFile, Md5Sum) not in Package.FileList:
 | |
|             Package.FileList.append((ToFile, Md5Sum))
 | |
| 
 | |
|     #
 | |
|     # Update package
 | |
|     #
 | |
|     Package.SetPackagePath(Package.GetPackagePath().replace(FromPath,
 | |
|         ToPath, 1))
 | |
|     Package.SetFullPath(os.path.normpath(os.path.join(PackageFullPath,
 | |
|         ConvertPath(Package.GetName()) + '.dec')))
 | |
| 
 | |
|     #
 | |
|     # Install files in module
 | |
|     #
 | |
|     Module = None
 | |
|     ModuleDict = Package.GetModuleDict()
 | |
|     for ModuleGuid, ModuleVersion, ModuleName, ModulePath in ModuleDict:
 | |
|         Module = ModuleDict[ModuleGuid, ModuleVersion, ModuleName, ModulePath]
 | |
|         InstallModuleContent(FromPath, ToPath, ModulePath, Module,
 | |
|             ContentZipFile, WorkspaceDir, ModuleList, Package, ReadOnly)
 | |
| 
 | |
| ## GetDPFile method
 | |
| #
 | |
| #   @param  ZipFile: A ZipFile
 | |
| #
 | |
| def GetDPFile(ZipFile):
 | |
|     ContentFile = ''
 | |
|     DescFile = ''
 | |
|     for FileName in ZipFile.namelist():
 | |
|         if FileName.endswith('.content'):
 | |
|             if not ContentFile:
 | |
|                 ContentFile = FileName
 | |
|                 continue
 | |
|         elif FileName.endswith('.pkg'):
 | |
|             if not DescFile:
 | |
|                 DescFile = FileName
 | |
|                 continue
 | |
|         else:
 | |
|             continue
 | |
|         
 | |
|         Logger.Error("PackagingTool", FILE_TYPE_MISMATCH,
 | |
|             ExtraData=ST.ERR_DIST_FILE_TOOMANY)
 | |
|     if not DescFile or not ContentFile:
 | |
|         Logger.Error("PackagingTool", FILE_UNKNOWN_ERROR,
 | |
|             ExtraData=ST.ERR_DIST_FILE_TOOFEW)
 | |
|     return DescFile, ContentFile
 | |
| 
 | |
| ## InstallDp method
 | |
| #
 | |
| #   Install the distribution to current workspace
 | |
| #
 | |
| def InstallDp(DistPkg, DpPkgFileName, ContentZipFile, Options, Dep, WorkspaceDir, DataBase):
 | |
|     #
 | |
|     # PackageList, ModuleList record the information for the meta-data
 | |
|     # files that need to be generated later
 | |
|     #
 | |
|     PackageList = []
 | |
|     ModuleList = []
 | |
|     DistPkg.PackageSurfaceArea = GetPackageList(DistPkg, Dep, WorkspaceDir, Options, 
 | |
|                                                 ContentZipFile, ModuleList, PackageList)
 | |
| 
 | |
|     DistPkg.ModuleSurfaceArea = GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList)
 | |
|     
 | |
|     GenToolMisc(DistPkg, WorkspaceDir, ContentZipFile)
 | |
|     
 | |
|     #
 | |
|     # copy "Distribution File" to directory $(WORKSPACE)/conf/upt
 | |
|     #
 | |
|     DistFileName = os.path.split(DpPkgFileName)[1]
 | |
|     NewDpPkgFileName = BackupDist(DpPkgFileName, DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion(), WorkspaceDir)
 | |
| 
 | |
|     #
 | |
|     # update database
 | |
|     #
 | |
|     Logger.Quiet(ST.MSG_UPDATE_PACKAGE_DATABASE)
 | |
|     DataBase.AddDPObject(DistPkg, NewDpPkgFileName, DistFileName, 
 | |
|                    DistPkg.Header.RePackage)
 | |
| 
 |