def CheckPackageExists(self, Guid, Version): Logger.Verbose(ST.MSG_CHECK_PACKAGE_START) Found = False for (PkgGuid, PkgVer) in self.PkgsToBeDepend: if (PkgGuid == Guid): # # if version is not empty and not equal, then not match # if Version and (PkgVer != Version): Found = False break else: Found = True break else: Found = False Logger.Verbose(ST.MSG_CHECK_PACKAGE_FINISH) return Found
def CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion): NewDpPkgList = [] for PkgInfo in DistPkg.PackageSurfaceArea: Guid, Version = PkgInfo[0], PkgInfo[1] NewDpPkgList.append((Guid, Version)) NewDpInfo = "%s %s" % (DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion()) OrigDpInfo = "%s %s" % (OrigDpGuid, OrigDpVersion) # # check whether new distribution is already installed and not replacing itself # if (NewDpInfo != OrigDpInfo): if Dep.CheckDpExists(DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion()): Logger.Error("\nReplacePkg", UPT_ALREADY_INSTALLED_ERROR, ST.WRN_DIST_PKG_INSTALLED, ExtraData=ST.MSG_REPLACE_ALREADY_INSTALLED_DP) # # check whether the original distribution could be replaced by new distribution # Logger.Verbose(ST.MSG_CHECK_DP_FOR_REPLACE % (NewDpInfo, OrigDpInfo)) DepInfoResult = Dep.CheckDpDepexForReplace(OrigDpGuid, OrigDpVersion, NewDpPkgList) Replaceable = DepInfoResult[0] if not Replaceable: Logger.Error("\nReplacePkg", UNKNOWN_ERROR, ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY) # # check whether new distribution could be installed by dependency rule # Logger.Verbose(ST.MSG_CHECK_DP_FOR_INSTALL % str(NewDpInfo)) if not Dep.ReplaceCheckNewDpDepex(DistPkg, OrigDpGuid, OrigDpVersion): Logger.Error("\nReplacePkg", UNKNOWN_ERROR, ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY, ExtraData=DistPkg.Header.Name)
def CheckModuleDepexSatisfied(self, ModuleObj, DpObj=None, \ ReturnCode=DEPEX_CHECK_SUCCESS): if ReturnCode: pass Logger.Verbose(ST.MSG_CHECK_MODULE_DEPEX_START) Result = True Dep = None if ModuleObj.GetPackageDependencyList(): Dep = ModuleObj.GetPackageDependencyList()[0] for Dep in ModuleObj.GetPackageDependencyList(): # # first check whether the dependency satisfied by current workspace # Exist = self.CheckPackageExists(Dep.GetGuid(), Dep.GetVersion()) # # check whether satisfied by current distribution # if not Exist: if DpObj == None: Result = False break for GuidVerPair in DpObj.PackageSurfaceArea.keys(): if Dep.GetGuid() == GuidVerPair[0]: if Dep.GetVersion() == None or \ len(Dep.GetVersion()) == 0: Result = True break if Dep.GetVersion() == GuidVerPair[1]: Result = True break else: Result = False break if not Result: Logger.Error("CheckModuleDepex", UNKNOWN_ERROR, \ ST.ERR_DEPENDENCY_NOT_MATCH % (ModuleObj.GetName(), \ Dep.GetPackageFilePath(), \ Dep.GetGuid(), \ Dep.GetVersion())) return Result
def InitDatabase(self, SkipLock=False): Logger.Verbose(ST.MSG_INIT_IPI_START) if not SkipLock: try: # # Create a dummy table, if already existed, # then UPT is already running # SqlCommand = """ create table %s ( Dummy TEXT NOT NULL, PRIMARY KEY (Dummy) )""" % self.DummyTable self.Cur.execute(SqlCommand) self.Conn.commit() except sqlite3.OperationalError: Logger.Error("UPT", UPT_ALREADY_RUNNING_ERROR, ST.ERR_UPT_ALREADY_RUNNING_ERROR) # # Create new table # SqlCommand = """ create table IF NOT EXISTS %s ( DpGuid TEXT NOT NULL,DpVersion TEXT NOT NULL, InstallTime REAL NOT NULL, NewPkgFileName TEXT NOT NULL, PkgFileName TEXT NOT NULL, RePackage TEXT NOT NULL, PRIMARY KEY (DpGuid, DpVersion) )""" % self.DpTable self.Cur.execute(SqlCommand) SqlCommand = """ create table IF NOT EXISTS %s ( FilePath TEXT NOT NULL, DpGuid TEXT, DpVersion TEXT, Md5Sum TEXT, PRIMARY KEY (FilePath) )""" % self.DpFileListTable self.Cur.execute(SqlCommand) SqlCommand = """ create table IF NOT EXISTS %s ( PackageGuid TEXT NOT NULL, PackageVersion TEXT NOT NULL, InstallTime REAL NOT NULL, DpGuid TEXT, DpVersion TEXT, InstallPath TEXT NOT NULL, PRIMARY KEY (PackageGuid, PackageVersion, InstallPath) )""" % self.PkgTable self.Cur.execute(SqlCommand) SqlCommand = """ create table IF NOT EXISTS %s ( ModuleGuid TEXT NOT NULL, ModuleVersion TEXT NOT NULL, ModuleName TEXT NOT NULL, InstallTime REAL NOT NULL, PackageGuid TEXT, PackageVersion TEXT, InstallPath TEXT NOT NULL, PRIMARY KEY (ModuleGuid, ModuleVersion, ModuleName, InstallPath) )""" % self.ModInPkgTable self.Cur.execute(SqlCommand) SqlCommand = """ create table IF NOT EXISTS %s ( ModuleGuid TEXT NOT NULL, ModuleVersion TEXT NOT NULL, ModuleName TEXT NOT NULL, InstallTime REAL NOT NULL, DpGuid TEXT, DpVersion TEXT, InstallPath TEXT NOT NULL, PRIMARY KEY (ModuleGuid, ModuleVersion, ModuleName, InstallPath) )""" % self.StandaloneModTable self.Cur.execute(SqlCommand) SqlCommand = """ create table IF NOT EXISTS %s ( ModuleGuid TEXT NOT NULL, ModuleVersion TEXT NOT NULL, ModuleName TEXT NOT NULL, InstallPath TEXT NOT NULL, DepexGuid TEXT, DepexVersion TEXT )""" % self.ModDepexTable self.Cur.execute(SqlCommand) self.Conn.commit() Logger.Verbose(ST.MSG_INIT_IPI_FINISH)
def Main(Options=None): if Options == None: Logger.Error("\nMkPkg", OPTION_UNKNOWN_ERROR, ST.ERR_OPTION_NOT_FOUND) try: DataBase = GlobalData.gDB ContentFileClosed = True CheckEnvVariable() WorkspaceDir = GlobalData.gWORKSPACE # # Init PackFileToCreate # if not Options.PackFileToCreate: Logger.Error("\nMkPkg", OPTION_UNKNOWN_ERROR, ST.ERR_OPTION_NOT_FOUND) # # Handle if the distribution package file already exists # CheckForExistingDp(Options.PackFileToCreate) # # Check package file existing and valid # CheckFileList('.DEC', Options.PackageFileList, ST.ERR_INVALID_PACKAGE_NAME, ST.ERR_INVALID_PACKAGE_PATH) # # Check module file existing and valid # CheckFileList('.INF', Options.ModuleFileList, ST.ERR_INVALID_MODULE_NAME, ST.ERR_INVALID_MODULE_PATH) # # Get list of files that installed with RePackage attribute available # RePkgDict = DataBase.GetRePkgDict() ContentFile = PackageFile(GlobalData.gCONTENT_FILE, "w") ContentFileClosed = False # # Add temp distribution header # if Options.PackageInformationDataFile: XmlFile = IniToXml(Options.PackageInformationDataFile) DistPkg = DistributionPackageXml().FromXml(XmlFile) remove(XmlFile) # # add distribution level tool/misc files # before pack, current dir should be workspace dir, else the full # path will be in the pack file # Cwd = getcwd() chdir(WorkspaceDir) ToolObject = DistPkg.Tools MiscObject = DistPkg.MiscellaneousFiles FileList = [] if ToolObject: FileList += ToolObject.GetFileList() if MiscObject: FileList += MiscObject.GetFileList() for FileObject in FileList: # # If you have unicode file names, please convert them to byte # strings in your desired encoding before passing them to # write(). # FromFile = os.path.normpath( FileObject.GetURI()).encode('utf_8') FileFullPath = os.path.normpath( os.path.join(WorkspaceDir, FromFile)) if FileFullPath in RePkgDict: (DpGuid, DpVersion, DpName, Repackage) = RePkgDict[FileFullPath] if not Repackage: Logger.Error("\nMkPkg", UPT_REPKG_ERROR, ST.ERR_UPT_REPKG_ERROR, ExtraData=ST.MSG_REPKG_CONFLICT %\ (FileFullPath, DpGuid, DpVersion, DpName) ) else: DistPkg.Header.RePackage = True ContentFile.PackFile(FromFile) chdir(Cwd) # # Add init dp information # else: DistPkg = DistributionPackageClass() DistPkg.Header.Name = 'Distribution Package' DistPkg.Header.Guid = str(uuid4()) DistPkg.Header.Version = '1.0' DistPkg.GetDistributionPackage(WorkspaceDir, Options.PackageFileList, \ Options.ModuleFileList) FileList, MetaDataFileList = DistPkg.GetDistributionFileList() for File in FileList + MetaDataFileList: FileFullPath = os.path.normpath(os.path.join(WorkspaceDir, File)) # # check whether file was included in a distribution that can not # be repackaged # if FileFullPath in RePkgDict: (DpGuid, DpVersion, DpName, Repackage) = RePkgDict[FileFullPath] if not Repackage: Logger.Error("\nMkPkg", UPT_REPKG_ERROR, ST.ERR_UPT_REPKG_ERROR, ExtraData = \ ST.MSG_REPKG_CONFLICT %(FileFullPath, DpName, \ DpGuid, DpVersion) ) else: DistPkg.Header.RePackage = True Cwd = getcwd() chdir(WorkspaceDir) ContentFile.PackFiles(FileList) chdir(Cwd) Logger.Verbose(ST.MSG_COMPRESS_DISTRIBUTION_PKG) ContentFile.Close() ContentFileClosed = True # # Add Md5Sigature # DistPkg.Header.Signature = md5.new( open(str(ContentFile), 'rb').read()).hexdigest() # # Add current Date # DistPkg.Header.Date = str(strftime("%Y-%m-%dT%H:%M:%S", localtime())) # # Finish final dp file # DistPkgFile = PackageFile(Options.PackFileToCreate, "w") DistPkgFile.PackFile(str(ContentFile)) DistPkgXml = DistributionPackageXml() DistPkgFile.PackData(DistPkgXml.ToXml(DistPkg), GlobalData.gDESC_FILE) DistPkgFile.Close() Logger.Quiet(ST.MSG_FINISH) 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())