]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/ReplacePkg.py
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / Python / UPT / ReplacePkg.py
CommitLineData
421ccda3
HC
1## @file\r
2# Replace distribution package.\r
3#\r
f7496d71 4# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
421ccda3 5#\r
f7496d71
LG
6# This program and the accompanying materials are licensed and made available\r
7# under the terms and conditions of the BSD License which accompanies this\r
8# distribution. The full text of the license may be found at\r
421ccda3
HC
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14"""\r
15Replace a distribution package\r
16"""\r
17##\r
18# Import Modules\r
19#\r
20from shutil import rmtree\r
21from traceback import format_exc\r
22from platform import python_version\r
23from sys import platform\r
24from Logger import StringTable as ST\r
25from Logger.ToolError import UNKNOWN_ERROR\r
26from Logger.ToolError import FatalError\r
27from Logger.ToolError import ABORT_ERROR\r
28from Logger.ToolError import CODE_ERROR\r
29from Logger.ToolError import UPT_ALREADY_INSTALLED_ERROR\r
30import Logger.Log as Logger\r
31\r
32from Core.DependencyRules import DependencyRules\r
33from Library import GlobalData\r
34from InstallPkg import UnZipDp\r
35from InstallPkg import InstallDp\r
36from RmPkg import GetInstalledDpInfo\r
37from RmPkg import RemoveDist\r
38\r
39## Tool entrance method\r
40#\r
41# This method mainly dispatch specific methods per the command line options.\r
42# If no error found, return zero value so the caller of this tool can know\r
43# if it's executed successfully or not.\r
44#\r
45# @param Options: command Options\r
46#\r
47def Main(Options = None):\r
48 ContentZipFile, DistFile = None, None\r
49 try:\r
50 DataBase = GlobalData.gDB\r
51 WorkspaceDir = GlobalData.gWORKSPACE\r
52 Dep = DependencyRules(DataBase)\r
53 DistPkg, ContentZipFile, DpPkgFileName, DistFile = UnZipDp(WorkspaceDir, Options.PackFileToReplace)\r
f7496d71 54\r
421ccda3
HC
55 StoredDistFile, OrigDpGuid, OrigDpVersion = GetInstalledDpInfo(Options.PackFileToBeReplaced, \\r
56 Dep, DataBase, WorkspaceDir)\r
f7496d71 57\r
421ccda3
HC
58 #\r
59 # check dependency\r
60 #\r
61 CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion)\r
f7496d71 62\r
421ccda3
HC
63 #\r
64 # Remove the old distribution\r
65 #\r
66 RemoveDist(OrigDpGuid, OrigDpVersion, StoredDistFile, DataBase, WorkspaceDir, Options.Yes)\r
f7496d71 67\r
421ccda3
HC
68 #\r
69 # Install the new distribution\r
70 #\r
71 InstallDp(DistPkg, DpPkgFileName, ContentZipFile, Options, Dep, WorkspaceDir, DataBase)\r
72 ReturnCode = 0\r
f7496d71 73\r
5b0671c1 74 except FatalError as XExcept:\r
421ccda3
HC
75 ReturnCode = XExcept.args[0]\r
76 if Logger.GetLevel() <= Logger.DEBUG_9:\r
77 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
78 platform) + format_exc())\r
79 except KeyboardInterrupt:\r
80 ReturnCode = ABORT_ERROR\r
81 if Logger.GetLevel() <= Logger.DEBUG_9:\r
82 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
83 platform) + format_exc())\r
84 except:\r
85 ReturnCode = CODE_ERROR\r
86 Logger.Error(\r
87 "\nReplacePkg",\r
88 CODE_ERROR,\r
89 ST.ERR_UNKNOWN_FATAL_REPLACE_ERR % (Options.PackFileToReplace, Options.PackFileToBeReplaced),\r
90 ExtraData=ST.MSG_SEARCH_FOR_HELP,\r
91 RaiseError=False\r
92 )\r
93 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
94 platform) + format_exc())\r
95\r
96 finally:\r
97 Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_STARTED)\r
98 if DistFile:\r
99 DistFile.Close()\r
100 if ContentZipFile:\r
101 ContentZipFile.Close()\r
56636814
HC
102 for TempDir in GlobalData.gUNPACK_DIR:\r
103 rmtree(TempDir)\r
104 GlobalData.gUNPACK_DIR = []\r
f7496d71 105 Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_DONE)\r
421ccda3
HC
106\r
107 if ReturnCode == 0:\r
108 Logger.Quiet(ST.MSG_FINISH)\r
f7496d71 109\r
421ccda3
HC
110 return ReturnCode\r
111\r
112def CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion):\r
113 NewDpPkgList = []\r
114 for PkgInfo in DistPkg.PackageSurfaceArea:\r
115 Guid, Version = PkgInfo[0], PkgInfo[1]\r
116 NewDpPkgList.append((Guid, Version))\r
117\r
118 NewDpInfo = "%s %s" % (DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion())\r
119 OrigDpInfo = "%s %s" % (OrigDpGuid, OrigDpVersion)\r
120\r
121 #\r
122 # check whether new distribution is already installed and not replacing itself\r
123 #\r
124 if (NewDpInfo != OrigDpInfo):\r
125 if Dep.CheckDpExists(DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion()):\r
126 Logger.Error("\nReplacePkg", UPT_ALREADY_INSTALLED_ERROR,\r
127 ST.WRN_DIST_PKG_INSTALLED,\r
f7496d71 128 ExtraData=ST.MSG_REPLACE_ALREADY_INSTALLED_DP)\r
421ccda3
HC
129\r
130 #\r
131 # check whether the original distribution could be replaced by new distribution\r
f7496d71 132 #\r
421ccda3
HC
133 Logger.Verbose(ST.MSG_CHECK_DP_FOR_REPLACE%(NewDpInfo, OrigDpInfo))\r
134 DepInfoResult = Dep.CheckDpDepexForReplace(OrigDpGuid, OrigDpVersion, NewDpPkgList)\r
135 Replaceable = DepInfoResult[0]\r
136 if not Replaceable:\r
137 Logger.Error("\nReplacePkg", UNKNOWN_ERROR,\r
138 ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY)\r
f7496d71 139\r
421ccda3
HC
140 #\r
141 # check whether new distribution could be installed by dependency rule\r
142 #\r
143 Logger.Verbose(ST.MSG_CHECK_DP_FOR_INSTALL%str(NewDpInfo))\r
144 if not Dep.ReplaceCheckNewDpDepex(DistPkg, OrigDpGuid, OrigDpVersion):\r
145 Logger.Error("\nReplacePkg", UNKNOWN_ERROR,\r
146 ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY,\r
147 ExtraData=DistPkg.Header.Name)\r
148\r