From 7e55084815c630f9b4192f3cded77bf0b6e96f49 Mon Sep 17 00:00:00 2001 From: Joe Tretter Date: Mon, 11 May 2026 19:19:51 -0500 Subject: [PATCH] Misc Changes --- app/build.gradle.kts | 4 +-- .../tretter/githugandroid/GitRuntime.kt | 5 ++-- .../tretter/githugandroid/GitSandboxEngine.kt | 7 ++++-- .../githugandroid/levels/FetchLevel.kt | 6 ++++- .../githugandroid/levels/MergeLevel.kt | 6 ++++- .../githugandroid/levels/StatusLevel.kt | 2 +- .../githugandroid/LevelSolutionsTest.kt | 25 +++++++++++++++++++ 7 files changed, 46 insertions(+), 9 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f2c337a..118623b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,8 +19,8 @@ android { applicationId = "solutions.tretter.githugandroid" minSdk = 26 targetSdk = 35 - versionCode = 133 - versionName = "0.1.132" + versionCode = 134 + versionName = "0.1.133" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/solutions/tretter/githugandroid/GitRuntime.kt b/app/src/main/java/solutions/tretter/githugandroid/GitRuntime.kt index 563f4a7..1c5580d 100644 --- a/app/src/main/java/solutions/tretter/githugandroid/GitRuntime.kt +++ b/app/src/main/java/solutions/tretter/githugandroid/GitRuntime.kt @@ -740,7 +740,8 @@ class GitRepositoryRuntime private constructor( "fetch" -> { val remote = tokens.getOrNull(2)?.takeIf { !it.startsWith("-") } ?: "origin" inspectedRepo.copy( - fetchedBranches = inspectedRepo.fetchedBranches + previousRepo.fetchedBranches + "$remote/master" + "$remote/feature_branch", + fetchedBranches = inspectedRepo.fetchedBranches + previousRepo.fetchedBranches + "$remote/master" + "$remote/feature_branch" + "$remote/new_branch", + maintenanceActions = inspectedRepo.maintenanceActions + previousRepo.maintenanceActions + "fetch", ) } "pull" -> { @@ -788,7 +789,7 @@ class GitRepositoryRuntime private constructor( maintenanceActions = if ("--squash" in tokens) { inspectedRepo.maintenanceActions + previousRepo.maintenanceActions + "merge-squash" } else { - inspectedRepo.maintenanceActions + previousRepo.maintenanceActions + inspectedRepo.maintenanceActions + previousRepo.maintenanceActions + "merge" }, ) else -> inspectedRepo.copy( diff --git a/app/src/main/java/solutions/tretter/githugandroid/GitSandboxEngine.kt b/app/src/main/java/solutions/tretter/githugandroid/GitSandboxEngine.kt index 00b7a07..f1bf1cb 100644 --- a/app/src/main/java/solutions/tretter/githugandroid/GitSandboxEngine.kt +++ b/app/src/main/java/solutions/tretter/githugandroid/GitSandboxEngine.kt @@ -62,7 +62,10 @@ object GitSandboxEngine { } parts.size >= 2 && parts[1] == "fetch" -> { val remote = parts.getOrNull(2)?.takeIf { !it.startsWith("-") } ?: "origin" - repo.copy(fetchedBranches = repo.fetchedBranches + listOf("$remote/master", "$remote/feature_branch")) to emptyList() + repo.copy( + fetchedBranches = repo.fetchedBranches + listOf("$remote/master", "$remote/feature_branch", "$remote/new_branch"), + maintenanceActions = repo.maintenanceActions + "fetch", + ) to emptyList() } parts.size >= 2 && parts[1] == "pull" -> { val remote = parts.getOrNull(2)?.takeIf { !it.startsWith("-") } ?: "origin" @@ -454,7 +457,7 @@ object GitSandboxEngine { } return repo.copy( files = files, - maintenanceActions = if (squash) repo.maintenanceActions + "merge-squash" else repo.maintenanceActions, + maintenanceActions = repo.maintenanceActions + if (squash) "merge-squash" else "merge", ) to emptyList() } diff --git a/app/src/main/java/solutions/tretter/githugandroid/levels/FetchLevel.kt b/app/src/main/java/solutions/tretter/githugandroid/levels/FetchLevel.kt index 1084f5a..29ea8d5 100644 --- a/app/src/main/java/solutions/tretter/githugandroid/levels/FetchLevel.kt +++ b/app/src/main/java/solutions/tretter/githugandroid/levels/FetchLevel.kt @@ -32,7 +32,11 @@ internal fun fetchLevel(): Level = level( git("branch", "--set-upstream-to=origin/master", "master") true }, - validator = repoPredicate { repo -> "origin/new_branch" in repo.fetchedBranches && repo.headBranch == "master" }, + validator = repoPredicate { repo -> + "fetch" in repo.maintenanceActions && + "origin/new_branch" in repo.fetchedBranches && + repo.headBranch == "master" + }, testCases = listOf( levelTestCase("fetch origin", "git fetch origin"), levelTestCase("fetch default", "git fetch"), diff --git a/app/src/main/java/solutions/tretter/githugandroid/levels/MergeLevel.kt b/app/src/main/java/solutions/tretter/githugandroid/levels/MergeLevel.kt index ff6ff86..f58ac1e 100644 --- a/app/src/main/java/solutions/tretter/githugandroid/levels/MergeLevel.kt +++ b/app/src/main/java/solutions/tretter/githugandroid/levels/MergeLevel.kt @@ -24,7 +24,11 @@ internal fun mergeLevel(): Level = level( checkout("master") true }, - validator = repoPredicate { repo -> repo.files.any { it.name == "file2" && it.tracked } }, + validator = repoPredicate { repo -> + repo.headBranch == "master" && + "merge" in repo.maintenanceActions && + repo.files.any { it.name == "file2" && it.tracked } + }, testCases = listOf( levelTestCase("merge feature", "git merge feature"), ), diff --git a/app/src/main/java/solutions/tretter/githugandroid/levels/StatusLevel.kt b/app/src/main/java/solutions/tretter/githugandroid/levels/StatusLevel.kt index 09bbe6e..42b3f09 100644 --- a/app/src/main/java/solutions/tretter/githugandroid/levels/StatusLevel.kt +++ b/app/src/main/java/solutions/tretter/githugandroid/levels/StatusLevel.kt @@ -13,7 +13,7 @@ internal fun statusLevel(): Level = level( description = "Among the files in this repository, which of them is untracked?", hints = listOf("You are looking for a command to identify the status of the repository."), commandSuggestions = listOf("git status"), - setup = { RepoState(initialized = true, files = listOf(GitFile("database.yml"), GitFile("README", tracked = true)), branches = mapOf("master" to 0)) }, + setup = { RepoState(initialized = true, files = listOf(GitFile("database.yml")), branches = mapOf("master" to 0)) }, validator = commandAnswer("database.yml"), testCases = listOf( levelTestCase("answer untracked file", "database.yml"), diff --git a/app/src/test/java/solutions/tretter/githugandroid/LevelSolutionsTest.kt b/app/src/test/java/solutions/tretter/githugandroid/LevelSolutionsTest.kt index 2c30517..dc233e7 100644 --- a/app/src/test/java/solutions/tretter/githugandroid/LevelSolutionsTest.kt +++ b/app/src/test/java/solutions/tretter/githugandroid/LevelSolutionsTest.kt @@ -1,6 +1,7 @@ package solutions.tretter.githugandroid import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import java.io.File @@ -97,6 +98,30 @@ class LevelSolutionsTest { ) } + @Test + fun reportedRegressionCommandsDoNotSolveLevels() { + val statusRepo = statusLevel().setup() + assertEquals(listOf("database.yml"), statusRepo.files.map { it.name }) + + val gitBinary = testGitBinary() + val runtimeRoot = testSandboxRoot().apply { + deleteRecursively() + mkdirs() + } + + val mergeExercise = mergeLevel() + val mergeRuntime = GitRepositoryRuntime(runtimeRoot, gitBinary) + val mergeRepo = mergeRuntime.prepareLevel(mergeExercise) + val (switchedRepo, _) = mergeRuntime.execute(mergeExercise, mergeRepo, "git switch feature") + assertFalse("Switching to feature must not solve the merge level.", mergeExercise.validator(switchedRepo, "git switch feature")) + + val fetchExercise = fetchLevel() + val fetchRuntime = GitRepositoryRuntime(runtimeRoot, gitBinary) + val fetchRepo = fetchRuntime.prepareLevel(fetchExercise) + val (pulledRepo, _) = fetchRuntime.execute(fetchExercise, fetchRepo, "git pull") + assertFalse("Pulling must not solve the fetch level.", fetchExercise.validator(pulledRepo, "git pull")) + } + private companion object { fun writeEvidenceLog(content: String) { val repoRoot = File(System.getProperty("user.dir") ?: ".")