-
Notifications
You must be signed in to change notification settings - Fork 25
Implement exercise T6L2/ff-undo #101
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 4 commits
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
87d6f65
Add the ff-undo exercise
vanphuc1201 966108e
Add yml file for test_verify
vanphuc1201 dace21b
Add README file and also fix the verify to check the mistake
vanphuc1201 7abe28c
Change the notification for not undo merge
vanphuc1201 fe2f02d
Final ver
vanphuc1201 f627ddc
Use the git cli command instead of run command
vanphuc1201 66b2131
Fix the test cases
vanphuc1201 5504d3f
[ff-unfo] Update README
jovnc f225878
[ff-unfo] Run ruff format and clean up download.py
jovnc 139a3c2
[ff-undo] Update verify to include initial commit
jovnc 03f4a4a
[ff-undo] Clean up code for verify.py
jovnc d2a7aa3
[ff-undo] Remove .DS_Store file
jovnc 09d7cd3
[ff-undo] Update error messages
jovnc File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| { | ||
| "exercise_name": "ff-undo", | ||
| "tags": [ | ||
| "git-branch", | ||
| "git-merge", | ||
| "git-reset" | ||
| ], | ||
| "requires_git": true, | ||
| "requires_github": false, | ||
| "base_files": {}, | ||
| "exercise_repo": { | ||
| "repo_type": "local", | ||
| "repo_name": "play-characters", | ||
| "repo_title": null, | ||
| "create_fork": null, | ||
| "init": true | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| # ff-undo | ||
|
|
||
| This exercise focuses on **undoing a merge in Git**. You will practice how to revert unwanted merge commits while keeping branches and commits intact. | ||
|
|
||
| ## Task | ||
|
|
||
| You have a repository with two branches: | ||
|
|
||
| - `main` branch, which initially contains commits: | ||
| - `Add Rick` | ||
| - `Add Morty` | ||
| - `others` branch, which contains commits: | ||
| - `Add Birdperson` | ||
| - `Add Cyborg to birdperson.txt` | ||
| - `Add Tammy` | ||
|
|
||
| A merge with fast forward from `others` into `main` has been done incorrectly. Your task is: | ||
|
|
||
| 1. **Undo the merge on `main`**, so that only `Add Rick` and `Add Morty` remain on `main`. | ||
| 2. Ensure the `others` branch still exists with all its commits intact. | ||
| 3. Do not delete any commits; only undo the merge on `main`. | ||
|
|
||
| ## Hints | ||
|
|
||
| <details> | ||
| <summary>Hint 1: Check your branches</summary> | ||
|
|
||
| Use `git branch` to see the current branches and verify `main` and `others` exist. | ||
| </details> | ||
|
|
||
| <details> | ||
| <summary>Hint 2: View commit history</summary> | ||
|
|
||
| Use `git log --oneline` on `main` to identify the merge commit that needs to be undone. | ||
| </details> | ||
|
|
||
| <details> | ||
| <summary>Hint 3: Undo the merge</summary> | ||
|
|
||
| You can undo a merge using: `git reset --hard <commit-before-merge>` | ||
vanphuc1201 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
Empty file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| from exercise_utils.cli import run_command | ||
| from exercise_utils.gitmastery import create_start_tag | ||
|
|
||
| __resources__ = {} | ||
vanphuc1201 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
|
|
||
| def setup(verbose: bool = False): | ||
| # Marks the start of setup (Git-Mastery internal logging) | ||
| create_start_tag(verbose) | ||
vanphuc1201 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| # Create initial files and commits | ||
| run_command('echo "Scientist" > rick.txt', verbose) | ||
| run_command('git add .', verbose) | ||
| run_command('git commit -m "Add Rick"', verbose) | ||
|
|
||
| run_command('echo "Boy" > morty.txt', verbose) | ||
| run_command('git add .', verbose) | ||
| run_command('git commit -m "Add Morty"', verbose) | ||
|
|
||
| # Create and switch to branch 'others' | ||
| run_command('git switch -c others', verbose) | ||
| run_command('echo "No job" > birdperson.txt', verbose) | ||
| run_command('git add .', verbose) | ||
| run_command('git commit -m "Add Birdperson"', verbose) | ||
|
|
||
| run_command('echo "Cyborg" >> birdperson.txt', verbose) | ||
| run_command('git add .', verbose) | ||
| run_command('git commit -m "Add Cyborg to birdperson.txt"', verbose) | ||
|
|
||
| run_command('echo "Spy" > tammy.txt', verbose) | ||
| run_command('git add .', verbose) | ||
| run_command('git commit -m "Add Tammy"', verbose) | ||
|
|
||
| # Merge back into main | ||
| run_command('git switch main', verbose) | ||
| run_command('git merge others -m "Introduce others"', verbose) | ||
vanphuc1201 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
Empty file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| initialization: | ||
| steps: | ||
| - type: commit | ||
| id: start | ||
| empty: true | ||
| message: Empty commit | ||
| - type: commit | ||
| message: "Add Rick" | ||
| - type: commit | ||
| message: "Add Morty" | ||
| - type: branch | ||
| branch-name: others | ||
| - type: checkout | ||
| branch-name: others | ||
| - type: commit | ||
| message: "Add Birdperson" | ||
| - type: commit | ||
| message: "Add Cyborg to birdperson.txt" | ||
| - type: commit | ||
| message: "Add Tammy" | ||
| - type: checkout | ||
| branch-name: main | ||
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| initialization: | ||
| steps: | ||
| - type: commit | ||
| id: start | ||
| empty: true | ||
| message: Empty commit | ||
| - type: commit | ||
| message: "Add Rick" | ||
| - type: commit | ||
| message: "Add Morty" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| initialization: | ||
| steps: | ||
| - type: commit | ||
| id: start | ||
| empty: true | ||
| message: Empty commit | ||
| - type: commit | ||
| message: "Add Morty" | ||
| - type: branch | ||
| branch-name: others | ||
| - type: checkout | ||
| branch-name: others | ||
| - type: commit | ||
| message: "Add Birdperson" | ||
| - type: commit | ||
| message: "Add Cyborg to birdperson.txt" | ||
| - type: commit | ||
| message: "Add Tammy" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| initialization: | ||
| steps: | ||
| - type: commit | ||
| id: start | ||
| empty: true | ||
| message: Empty commit | ||
| - type: commit | ||
| message: "Add Rick" | ||
| - type: commit | ||
| message: "Add Morty" | ||
| - type: branch | ||
| branch-name: others | ||
| - type: checkout | ||
| branch-name: others | ||
| - type: commit | ||
| message: "Add Birdperson" | ||
| - type: commit | ||
| message: "Add Cyborg to birdperson.txt" | ||
| - type: commit | ||
| message: "Add Tammy" | ||
| - type: checkout | ||
| branch-name: main | ||
| - type: merge | ||
| branch-name: others | ||
| no-ff: false | ||
| message: "Introduce others" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| initialization: | ||
| steps: | ||
| - type: commit | ||
| id: start | ||
| empty: true | ||
| message: Empty commit | ||
| - type: commit | ||
| message: "Add Rick" | ||
| - type: commit | ||
| message: "Add Morty" | ||
| - type: branch | ||
| branch-name: others | ||
| - type: checkout | ||
| branch-name: others | ||
| - type: commit | ||
| message: "Add Birdperson" | ||
| - type: commit | ||
| message: "Add Tammy" | ||
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| from git_autograder import GitAutograderTestLoader, assert_output | ||
| from git_autograder.status import GitAutograderStatus | ||
| from ..verify import ( | ||
| MERGE_NOT_UNDONE, | ||
| MAIN_COMMITS_INCORRECT, | ||
| OTHERS_COMMITS_INCORRECT, | ||
| OTHERS_BRANCH_MISSING, | ||
| verify | ||
| ) | ||
|
|
||
| REPOSITORY_NAME = "ff-undo" | ||
|
|
||
| loader = GitAutograderTestLoader(__file__, REPOSITORY_NAME, verify) | ||
|
|
||
| def test_correct_solution(): | ||
| with loader.load("specs/base.yml") as output: | ||
| assert_output(output, GitAutograderStatus.SUCCESSFUL) | ||
|
|
||
|
|
||
| def test_merge_not_undone(): | ||
| with loader.load("specs/merge_not_undone.yml") as output: | ||
| assert_output(output, GitAutograderStatus.UNSUCCESSFUL, [MERGE_NOT_UNDONE]) | ||
|
|
||
|
|
||
| def test_branch_missing(): | ||
| with loader.load("specs/branch_missing.yml") as output: | ||
| assert_output(output, GitAutograderStatus.UNSUCCESSFUL, [OTHERS_BRANCH_MISSING]) | ||
|
|
||
|
|
||
| def test_main_commits_incorrect(): | ||
| with loader.load("specs/main_commits_incorrect.yml") as output: | ||
| assert_output(output, GitAutograderStatus.UNSUCCESSFUL, [MAIN_COMMITS_INCORRECT]) | ||
|
|
||
|
|
||
| def test_others_commits_incorrect(): | ||
| with loader.load("specs/others_commits_incorrect.yml") as output: | ||
| assert_output(output, GitAutograderStatus.UNSUCCESSFUL, [OTHERS_COMMITS_INCORRECT]) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| from git_autograder import ( | ||
| GitAutograderOutput, | ||
| GitAutograderExercise, | ||
| GitAutograderStatus, | ||
| ) | ||
|
|
||
| MERGE_NOT_UNDONE = ( | ||
| "You need to undo the merge." | ||
| ) | ||
| MAIN_COMMITS_INCORRECT = ( | ||
| "The main branch does not contain the expected commits " | ||
| "The main branch does not contain both commits 'Add Rick' and 'Add Morty'." | ||
| ) | ||
| OTHERS_COMMITS_INCORRECT = ( | ||
| "The others branch does not contain the expected commits " | ||
| "'Add Birdperson', 'Add Cyborg to birdperson.txt', and 'Add Tammy'." | ||
| ) | ||
| OTHERS_BRANCH_MISSING = ( | ||
| "The branch 'others' no longer exists. You should not delete it, only undo the merge on main." | ||
| ) | ||
|
|
||
| def verify(exercise: GitAutograderExercise) -> GitAutograderOutput: | ||
|
|
||
vanphuc1201 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| # Check if branch others exists | ||
| if not exercise.repo.branches.has_branch("others"): | ||
| raise exercise.wrong_answer([OTHERS_BRANCH_MISSING]) | ||
|
|
||
| # Take all commit messages on main | ||
| commit_messages_in_main = [c.message.strip() for c in exercise.repo.repo.iter_commits("main")] | ||
|
|
||
| # Take all commit messages on others | ||
| commit_messages_in_others = [c.message.strip() for c in exercise.repo.repo.iter_commits("others")] | ||
vanphuc1201 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| # Check that the merge commit is not present on main | ||
| has_birdperson_in_main = any("Add Birdperson" in msg for msg in commit_messages_in_main) | ||
vanphuc1201 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| has_cyborg_in_main = any("Add Cyborg to birdperson.txt" in msg for msg in commit_messages_in_main) | ||
| has_tammy_in_main = any("Add Tammy" in msg for msg in commit_messages_in_main) | ||
| if has_birdperson_in_main or has_birdperson_in_main or has_tammy_in_main: | ||
| raise exercise.wrong_answer([MERGE_NOT_UNDONE]) | ||
|
|
||
| # Check that commits in main are only the initial 2 commits | ||
| has_rick = any("Add Rick" in msg for msg in commit_messages_in_main) | ||
| has_morty = any("Add Morty" in msg for msg in commit_messages_in_main) | ||
| if len(commit_messages_in_main) != 3 or not (has_rick and has_morty): | ||
| raise exercise.wrong_answer([MAIN_COMMITS_INCORRECT]) | ||
|
|
||
| # Check that commits in others are only the initial 3 commits | ||
| has_birdperson = any("Add Birdperson" in msg for msg in commit_messages_in_others) | ||
| has_cyborg = any("Add Cyborg to birdperson.txt" in msg for msg in commit_messages_in_others) | ||
| has_tammy = any("Add Tammy" in msg for msg in commit_messages_in_others) | ||
| if len(commit_messages_in_others) != 6 or not (has_birdperson and has_cyborg and has_tammy): | ||
jovnc marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| raise exercise.wrong_answer([OTHERS_COMMITS_INCORRECT]) | ||
|
|
||
| return exercise.to_output( | ||
| ["You have successfully undone the merge of branch 'others'."], | ||
| GitAutograderStatus.SUCCESSFUL, | ||
| ) | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.