diff --git a/.github/workflows/test_linux_3.6.yml b/.github/workflows/test_linux_3.6.yml index 5f99496e..a13d7c11 100644 --- a/.github/workflows/test_linux_3.6.yml +++ b/.github/workflows/test_linux_3.6.yml @@ -26,8 +26,12 @@ jobs: pip install --upgrade pip pip install -r requirements.txt pip install pytest-timeout + pip install pytest-cov pip install pytest-qt + pip install codecov - name: Run Tests run: | export QT_QPA_PLATFORM=offscreen - pytest -v --timeout=60 + pytest -v --cov=nw --timeout=60 + - name: Upload to Codecov + uses: codecov/codecov-action@v1 diff --git a/.github/workflows/test_linux_3.7.yml b/.github/workflows/test_linux_3.7.yml index f057beb6..1b323b9c 100644 --- a/.github/workflows/test_linux_3.7.yml +++ b/.github/workflows/test_linux_3.7.yml @@ -26,8 +26,12 @@ jobs: pip install --upgrade pip pip install -r requirements.txt pip install pytest-timeout + pip install pytest-cov pip install pytest-qt + pip install codecov - name: Run Tests run: | export QT_QPA_PLATFORM=offscreen - pytest -v --timeout=60 + pytest -v --cov=nw --timeout=60 + - name: Upload to Codecov + uses: codecov/codecov-action@v1 diff --git a/docs/source/int_started.rst b/docs/source/int_started.rst index bcf6195d..79485daf 100644 --- a/docs/source/int_started.rst +++ b/docs/source/int_started.rst @@ -133,13 +133,14 @@ you're running novelWriter from the source code, a local copy of this documentat generated. It requires the following Python packages on Debian and Ubuntu. * ``python3-sphinx`` +* ``python3-sphinx-rtd-theme`` * ``python3-sphinxcontrib.qthelp`` Or from PyPi: .. code-block:: console - pip install sphinx sphinxcontrib-qthelp + pip install sphinx sphinx-rtd-theme sphinxcontrib-qthelp The documentation can then be built from the ``docs`` folder in the source code by running: diff --git a/docs/source/setup_linux.rst b/docs/source/setup_linux.rst index 7ce99afa..cf3ee580 100644 --- a/docs/source/setup_linux.rst +++ b/docs/source/setup_linux.rst @@ -95,3 +95,16 @@ all users, run the script with the ``sudo`` command. .. tip:: All options of the setup script can be listed with: ``./setup.py help``. + + +Uninstalling Icons +================== + +The steps taken by the ``xdg-install`` step can be reversed by running: + +.. code-block:: console + + ./setup.py xdg-uninstall + +This will remove the desktop launcher and icons from the system. As above, whether this is done on +the current user, or system wide, depends on whether this command is called with ``sudo`` or not. diff --git a/setup.py b/setup.py index 91d6f45f..1022721f 100755 --- a/setup.py +++ b/setup.py @@ -620,14 +620,6 @@ def xdgInstall(): else: print(f"Error {exCode}: Could not install menu desktop file") - exCode = subprocess.call( - ["xdg-desktop-icon", "install", "--novendor", "./novelwriter.desktop"] - ) - if exCode == 0: - print("Installed icon desktop file") - else: - print(f"Error {exCode}: Could not install icon desktop file") - print("") # Install MimeType @@ -686,6 +678,68 @@ def xdgInstall(): else: print(f"Error {exCode}: Could not update icon cache") + # Clean up + if os.path.isfile("./novelwriter.desktop"): + os.unlink("./novelwriter.desktop") + + print("") + print("Done!") + print("") + + return + +## +# XDG Uninstallation (xdg-uninstall) +## + +def xdgUninstall(): + """Will attempt to uninstall icons and make a launcher. + """ + print("") + print("XDG Uninstall") + print("=============") + print("") + + exCode = subprocess.call( + ["xdg-desktop-menu", "uninstall", "novelwriter.desktop"] + ) + if exCode == 0: + print("Uninstalled menu desktop file") + else: + print(f"Error {exCode}: Could not uninstall menu desktop file") + + sizeArr = ["16", "22", "24", "32", "48", "64", "96", "128", "256", "512"] + + # App Icon + for aSize in sizeArr: + exCode = subprocess.call([ + "xdg-icon-resource", "uninstall", "--noupdate", + "--context", "apps", "--size", aSize, "novelwriter" + ]) + if exCode == 0: + print(f"Uninstalled app icon size {aSize}") + else: + print(f"Error {exCode}: Could not uninstall app icon size {aSize}") + + # Mimetype + for aSize in sizeArr: + exCode = subprocess.call([ + "xdg-icon-resource", "uninstall", "--noupdate", + "--context", "mimetypes", "--size", aSize, + "application-x-novelwriter-project" + ]) + if exCode == 0: + print(f"Uninstalled mime icon size {aSize}") + else: + print(f"Error {exCode}: Could not uninstall mime icon size {aSize}") + + # Update Cache + exCode = subprocess.call(["xdg-icon-resource", "forceupdate"]) + if exCode == 0: + print("Updated icon cache") + else: + print(f"Error {exCode}: Could not update icon cache") + print("") print("Done!") print("") @@ -926,6 +980,7 @@ if __name__ == "__main__": " install.\n" " xdg-install Install launcher and icons for freedesktop systems. Run as root or \n" " with sudo for system-wide install, or as user for single user install.\n" + " Running 'xdg-uninstall' will remove the icons.\n" " win-install Install desktop and start menu icons for Windows systems.\n" ) @@ -985,11 +1040,6 @@ if __name__ == "__main__": # General Installers # ================== - if "launcher" in sys.argv: - sys.argv.remove("launcher") - print("The 'launcher' command has been replaced by 'xdg-install'.") - sys.exit(1) - if "xdg-install" in sys.argv: sys.argv.remove("xdg-install") if hostOS == OS_WIN: @@ -998,6 +1048,14 @@ if __name__ == "__main__": else: xdgInstall() + if "xdg-uninstall" in sys.argv: + sys.argv.remove("xdg-uninstall") + if hostOS == OS_WIN: + print("ERROR: Command 'xdg-uninstall' cannot be used on Windows") + sys.exit(1) + else: + xdgUninstall() + if "win-install" in sys.argv: sys.argv.remove("win-install") if hostOS == OS_WIN: diff --git a/setup/README.md b/setup/README.md index c64832a6..144d0afb 100644 --- a/setup/README.md +++ b/setup/README.md @@ -50,5 +50,6 @@ install. `xdg-install` – Install launcher and icons for freedesktop systems. Run as root or with sudo for system-wide install, or as user for single user install. +Running `xdg-uninstall` will remove the icons. `win-install` – Install desktop and start menu icons for Windows systems.