From 638b6ac5531890f230ad249078a6bbfc25a342d3 Mon Sep 17 00:00:00 2001 From: Santo Shakil Date: Mon, 28 Sep 2026 22:15:04 +0600 Subject: [PATCH] fix(mobile): don't stack an upload with itself (#31851) --- mobile/lib/domain/services/asset.service.dart | 2 +- mobile/test/unit/services/asset_service_test.dart | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mobile/lib/domain/services/asset.service.dart b/mobile/lib/domain/services/asset.service.dart index 7e40f426c..cfb34097b 100644 --- a/mobile/lib/domain/services/asset.service.dart +++ b/mobile/lib/domain/services/asset.service.dart @@ -204,7 +204,7 @@ class AssetService { try { // previous_checksum still points at the version the server had before this upload final previousId = await _localRepository.getPreviousRemoteId(localId); - if (previousId != null) { + if (previousId != null && previousId != remoteId) { await _apiRepository.stack([remoteId, previousId]); } } finally { diff --git a/mobile/test/unit/services/asset_service_test.dart b/mobile/test/unit/services/asset_service_test.dart index c43daa1fe..7f587c09d 100644 --- a/mobile/test/unit/services/asset_service_test.dart +++ b/mobile/test/unit/services/asset_service_test.dart @@ -150,6 +150,15 @@ void main() { verify(() => mocks.localAsset.repo.updatePreviousChecksum('local', 'sha')).called(1); }); + test('does not stack an upload onto itself', () async { + when(() => mocks.localAsset.repo.getPreviousRemoteId('local')).thenAnswer((_) async => 'remote'); + + await sut.stackEditedUpload('local', 'remote', 'sha'); + + verifyNever(() => apiRepository.stack(any())); + verify(() => mocks.localAsset.repo.updatePreviousChecksum('local', 'sha')).called(1); + }); + test('records the uploaded checksum even when the stack call fails', () async { when(() => mocks.localAsset.repo.getPreviousRemoteId('local')).thenAnswer((_) async => 'previous'); when(() => apiRepository.stack(any())).thenThrow(Exception('offline'));