From 5a37b31b52a1d7d980db10a46661691d826ab3c6 Mon Sep 17 00:00:00 2001 From: thirumani-vihaan Date: Thu, 16 Jul 2026 21:22:27 +0530 Subject: [PATCH] Fix #6309: Throw actionable exception on zero or negative version code --- .../scripts/build/TransformAndroidManifest.kt | 9 ++++- .../build/TransformAndroidManifestTest.kt | 39 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt b/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt index 9adff0494e8..580b03cdbe4 100644 --- a/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt +++ b/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt @@ -202,7 +202,14 @@ private class TransformAndroidManifest( val releaseVersionOffset = possibleReleaseCount * VERSION_CODES_PER_RELEASE val rcVersionOffset = (releaseCandidateNumber - 1) * MAX_FLAVORS_PER_RC val flavorVersionOffset = buildFlavor.index - return BASE_VERSION_CODE + releaseVersionOffset + rcVersionOffset + flavorVersionOffset + val versionCode = + BASE_VERSION_CODE + releaseVersionOffset + rcVersionOffset + flavorVersionOffset + check(versionCode > 0) { + "Computed version code ($versionCode) is zero or negative. " + + "This is likely due to using a shallow Git clone. " + + "Please run 'git fetch --unshallow' and try again." + } + return versionCode } // The format here is defined as part of the app's release process. diff --git a/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt b/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt index 31f63571b41..268246c4cde 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt @@ -737,6 +737,37 @@ class TransformAndroidManifestTest { ) } + @Test + fun testUtility_developBranch_shallowClone_negativeVersionCode_throwsException() { + initializeShallowGitRepositoryWithHistory() + + val exception = assertThrows() { + runScript( + tempFolder.root.absolutePath, + tempFolder.newFile(TEST_MANIFEST_FILE_NAME).apply { + writeText(TEST_MANIFEST_CONTENT_WITHOUT_VERSIONS) + }.absolutePath, + File(tempFolder.root, TRANSFORMED_MANIFEST_FILE_NAME).absolutePath, + BUILD_FLAVOR, + MAJOR_VERSION, + MINOR_VERSION, + APPLICATION_RELATIVE_QUALIFIED_CLASS, + "false", + "false" + ) + } + + assertThat(exception) + .hasMessageThat() + .contains("Computed version code") + assertThat(exception) + .hasMessageThat() + .contains("zero or negative") + assertThat(exception) + .hasMessageThat() + .contains("git fetch --unshallow") + } + /** Runs the transform_android_manifest utility. */ private fun runScript(vararg args: String) { main(args.toList().toTypedArray()) @@ -751,6 +782,14 @@ class TransformAndroidManifestTest { testGitRepository.createRemoteBranchRef("origin/develop") } + private fun initializeShallowGitRepositoryWithHistory() { + // Initialize the git repository with a small number of commits to simulate a shallow clone. + testGitRepository.init() + testGitRepository.setUser(email = "test@oppia.org", name = "Test User") + testGitRepository.initializeHistoricalCommits(commitCount = 10) + testGitRepository.createRemoteBranchRef("origin/develop") + } + private fun getMostRecentCommitOnCurrentBranch(): String { // See https://stackoverflow.com/a/949391 for a reference to validate that this is correct. return commandExecutor.executeCommand(