From a32636c99e75697ebb763f950965bc748c6b2525 Mon Sep 17 00:00:00 2001 From: master3395 Date: Sun, 15 Feb 2026 01:00:52 +0100 Subject: [PATCH 1/2] Version management: dev branch uses v2.5.5-dev, show 'not up to date' when behind - On dev (2.5.5 dev): show Latest Version 2.5.5, Latest Build dev - Compare Current Commit vs usmannasir v2.5.5-dev latest (e75ca45...) - Show yellow banner when behind; fork users compare to upstream dev - Stable branch unchanged (cyberpanel.net) --- baseTemplate/views.py | 60 ++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/baseTemplate/views.py b/baseTemplate/views.py index 311313b8c..a67ddcf74 100644 --- a/baseTemplate/views.py +++ b/baseTemplate/views.py @@ -298,6 +298,8 @@ def versionManagment(request): latestVersion = '0' latestBuild = '0' + on_dev_branch = (currentVersion == '2.5.5' and currentBuild == 'dev') + try: getVersion = requests.get('https://cyberpanel.net/version.txt', timeout=10) getVersion.raise_for_status() @@ -306,10 +308,15 @@ def versionManagment(request): latestBuild = str(latest.get('build', '0')) except (requests.RequestException, ValueError, KeyError) as e: logging.CyberCPLogFileWriter.writeToFile('[versionManagment] cyberpanel.net/version.txt failed: %s' % str(e)) - if currentVersion == '2.5.5' and currentBuild == 'dev': - notechk = False + if on_dev_branch: + latestVersion, latestBuild = '2.5.5', 'dev' - branch_ref = 'v%s.%s' % (latestVersion, latestBuild) + # Dev branch: compare against v2.5.5-dev, show dev version info + if on_dev_branch: + branch_ref = 'v2.5.5-dev' + latestVersion, latestBuild = '2.5.5', 'dev' + else: + branch_ref = 'v%s.%s' % (latestVersion, latestBuild) # Always fetch local HEAD for display head_cmd = 'git -C /usr/local/CyberCP rev-parse HEAD 2>/dev/null || true' @@ -319,39 +326,38 @@ def versionManagment(request): remote_out = ProcessUtilities.outputExecutioner(remote_cmd) is_usmannasir = 'usmannasir/cyberpanel' in (remote_out or '') - if notechk and (currentVersion == '2.5.5' and currentBuild == 'dev'): - notechk = False - elif notechk and _version_compare(currentVersion, latestVersion) > 0: + # Stable: newer than cyberpanel.net = up to date; dev: compare commits + if not on_dev_branch and notechk and _version_compare(currentVersion, latestVersion) > 0: notechk = False elif notechk: - if is_usmannasir: - u = "https://api.github.com/repos/usmannasir/cyberpanel/commits?sha=%s" % branch_ref + # Dev branch: always use usmannasir v2.5.5-dev as canonical "latest" + # Forks: use usmannasir for Latest Commit so all dev users compare to same upstream + fetch_branch = branch_ref if (is_usmannasir or on_dev_branch) else None + if fetch_branch: + u = "https://api.github.com/repos/usmannasir/cyberpanel/commits?sha=%s" % fetch_branch logging.CyberCPLogFileWriter.writeToFile(u) try: r = requests.get(u, timeout=10) r.raise_for_status() latestcomit = r.json()[0]['sha'] + if Currentcomt and latestcomit and Currentcomt == latestcomit: + notechk = False except (requests.RequestException, IndexError, KeyError) as e: logging.CyberCPLogFileWriter.writeToFile('[versionManagment] GitHub API failed: %s' % str(e)) - if latestcomit and Currentcomt == latestcomit: - notechk = False - else: - notechk = False - - # For forks: fetch latest commit from the actual remote for display - if not latestcomit and remote_out: - m = re.search(r'github\.com[:/]([^/]+)/([^/]+?)(?:\.git)?$', remote_out.strip()) - if m: - owner, repo = m.group(1), m.group(2).rstrip('.git') - branch_cmd = 'git -C /usr/local/CyberCP rev-parse --abbrev-ref HEAD 2>/dev/null || true' - local_branch = ProcessUtilities.outputExecutioner(branch_cmd).rstrip('\n') or 'v2.5.5-dev' - try: - u = "https://api.github.com/repos/%s/%s/commits?sha=%s" % (owner, repo, local_branch) - r = requests.get(u, timeout=10) - r.raise_for_status() - latestcomit = r.json()[0]['sha'] - except (requests.RequestException, IndexError, KeyError): - pass + elif not on_dev_branch: + # Stable fork: fetch from fork's branch + m = re.search(r'github\.com[:/]([^/]+)/([^/]+?)(?:\.git)?$', (remote_out or '').strip()) + if m: + owner, repo = m.group(1), m.group(2).rstrip('.git') + try: + u = "https://api.github.com/repos/%s/%s/commits?sha=%s" % (owner, repo, branch_ref) + r = requests.get(u, timeout=10) + r.raise_for_status() + latestcomit = r.json()[0]['sha'] + if Currentcomt and latestcomit and Currentcomt == latestcomit: + notechk = False + except (requests.RequestException, IndexError, KeyError): + pass template = 'baseTemplate/versionManagment.html' finalData = {'build': currentBuild, 'currentVersion': currentVersion, 'latestVersion': latestVersion, From 3cb149ba4f3b24379842ed9783660278c854134d Mon Sep 17 00:00:00 2001 From: master3395 Date: Sun, 15 Feb 2026 01:16:01 +0100 Subject: [PATCH 2/2] Version management: fix upgrade polling, branch dropdown, log visibility - Fix ReferenceError: use $timeout instead of timeout, store timer for cancel - Add v2.5.5-dev to Select Branch dropdown (remove dev filter) - Limit branch list to latest 10 by version - Fix Upgrade Progress Log text visibility (light text on dark bg) --- .../baseTemplate/custom-js/system-status.js | 6 +- .../baseTemplate/versionManagment.html | 56 +++++++++++++------ .../baseTemplate/custom-js/system-status.js | 6 +- .../baseTemplate/custom-js/system-status.js | 6 +- 4 files changed, 51 insertions(+), 23 deletions(-) diff --git a/baseTemplate/static/baseTemplate/custom-js/system-status.js b/baseTemplate/static/baseTemplate/custom-js/system-status.js index 9afb9976d..f26ebe047 100644 --- a/baseTemplate/static/baseTemplate/custom-js/system-status.js +++ b/baseTemplate/static/baseTemplate/custom-js/system-status.js @@ -579,6 +579,7 @@ app.controller('versionManagment', function ($scope, $http, $timeout) { $scope.updateFinish = true; $scope.couldNotConnect = true; + var upgradeStatusTimer = null; $scope.upgrade = function () { @@ -660,7 +661,8 @@ app.controller('versionManagment', function ($scope, $http, $timeout) { if (response.data.upgradeStatus === 1) { if (response.data.finished === 1) { - $timeout.cancel(); + if (upgradeStatusTimer) $timeout.cancel(upgradeStatusTimer); + upgradeStatusTimer = null; $scope.upgradelogBox = false; $scope.upgradeLog = response.data.upgradeLog; $scope.upgradeLoading = true; @@ -672,7 +674,7 @@ app.controller('versionManagment', function ($scope, $http, $timeout) { } else { $scope.upgradelogBox = false; $scope.upgradeLog = response.data.upgradeLog; - timeout(getUpgradeStatus, 2000); + upgradeStatusTimer = $timeout(getUpgradeStatus, 2000); } } diff --git a/baseTemplate/templates/baseTemplate/versionManagment.html b/baseTemplate/templates/baseTemplate/versionManagment.html index b4b8a566a..202db35ec 100644 --- a/baseTemplate/templates/baseTemplate/versionManagment.html +++ b/baseTemplate/templates/baseTemplate/versionManagment.html @@ -199,9 +199,9 @@ word-break: break-all; } - /* Progress log */ + /* Progress log - dark background for terminal-style visibility */ .log-container { - background: var(--text-primary, #1e1e1e); + background: #1e1e1e; border-radius: 8px; padding: 20px; margin-top: 20px; @@ -215,11 +215,12 @@ min-height: 300px; background: transparent; border: none; - color: var(--bg-secondary, #f0f0f0); + color: #e8e8e8; font-family: 'SF Mono', Monaco, monospace; font-size: 13px; line-height: 1.6; resize: vertical; + caret-color: #e8e8e8; } .log-textarea:focus { @@ -337,30 +338,51 @@