Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions ff_undo/.gitmastery-exercise.json
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
}
}
1 change: 1 addition & 0 deletions ff_undo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
See https://git-mastery.github.io/lessons/merge/exercise-ff-undo.html
Empty file added ff_undo/__init__.py
Empty file.
62 changes: 62 additions & 0 deletions ff_undo/download.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from exercise_utils.git import (
add,
commit,
checkout,
merge,
)
from exercise_utils.file import (
create_or_update_file,
append_to_file,
)


def setup(verbose: bool = False):
create_or_update_file(
"rick.txt",
"""
Hero
""",
)
add(["."], verbose)
commit("Add Rick", verbose)

create_or_update_file(
"morty.txt",
"""
Boy
""",
)
add(["."], verbose)
commit("Add Morty", verbose)

checkout("others", True, verbose)

create_or_update_file(
"birdperson.txt",
"""
No job
""",
)
add(["."], verbose)
commit("Add Birdperson", verbose)

append_to_file(
"birdperson.txt",
"""
Cyborg
""",
)
add(["."], verbose)
commit("Add Cyborg to birdperson.txt", verbose)

create_or_update_file(
"tammy.txt",
"""
Spy
""",
)
add(["."], verbose)
commit("Add Tammy", verbose)

checkout("main", False, verbose)
merge("others", True, verbose)
Empty file added ff_undo/tests/__init__.py
Empty file.
22 changes: 22 additions & 0 deletions ff_undo/tests/specs/base.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
initialization:
steps:
- type: commit
empty: true
message: Set initial state
id: start
- 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
10 changes: 10 additions & 0 deletions ff_undo/tests/specs/branch_missing.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
initialization:
steps:
- type: commit
empty: true
message: Set initial state
id: start
- type: commit
message: "Add Rick"
- type: commit
message: "Add Morty"
18 changes: 18 additions & 0 deletions ff_undo/tests/specs/main_commits_incorrect.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
initialization:
steps:
- type: commit
empty: true
message: Set initial state
id: start
- 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"
26 changes: 26 additions & 0 deletions ff_undo/tests/specs/merge_not_undone.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
initialization:
steps:
- type: commit
empty: true
message: Set initial state
id: start
- 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"
18 changes: 18 additions & 0 deletions ff_undo/tests/specs/others_commits_incorrect.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
initialization:
steps:
- type: commit
empty: true
message: Set initial state
id: start
- 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"
42 changes: 42 additions & 0 deletions ff_undo/tests/test_verify.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
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]
)
52 changes: 52 additions & 0 deletions ff_undo/verify.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
from git_autograder import (
GitAutograderOutput,
GitAutograderExercise,
GitAutograderStatus,
)

ADD_RICK = "Add Rick"
ADD_MORTY = "Add Morty"
ADD_BIRDPERSON = "Add Birdperson"
ADD_CYBORG = "Add Cyborg to birdperson.txt"
ADD_TAMMY = "Add Tammy"

MERGE_NOT_UNDONE = "The merge has not been undone properly."
MAIN_COMMITS_INCORRECT = "The main branch does not contain the expected commits."
OTHERS_COMMITS_INCORRECT = "The others branch does not contain the expected commits."
OTHERS_BRANCH_MISSING = "Missing branch 'others'."


def verify(exercise: GitAutograderExercise) -> GitAutograderOutput:
main_branch = exercise.repo.branches.branch("main")
others_branch = exercise.repo.branches.branch_or_none("others")

if others_branch is None:
raise exercise.wrong_answer([OTHERS_BRANCH_MISSING])

# Verify commits in main branch
commit_messages_in_main = [c.commit.message.strip() for c in main_branch.commits]
if any(
msg in commit_messages_in_main
for msg in [ADD_BIRDPERSON, ADD_CYBORG, ADD_TAMMY]
):
raise exercise.wrong_answer([MERGE_NOT_UNDONE])

if len(commit_messages_in_main) != 3 or not all(
msg in commit_messages_in_main for msg in [ADD_RICK, ADD_MORTY]
):
raise exercise.wrong_answer([MAIN_COMMITS_INCORRECT])

# Verify commits in others branch
commit_messages_in_others = [
c.commit.message.strip() for c in others_branch.commits
]
if len(commit_messages_in_others) != 6 or not all(
msg in commit_messages_in_others
for msg in [ADD_BIRDPERSON, ADD_CYBORG, ADD_TAMMY, ADD_RICK, ADD_MORTY]
):
raise exercise.wrong_answer([OTHERS_COMMITS_INCORRECT])

return exercise.to_output(
["You have successfully undone the merge of branch 'others'."],
GitAutograderStatus.SUCCESSFUL,
)