From 27a04c5634bd43f39d746808a0ba0f0a2f042b0e Mon Sep 17 00:00:00 2001 From: bobokun Date: Mon, 22 May 2023 21:29:31 -0400 Subject: [PATCH] More info on versions --- .github/workflows/develop.yml | 2 ++ .github/workflows/version.yml | 2 ++ Dockerfile | 26 +++++++++++---- VERSION | 2 +- modules/__init__.py | 4 ++- modules/util.py | 59 +++++++++++++++++++++++++++++++++++ qbit_manage.py | 48 +++++++++++++++++++++++----- requirements.txt | 1 + 8 files changed, 129 insertions(+), 15 deletions(-) diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index 6ed6492..a60ab8b 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -46,6 +46,8 @@ jobs: with: context: ./ file: ./Dockerfile + build-args: | + "BRANCH_NAME=develop" platforms: linux/amd64,linux/arm64,linux/arm/v7 push: true tags: ${{ secrets.DOCKER_HUB_USERNAME }}/qbit_manage:develop diff --git a/.github/workflows/version.yml b/.github/workflows/version.yml index 7b6b4b1..39d7c82 100644 --- a/.github/workflows/version.yml +++ b/.github/workflows/version.yml @@ -14,6 +14,8 @@ jobs: - name: Check Out Repo uses: actions/checkout@v3 + with: + fetch-depth: 0 - name: Login to Docker Hub uses: docker/login-action@v2 diff --git a/Dockerfile b/Dockerfile index 1cabb91..ef496ec 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,27 @@ -FROM python:3.10-alpine - -# install packages -RUN apk add --no-cache gcc g++ libxml2-dev libxslt-dev shadow bash curl wget jq grep sed coreutils findutils unzip p7zip ca-certificates +FROM python:3.11-slim-buster +ARG BRANCH_NAME=master +ENV BRANCH_NAME ${BRANCH_NAME} +ENV TINI_VERSION v0.19.0 +ENV QBM_DOCKER True COPY requirements.txt / -RUN echo "**** install python packages ****" \ +# install packages +RUN echo "**** install system packages ****" \ + && apt-get update \ + && apt-get upgrade -y --no-install-recommends \ + && apt-get install -y tzdata --no-install-recommends \ + && apt-get install -y --no-cache gcc g++ libxml2-dev libxslt-dev shadow bash curl wget jq grep sed coreutils findutils unzip p7zip ca-certificates \ + && wget -O /tini https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-"$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ + && chmod +x /tini \ && pip3 install --no-cache-dir --upgrade --requirement /requirements.txt \ - && rm -rf /requirements.txt /tmp/* /var/tmp/* + && apt-get --purge autoremove gcc g++ libxml2-dev libxslt-dev libz-dev -y \ + && apt-get clean \ + && apt-get update \ + && apt-get check \ + && apt-get -f install \ + && apt-get autoclean \ + && rm -rf /requirements.txt /tmp/* /var/tmp/* /var/lib/apt/lists/* COPY . /app WORKDIR /app diff --git a/VERSION b/VERSION index 4a788a0..eacb9d8 100755 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.6.3 +3.6.3-develop1 diff --git a/modules/__init__.py b/modules/__init__.py index 78f14cd..c5ce4e3 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -13,8 +13,10 @@ version_file_path = os.path.join(project_dir, "..", "VERSION") with open(version_file_path) as f: version_str = f.read().strip() +# Get only the first 3 digits +version_str_split = version_str.rsplit("-", 1)[0] # Convert the version string to a tuple of integers -__version_info__ = tuple(map(int, version_str.split("."))) +__version_info__ = tuple(map(int, version_str_split.split("."))) # Define the version string using the version_info tuple __version__ = ".".join(str(i) for i in __version_info__) diff --git a/modules/util.py b/modules/util.py index c4734b4..c4c5304 100755 --- a/modules/util.py +++ b/modules/util.py @@ -7,6 +7,7 @@ import signal import time from pathlib import Path +import requests import ruamel.yaml logger = logging.getLogger("qBit Manage") @@ -71,6 +72,64 @@ class TorrentMessages: ] +def guess_branch(version, env_version, git_branch): + if git_branch: + return git_branch + elif env_version == "develop": + return env_version + elif version[2] > 0: + dev_version = get_develop() + if version[1] != dev_version[1] or version[2] <= dev_version[2]: + return "develop" + else: + return "master" + + +def current_version(version, branch=None): + if branch == "develop": + return get_develop() + elif version[2] > 0: + new_version = get_develop() + if version[1] != new_version[1] or new_version[2] >= version[2]: + return new_version + else: + return get_master() + + +develop_version = None + + +def get_develop(): + global develop_version + if develop_version is None: + develop_version = get_version("develop") + return develop_version + + +master_version = None + + +def get_master(): + global master_version + if master_version is None: + master_version = get_version("master") + return master_version + + +def get_version(level): + try: + url = f"https://raw.githubusercontent.com/StuffAnThings/qbit_manage/{level}/VERSION" + return parse_version(requests.get(url).content.decode().strip(), text=level) + except requests.exceptions.ConnectionError: + return "Unknown", "Unknown", 0 + + +def parse_version(version, text="develop"): + version = version.replace("develop", text) + split_version = version.split(f"-{text}") + return version, split_version[0], int(split_version[1]) if len(split_version) > 1 else 0 + + class check: """Check for attributes in config.""" diff --git a/qbit_manage.py b/qbit_manage.py index b1bd71d..32106c9 100755 --- a/qbit_manage.py +++ b/qbit_manage.py @@ -3,6 +3,7 @@ import argparse import glob import os +import platform import sys import time from datetime import datetime @@ -166,16 +167,23 @@ parser.add_argument("-w", "--width", dest="width", help="Screen Width (Default: args = parser.parse_args() +static_envs = [] +test_value = None + + def get_arg(env_str, default, arg_bool=False, arg_int=False): - """Get argument from environment variable or command line argument.""" + global test_value env_vars = [env_str] if not isinstance(env_str, list) else env_str final_value = None + static_envs.extend(env_vars) for env_var in env_vars: env_value = os.environ.get(env_var) + if env_var == "BRANCH_NAME": + test_value = env_value if env_value is not None: final_value = env_value break - if final_value is not None: + if final_value or (arg_int and final_value == 0): if arg_bool: if final_value is True or final_value is False: return final_value @@ -184,13 +192,28 @@ def get_arg(env_str, default, arg_bool=False, arg_int=False): else: return False elif arg_int: - return int(final_value) + try: + return int(final_value) + except ValueError: + return default else: return str(final_value) else: return default +try: + from git import Repo, InvalidGitRepositoryError + + try: + git_branch = Repo(path=".").head.ref.name # noqa + except InvalidGitRepositoryError: + git_branch = None +except ImportError: + git_branch = None + +env_version = get_arg("BRANCH_NAME", "master") +is_docker = get_arg("QBM_DOCKER", False, arg_bool=True) run = get_arg("QBT_RUN", args.run, arg_bool=True) sch = get_arg("QBT_SCHEDULE", args.min) startupDelay = get_arg("QBT_STARTUP_DELAY", args.startupDelay) @@ -306,13 +329,15 @@ def my_except_hook(exctype, value, tbi): sys.excepthook = my_except_hook -version = "Unknown" +version = ("Unknown", "Unknown", 0) with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "VERSION")) as handle: for line in handle.readlines(): line = line.strip() if len(line) > 0: - version = line + version = util.parse_version(line) break +branch = util.guess_branch(version, env_version, git_branch) +version = (version[0].replace("develop", branch), version[1].replace("develop", branch), version[2]) def start_loop(): @@ -521,8 +546,17 @@ if __name__ == "__main__": logger.info_center(r" \__, |_.__/|_|\__| |_| |_| |_|\__,_|_| |_|\__,_|\__, |\___|") # noqa: W605 logger.info_center(" | | ______ __/ | ") # noqa: W605 logger.info_center(" |_| |______| |___/ ") # noqa: W605 - logger.info(f" Version: {version}") - + system_ver = "Docker" if is_docker else f"Python {platform.python_version()}" + logger.info(f" Version: {version[0]} ({system_ver}){f' (Git: {git_branch})' if git_branch else ''}") + latest_version = util.current_version(version, branch=branch) + new_version = ( + latest_version[0] + if latest_version and (version[1] != latest_version[1] or (version[2] and version[2] < latest_version[2])) + else None + ) + if new_version: + logger.info(f" Newest Version: {new_version}") + logger.info(f" Platform: {platform.platform()}") logger.separator(loglevel="DEBUG") logger.debug(f" --run (QBT_RUN): {run}") logger.debug(f" --schedule (QBT_SCHEDULE): {sch}") diff --git a/requirements.txt b/requirements.txt index a0a29bc..17d2511 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ bencodepy==0.9.5 flake8==6.0.0 +GitPython==3.1.31 pre-commit==3.3.2 qbittorrent-api==2023.4.47 requests==2.31.0