src/eric7/UI/upgrader.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 9015
dfeefad914ed
child 9221
bf71ee032bb4
diff -r 3fc8dfeb6ebe -r b99e7fd55fd3 src/eric7/UI/upgrader.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/UI/upgrader.py	Thu Jul 07 11:23:56 2022 +0200
@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Script to upgrade the packages eric depends on.
+
+This process must be performed while eric is closed. The script will upgrade
+the requested packages and will restart eric.
+"""
+
+import contextlib
+import subprocess
+import sys
+import time
+
+
+_pyqtPackages = [
+    "pyqt6", "pyqt6-sip", "pyqt6-webengine", "pyqt6-charts",
+    "pyqt6-qscintilla", "pyqt6-qt6", "pyqt6-webengine-qt6",
+    "pyqt6-charts-qt6"
+]
+_ericPackages = ["eric-ide"]
+
+
+def doUpgrade(packages):
+    """
+    Function to upgrade the given packages via pip.
+    
+    @param packages list of packages to be upgraded
+    @type list of str
+    @return flag indicating a successful installation
+    @rtype bool
+    """
+    exitCode = subprocess.run(                  # secok
+        [sys.executable, "-m", "pip", "install", "--prefer-binary",
+         "--upgrade"] + packages
+    ).returncode
+    ok = (exitCode == 0)
+    
+    return ok
+
+
+def startEric(args):
+    """
+    Function to start eric with the given arguments.
+    
+    @param args list containing the start arguments
+    @type list of str
+    """
+    args = [sys.executable] + args
+    subprocess.Popen(args)
+
+
+def main():
+    """
+    Main entry point into the upgrader.
+    """
+    try:
+        ddindex = sys.argv.index("--")
+    except ValueError:
+        # '--' was not found. Start eric with all parameters given.
+        ddindex = 0
+    
+    ericStartArgs = sys.argv[ddindex + 1:] if bool(ddindex) else []
+    if not ericStartArgs:
+        # create default start arguments
+        ericStartArgs = ["-m", "eric7", "--start-session"]
+    
+    upgraderArgs = sys.argv[1:ddindex] if bool(ddindex) else sys.argv[:]
+    
+    upgradeType = ""
+    upgradeDelay = 2
+    
+    for arg in upgraderArgs:
+        if arg.startswith("--delay="):
+            with contextlib.suppress(ValueError):
+                upgradeDelay = int(arg.split("=")[1].strip())
+        elif arg.startswith("--type="):
+            upgradeType = arg.split("=")[1].strip()
+    
+    # wait a few seconds to give eric the chance to fully shut down
+    time.sleep(upgradeDelay)
+    
+    # now perform the upgrade and start eric, if it was successful
+    if upgradeType == "pyqt":
+        ok = doUpgrade(_pyqtPackages)
+    elif upgradeType == "eric":
+        ok = doUpgrade(_ericPackages)
+    elif upgradeType == "ericpyqt":
+        ok = doUpgrade(_ericPackages + _pyqtPackages)
+    else:
+        ok = False
+    
+    if ok:
+        startEric(ericStartArgs)
+        sys.exit(0)
+    else:
+        sys.exit(1)
+
+if __name__ == "__main__":
+    main()

eric ide

mercurial