]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/UPT.py
BaseTools: Replace StandardError with Expression
[mirror_edk2.git] / BaseTools / Source / Python / UPT / UPT.py
index b168a51daacc2e5b3f770f0981f04076076c9a81..0e425828cdfe4cfefa63310bd4363aa3c9b65b85 100644 (file)
@@ -2,7 +2,7 @@
 #\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
@@ -19,10 +19,16 @@ UPT
 \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
@@ -37,27 +43,31 @@ from Logger.ToolError import OPTION_MISSING
 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
 from BuildVersion import gBUILD_VERSION\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
-\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
@@ -65,6 +75,13 @@ def CheckConflictOption(Opt):
         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
@@ -73,7 +90,7 @@ def SetLogLevel(Opt):
         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
@@ -91,7 +108,7 @@ def SetLogLevel(Opt):
 def Main():\r
     Logger.Initialize()\r
 \r
-    Parser = OptionParser(version=(MSG_VERSION + ' ' + gBUILD_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
@@ -103,7 +120,7 @@ def Main():
 \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
@@ -121,12 +138,26 @@ def Main():
     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
@@ -135,24 +166,44 @@ def Main():
         ("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
@@ -177,29 +228,16 @@ def Main():
             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
@@ -214,21 +252,96 @@ def Main():
 \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