#\r
# This file is the main entry for UPT \r
#\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.<BR>\r
#\r
# This program and the accompanying materials are licensed and made available \r
# under the terms and conditions of the BSD License which accompanies this \r
\r
## import modules\r
#\r
+import locale\r
import sys\r
+encoding = locale.getdefaultlocale()[1]\r
+if encoding:\r
+ reload(sys)\r
+ sys.setdefaultencoding(encoding)\r
+from Core import FileHook\r
import os.path\r
-from os import environ\r
from sys import platform\r
+import platform as pf\r
from optparse import OptionParser\r
from traceback import format_exc\r
from platform import python_version\r
from Logger.ToolError import FILE_TYPE_MISMATCH\r
from Logger.ToolError import OPTION_CONFLICT\r
from Logger.ToolError import FatalError\r
+from Logger.ToolError import UPT_ALREADY_INSTALLED_ERROR\r
+from Common.MultipleWorkspace import MultipleWorkspace as mws\r
+\r
import MkPkg\r
import InstallPkg\r
import RmPkg\r
-from Library.Misc import CheckEnvVariable\r
+import InventoryWs\r
+import ReplacePkg\r
+import TestInstall\r
+from Library.Misc import GetWorkspace\r
from Library import GlobalData\r
from Core.IpiDb import IpiDatabase\r
-\r
-##\r
-# Version and Copyright\r
-#\r
-#VersionNumber = "1.0"\r
-#__version__ = "Revision " + VersionNumber\r
-#__copyright__ = "Copyright (c) 2011 Intel Corporation All Rights Reserved."\r
+from BuildVersion import gBUILD_VERSION\r
\r
## CheckConflictOption\r
#\r
# CheckConflictOption\r
#\r
def CheckConflictOption(Opt):\r
- if (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):\r
+ if (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove or Opt.PackFileToReplace) \\r
+ and Opt.InventoryWs:\r
+ Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_L_OA_EXCLUSIVE)\r
+ elif Opt.PackFileToReplace and (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove):\r
+ Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_U_ICR_EXCLUSIVE)\r
+ elif (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):\r
Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_REQUIRE_I_C_R_OPTION)\r
elif Opt.PackFileToCreate and Opt.PackFileToInstall:\r
Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_C_EXCLUSIVE)\r
Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_R_EXCLUSIVE)\r
elif Opt.PackFileToCreate and Opt.PackFileToRemove:\r
Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)\r
+ elif Opt.TestDistFiles and (Opt.PackFileToCreate or Opt.PackFileToInstall \\r
+ or Opt.PackFileToRemove or Opt.PackFileToReplace):\r
+ Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)\r
+\r
+ if Opt.CustomPath and Opt.UseGuidedPkgPath:\r
+ Logger.Warn("UPT", ST.WARN_CUSTOMPATH_OVERRIDE_USEGUIDEDPATH)\r
+ Opt.UseGuidedPkgPath = False\r
\r
## SetLogLevel\r
#\r
Logger.SetLevel(Logger.VERBOSE)\r
elif Opt.opt_quiet:\r
Logger.SetLevel(Logger.QUIET + 1)\r
- elif Opt.debug_level != None:\r
+ elif Opt.debug_level is not None:\r
if Opt.debug_level < 0 or Opt.debug_level > 9:\r
Logger.Warn("UPT", ST.ERR_DEBUG_LEVEL)\r
Logger.SetLevel(Logger.INFO)\r
def Main():\r
Logger.Initialize()\r
\r
- Parser = OptionParser(version=MSG_VERSION, description=MSG_DESCRIPTION,\r
+ Parser = OptionParser(version=(MSG_VERSION + ' Build ' + gBUILD_VERSION), description=MSG_DESCRIPTION,\r
prog="UPT.exe", usage=MSG_USAGE)\r
\r
Parser.add_option("-d", "--debug", action="store", type="int", dest="debug_level", help=ST.HLP_PRINT_DEBUG_INFO)\r
\r
Parser.add_option("-q", "--quiet", action="store_true", dest="opt_quiet", help=ST.HLP_RETURN_AND_DISPLAY)\r
\r
- Parser.add_option("-i", "--install", action="store", type="string", dest="Install_Distribution_Package_File",\r
+ Parser.add_option("-i", "--install", action="append", type="string", dest="Install_Distribution_Package_File",\r
help=ST.HLP_SPECIFY_PACKAGE_NAME_INSTALL)\r
\r
Parser.add_option("-c", "--create", action="store", type="string", dest="Create_Distribution_Package_File",\r
Parser.add_option("-m", "--inf-filename", action="append", type="string", dest="EDK2_INF_Filename",\r
help=ST.HLP_SPECIFY_INF_NAME_CREATE)\r
\r
+ Parser.add_option("-l", "--list", action="store_true", dest="List_Dist_Installed",\r
+ help=ST.HLP_LIST_DIST_INSTALLED)\r
+\r
Parser.add_option("-f", "--force", action="store_true", dest="Yes", help=ST.HLP_DISABLE_PROMPT)\r
\r
Parser.add_option("-n", "--custom-path", action="store_true", dest="CustomPath", help=ST.HLP_CUSTOM_PATH_PROMPT)\r
\r
Parser.add_option("-x", "--free-lock", action="store_true", dest="SkipLock", help=ST.HLP_SKIP_LOCK_CHECK)\r
\r
+ Parser.add_option("-u", "--replace", action="store", type="string", dest="Replace_Distribution_Package_File",\r
+ help=ST.HLP_SPECIFY_PACKAGE_NAME_REPLACE)\r
+\r
+ Parser.add_option("-o", "--original", action="store", type="string", dest="Original_Distribution_Package_File",\r
+ help=ST.HLP_SPECIFY_PACKAGE_NAME_TO_BE_REPLACED)\r
+\r
+ Parser.add_option("--use-guided-paths", action="store_true", dest="Use_Guided_Paths", help=ST.HLP_USE_GUIDED_PATHS)\r
+\r
+ Parser.add_option("-j", "--test-install", action="append", type="string",\r
+ dest="Test_Install_Distribution_Package_Files", help=ST.HLP_TEST_INSTALL)\r
+\r
Opt = Parser.parse_args()[0]\r
\r
Var2Var = [\r
("PackFileToCreate", Opt.Create_Distribution_Package_File),\r
("PackFileToRemove", Opt.Remove_Distribution_Package_File),\r
("PackageFileList", Opt.EDK2_DEC_Filename),\r
- ("ModuleFileList", Opt.EDK2_INF_Filename)\r
+ ("ModuleFileList", Opt.EDK2_INF_Filename),\r
+ ("InventoryWs", Opt.List_Dist_Installed),\r
+ ("PackFileToReplace", Opt.Replace_Distribution_Package_File),\r
+ ("PackFileToBeReplaced", Opt.Original_Distribution_Package_File),\r
+ ("UseGuidedPkgPath", Opt.Use_Guided_Paths),\r
+ ("TestDistFiles", Opt.Test_Install_Distribution_Package_Files)\r
]\r
+\r
for Var in Var2Var:\r
setattr(Opt, Var[0], Var[1])\r
\r
try:\r
- CheckEnvVariable()\r
- except FatalError, XExcept:\r
+ GlobalData.gWORKSPACE, GlobalData.gPACKAGE_PATH = GetWorkspace()\r
+ except FatalError as XExcept:\r
if Logger.GetLevel() <= Logger.DEBUG_9:\r
Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
return XExcept.args[0]\r
\r
- GlobalData.gWORKSPACE = os.path.normpath(environ["WORKSPACE"])\r
+ # Support WORKSPACE is a long path\r
+ # Only works for windows system\r
+ if pf.system() == 'Windows':\r
+ Vol = 'B:'\r
+ for Index in range(90, 65, -1):\r
+ Vol = chr(Index) + ':'\r
+ if not os.path.isdir(Vol):\r
+ os.system('subst %s "%s"' % (Vol, GlobalData.gWORKSPACE))\r
+ break\r
+ GlobalData.gWORKSPACE = '%s\\' % Vol\r
+\r
WorkspaceDir = GlobalData.gWORKSPACE\r
\r
SetLogLevel(Opt)\r
\r
- GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, "Conf/DistributionPackageDatabase.db")))\r
+ Mgr = FileHook.RecoverMgr(WorkspaceDir)\r
+ FileHook.SetRecoverMgr(Mgr)\r
+\r
+ GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, \\r
+ "Conf/DistributionPackageDatabase.db")), WorkspaceDir)\r
GlobalData.gDB.InitDatabase(Opt.SkipLock)\r
\r
#\r
RunModule = MkPkg.Main\r
\r
elif Opt.PackFileToInstall:\r
- if not Opt.PackFileToInstall.endswith('.dist'):\r
- Logger.Error("InstallPkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToInstall)\r
- \r
- #\r
- # check file existence, if not absolute path, then try current working directory, then $(WORKSPACE) \r
- #\r
- Existed = True\r
- if os.path.isabs(Opt.PackFileToInstall):\r
- if not (os.path.exists(Opt.PackFileToInstall) and os.path.isfile(Opt.PackFileToInstall)):\r
- Existed = False\r
- else:\r
- AbsPath = os.path.normpath(os.path.join(os.getcwd(), Opt.PackFileToInstall))\r
- if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
- AbsPath = os.path.normpath(os.path.join(WorkspaceDir, Opt.PackFileToInstall))\r
- if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
- Existed = False\r
- \r
- if Existed:\r
- Opt.PackFileToInstall = AbsPath\r
- \r
- if not Existed:\r
- Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_INSTALL_DIST_NOT_FOUND % Opt.PackFileToInstall)\r
+ AbsPath = []\r
+ for Item in Opt.PackFileToInstall:\r
+ if not Item.endswith('.dist'):\r
+ Logger.Error("InstallPkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Item)\r
+\r
+ AbsPath.append(GetFullPathDist(Item, WorkspaceDir))\r
+ if not AbsPath:\r
+ Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_INSTALL_DIST_NOT_FOUND % Item)\r
\r
+ Opt.PackFileToInstall = AbsPath\r
setattr(Opt, 'PackageFile', Opt.PackFileToInstall)\r
RunModule = InstallPkg.Main\r
\r
\r
setattr(Opt, 'DistributionFile', Opt.PackFileToRemove)\r
RunModule = RmPkg.Main\r
+ elif Opt.InventoryWs:\r
+ RunModule = InventoryWs.Main\r
+\r
+ elif Opt.PackFileToBeReplaced and not Opt.PackFileToReplace:\r
+ Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_U_OPTION)\r
+\r
+ elif Opt.PackFileToReplace:\r
+ if not Opt.PackFileToReplace.endswith('.dist'):\r
+ Logger.Error("ReplacePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToReplace)\r
+ if not Opt.PackFileToBeReplaced:\r
+ Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_O_OPTION)\r
+ if not Opt.PackFileToBeReplaced.endswith('.dist'):\r
+ Logger.Error("ReplacePkg",\r
+ FILE_TYPE_MISMATCH,\r
+ ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToBeReplaced)\r
+\r
+ head, tail = os.path.split(Opt.PackFileToBeReplaced)\r
+ if head or not tail:\r
+ Logger.Error("ReplacePkg",\r
+ FILE_TYPE_MISMATCH,\r
+ ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REPLACE_ORIG % Opt.PackFileToBeReplaced)\r
+\r
+ AbsPath = GetFullPathDist(Opt.PackFileToReplace, WorkspaceDir)\r
+ if not AbsPath:\r
+ Logger.Error("ReplacePkg", FILE_NOT_FOUND, ST.ERR_REPLACE_DIST_NOT_FOUND % Opt.PackFileToReplace)\r
+\r
+ Opt.PackFileToReplace = AbsPath\r
+ RunModule = ReplacePkg.Main\r
+\r
+ elif Opt.Test_Install_Distribution_Package_Files:\r
+ for Dist in Opt.Test_Install_Distribution_Package_Files:\r
+ if not Dist.endswith('.dist'):\r
+ Logger.Error("TestInstall", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Dist)\r
+\r
+ setattr(Opt, 'DistFiles', Opt.Test_Install_Distribution_Package_Files)\r
+ RunModule = TestInstall.Main\r
+\r
else:\r
Parser.print_usage()\r
return OPTION_MISSING\r
\r
ReturnCode = RunModule(Opt)\r
- except FatalError, XExcept:\r
+ except FatalError as XExcept:\r
ReturnCode = XExcept.args[0]\r
if Logger.GetLevel() <= Logger.DEBUG_9:\r
Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + \\r
format_exc())\r
finally:\r
+ try:\r
+ if ReturnCode != 0 and ReturnCode != UPT_ALREADY_INSTALLED_ERROR:\r
+ Logger.Quiet(ST.MSG_RECOVER_START)\r
+ GlobalData.gDB.RollBack()\r
+ Mgr.rollback()\r
+ Logger.Quiet(ST.MSG_RECOVER_DONE)\r
+ else:\r
+ GlobalData.gDB.Commit()\r
+ Mgr.commit()\r
+ except Exception:\r
+ Logger.Quiet(ST.MSG_RECOVER_FAIL)\r
GlobalData.gDB.CloseDb()\r
\r
+ if pf.system() == 'Windows':\r
+ os.system('subst %s /D' % GlobalData.gWORKSPACE.replace('\\',''))\r
+\r
return ReturnCode\r
\r
+## GetFullPathDist\r
+#\r
+# This function will check DistFile existence, if not absolute path, then try current working directory,\r
+# then $(WORKSPACE),and return the AbsPath. If file doesn't find, then return None\r
+#\r
+# @param DistFile: The distribution file in either relative path or absolute path\r
+# @param WorkspaceDir: Workspace Directory\r
+# @return AbsPath: The Absolute path of the distribution file if existed, None else\r
+#\r
+def GetFullPathDist(DistFile, WorkspaceDir):\r
+ if os.path.isabs(DistFile):\r
+ if not (os.path.exists(DistFile) and os.path.isfile(DistFile)):\r
+ return None\r
+ else:\r
+ return DistFile\r
+ else:\r
+ AbsPath = os.path.normpath(os.path.join(os.getcwd(), DistFile))\r
+ if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
+ AbsPath = os.path.normpath(os.path.join(WorkspaceDir, DistFile))\r
+ if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
+ return None\r
+\r
+ return AbsPath\r
+\r
if __name__ == '__main__':\r
RETVAL = Main()\r
#\r