mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-08-08 15:00:15 -03:00
fix(update): read ahead_by from GitHub compare API when status is ahead/diverged
The compare API URL format compare/{local_hash}...main returns
status='ahead' when main is ahead of the local commit. The count is
in the ahead_by field, not behind_by. The old code only read behind_by
which is always 0 in this case, causing the UI to show 'Up to date'
when actually several commits behind.
Also handle status='diverged' (both sides have unique commits) by
reading ahead_by for the remote-ahead count.
Frontend adds a hash comparison fallback: if behind_by is 0 but local
and remote commit hashes differ, show 'Behind main' instead of the
incorrect 'Up to date'.
Tests: _AheadCompareDownloader and _DivergedCompareDownloader mocks
for the two status paths.
This commit is contained in:
@@ -517,7 +517,10 @@ class UpdateRoutes:
|
|||||||
custom_headers={'Accept': 'application/vnd.github+json'}
|
custom_headers={'Accept': 'application/vnd.github+json'}
|
||||||
)
|
)
|
||||||
if c_ok:
|
if c_ok:
|
||||||
behind_by = c_data.get('behind_by', 0)
|
if c_data.get('status') in ('ahead', 'diverged'):
|
||||||
|
behind_by = c_data.get('ahead_by', 0)
|
||||||
|
else:
|
||||||
|
behind_by = c_data.get('behind_by', 0)
|
||||||
|
|
||||||
return version, changelog, behind_by, commit_date
|
return version, changelog, behind_by, commit_date
|
||||||
|
|
||||||
|
|||||||
@@ -615,13 +615,17 @@ export class UpdateService {
|
|||||||
if (newVersionEl) {
|
if (newVersionEl) {
|
||||||
if (this.updateInfo?.nightly) {
|
if (this.updateInfo?.nightly) {
|
||||||
const behind = this.updateInfo.behind_by || 0;
|
const behind = this.updateInfo.behind_by || 0;
|
||||||
const hash = this.latestVersion.replace('main-', '');
|
const remoteHash = this.latestVersion.replace('main-', '');
|
||||||
|
const localHash = this.gitInfo.short_hash || '';
|
||||||
const date = this.updateInfo.commit_date || '';
|
const date = this.updateInfo.commit_date || '';
|
||||||
const datePart = date ? ` · ${date}` : '';
|
const datePart = date ? ` · ${date}` : '';
|
||||||
|
|
||||||
if (behind > 0) {
|
if (behind > 0) {
|
||||||
newVersionEl.textContent = `${behind} commit${behind !== 1 ? 's' : ''} behind main (${hash}${datePart})`;
|
newVersionEl.textContent = `${behind} commit${behind !== 1 ? 's' : ''} behind main (${remoteHash}${datePart})`;
|
||||||
|
} else if (localHash !== remoteHash) {
|
||||||
|
newVersionEl.textContent = `Behind main (${remoteHash}${datePart})`;
|
||||||
} else {
|
} else {
|
||||||
newVersionEl.textContent = `Up to date (${hash}${datePart})`;
|
newVersionEl.textContent = `Up to date (${remoteHash}${datePart})`;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
newVersionEl.textContent = this.latestVersion;
|
newVersionEl.textContent = this.latestVersion;
|
||||||
|
|||||||
@@ -428,6 +428,71 @@ async def test_get_nightly_version_parses_behind_by(monkeypatch):
|
|||||||
assert changelog[0] == "test: add nightly feature"
|
assert changelog[0] == "test: add nightly feature"
|
||||||
|
|
||||||
|
|
||||||
|
class _AheadCompareDownloader:
|
||||||
|
"""Fake compare API response with status='ahead' (main is ahead of local)."""
|
||||||
|
|
||||||
|
commit_sha = "9999999"
|
||||||
|
commit_msg = "latest commit"
|
||||||
|
commit_date = "2026-07-28T00:00:00Z"
|
||||||
|
ahead_by = 3
|
||||||
|
|
||||||
|
async def make_request(self, method, url, **kwargs):
|
||||||
|
if "/compare/" in url:
|
||||||
|
return True, {"status": "ahead", "ahead_by": self.ahead_by, "behind_by": 0}
|
||||||
|
return True, {
|
||||||
|
"sha": self.commit_sha,
|
||||||
|
"commit": {
|
||||||
|
"message": self.commit_msg,
|
||||||
|
"committer": {"date": self.commit_date},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_get_nightly_version_reads_ahead_by_when_ahead(monkeypatch):
|
||||||
|
"""compare/{local}...main returns status='ahead' → read ahead_by."""
|
||||||
|
monkeypatch.setattr(update_routes, "get_downloader", lambda: _stub_downloader(_AheadCompareDownloader()))
|
||||||
|
|
||||||
|
version, changelog, behind_by, commit_date = await update_routes.UpdateRoutes._get_nightly_version(
|
||||||
|
local_hash="oldhash"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert version == "main-9999999"
|
||||||
|
assert behind_by == 3
|
||||||
|
assert commit_date == "2026-07-28"
|
||||||
|
|
||||||
|
|
||||||
|
class _DivergedCompareDownloader:
|
||||||
|
"""Fake compare API response with status='diverged' (both have unique commits)."""
|
||||||
|
|
||||||
|
commit_sha = "aaaaaaa"
|
||||||
|
commit_msg = "diverged test"
|
||||||
|
commit_date = "2026-07-29T00:00:00Z"
|
||||||
|
|
||||||
|
async def make_request(self, method, url, **kwargs):
|
||||||
|
if "/compare/" in url:
|
||||||
|
return True, {"status": "diverged", "ahead_by": 5, "behind_by": 2}
|
||||||
|
return True, {
|
||||||
|
"sha": self.commit_sha,
|
||||||
|
"commit": {
|
||||||
|
"message": self.commit_msg,
|
||||||
|
"committer": {"date": self.commit_date},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_get_nightly_version_reads_ahead_by_when_diverged(monkeypatch):
|
||||||
|
"""compare/{local}...main returns status='diverged' → read ahead_by (remote ahead)."""
|
||||||
|
monkeypatch.setattr(update_routes, "get_downloader", lambda: _stub_downloader(_DivergedCompareDownloader()))
|
||||||
|
|
||||||
|
version, changelog, behind_by, commit_date = await update_routes.UpdateRoutes._get_nightly_version(
|
||||||
|
local_hash="divhash"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert behind_by == 5
|
||||||
|
|
||||||
|
|
||||||
class _CheckUpdatesDownloader:
|
class _CheckUpdatesDownloader:
|
||||||
"""Fake downloader returning both a release list and a nightly commit + compare."""
|
"""Fake downloader returning both a release list and a nightly commit + compare."""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user