From 621e277294aafda19446cfead058de0c8124a6bc Mon Sep 17 00:00:00 2001 From: Vikram Goyal Date: Mon, 2 Feb 2026 13:54:33 +0800 Subject: [PATCH 1/3] Change exercise config to support extra fork_all_branches boolean --- scripts/new-exercise.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/new-exercise.py b/scripts/new-exercise.py index eb5a91da..b440a28e 100755 --- a/scripts/new-exercise.py +++ b/scripts/new-exercise.py @@ -15,6 +15,7 @@ class ExerciseRepoConfig: repo_name: str repo_title: Optional[str] create_fork: Optional[bool] + fork_all_branches: Optional[bool] init: Optional[bool] exercise_name: str @@ -70,12 +71,15 @@ def get_exercise_config() -> ExerciseConfig: init: Optional[bool] = None create_fork: Optional[bool] = None + fork_all_branches: Optional[bool] = None repo_title: Optional[str] = None if exercise_repo_type == "local": init = confirm("Initialize exercise repo as Git repository?", True) elif exercise_repo_type == "remote": repo_title = prompt("Git-Mastery Github repository title", "") create_fork = confirm("Create fork of repository?", True) + if create_fork: + fork_all_branches = confirm("Copy all branches?", False) return ExerciseConfig( exercise_name=exercise_name, tags=tags, @@ -87,6 +91,7 @@ def get_exercise_config() -> ExerciseConfig: repo_name=exercise_repo_name, repo_title=repo_title, create_fork=create_fork, + fork_all_branches=fork_all_branches, init=init, ), ) From 4cf069c9faea36c60c8679a83c85a7f60810281b Mon Sep 17 00:00:00 2001 From: Vikram Goyal Date: Mon, 2 Feb 2026 13:55:25 +0800 Subject: [PATCH 2/3] Add fake_exercise for testing --- fake_exercise/.gitmastery-exercise.json | 15 +++++++++++++++ fake_exercise/README.md | 1 + fake_exercise/__init__.py | 0 fake_exercise/download.py | 8 ++++++++ fake_exercise/test_verify.py | 12 ++++++++++++ fake_exercise/verify.py | 11 +++++++++++ 6 files changed, 47 insertions(+) create mode 100644 fake_exercise/.gitmastery-exercise.json create mode 100644 fake_exercise/README.md create mode 100644 fake_exercise/__init__.py create mode 100644 fake_exercise/download.py create mode 100644 fake_exercise/test_verify.py create mode 100644 fake_exercise/verify.py diff --git a/fake_exercise/.gitmastery-exercise.json b/fake_exercise/.gitmastery-exercise.json new file mode 100644 index 00000000..24f0aeac --- /dev/null +++ b/fake_exercise/.gitmastery-exercise.json @@ -0,0 +1,15 @@ +{ + "exercise_name": "fake-exercise", + "tags": [], + "requires_git": true, + "requires_github": true, + "base_files": {}, + "exercise_repo": { + "repo_type": "remote", + "repo_name": "make-exercise", + "repo_title": "samplerepo-funny-glossary", + "create_fork": true, + "fork_all_branches": true, + "init": null + } +} \ No newline at end of file diff --git a/fake_exercise/README.md b/fake_exercise/README.md new file mode 100644 index 00000000..2a913619 --- /dev/null +++ b/fake_exercise/README.md @@ -0,0 +1 @@ +See https://git-mastery.github.io/lessons/{LESSON_ID}/exercise-fake-exercise.html diff --git a/fake_exercise/__init__.py b/fake_exercise/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fake_exercise/download.py b/fake_exercise/download.py new file mode 100644 index 00000000..df0bbc24 --- /dev/null +++ b/fake_exercise/download.py @@ -0,0 +1,8 @@ +from exercise_utils.cli import run_command +from exercise_utils.gitmastery import create_start_tag + +__resources__ = {} + + +def setup(verbose: bool = False): + create_start_tag(verbose) diff --git a/fake_exercise/test_verify.py b/fake_exercise/test_verify.py new file mode 100644 index 00000000..0c6a15a5 --- /dev/null +++ b/fake_exercise/test_verify.py @@ -0,0 +1,12 @@ +from exercise_utils.test import GitAutograderTestLoader + +from .verify import verify + +REPOSITORY_NAME = "fake-exercise" + +loader = GitAutograderTestLoader(REPOSITORY_NAME, verify) + + +def test_base(): + with loader.start() as (test, rs): + pass diff --git a/fake_exercise/verify.py b/fake_exercise/verify.py new file mode 100644 index 00000000..1288d3de --- /dev/null +++ b/fake_exercise/verify.py @@ -0,0 +1,11 @@ +from git_autograder import ( + GitAutograderOutput, + GitAutograderExercise, + GitAutograderStatus, +) + + +def verify(exercise: GitAutograderExercise) -> GitAutograderOutput: + # INSERT YOUR GRADING CODE HERE + + return exercise.to_output([], GitAutograderStatus.SUCCESSFUL) From 8fd30aca6c9b6eddd353bfc56d470535a206862b Mon Sep 17 00:00:00 2001 From: Vikram Goyal Date: Mon, 2 Feb 2026 14:07:57 +0800 Subject: [PATCH 3/3] Remove test exercise --- fake_exercise/.gitmastery-exercise.json | 15 --------------- fake_exercise/README.md | 1 - fake_exercise/__init__.py | 0 fake_exercise/download.py | 8 -------- fake_exercise/test_verify.py | 12 ------------ fake_exercise/verify.py | 11 ----------- 6 files changed, 47 deletions(-) delete mode 100644 fake_exercise/.gitmastery-exercise.json delete mode 100644 fake_exercise/README.md delete mode 100644 fake_exercise/__init__.py delete mode 100644 fake_exercise/download.py delete mode 100644 fake_exercise/test_verify.py delete mode 100644 fake_exercise/verify.py diff --git a/fake_exercise/.gitmastery-exercise.json b/fake_exercise/.gitmastery-exercise.json deleted file mode 100644 index 24f0aeac..00000000 --- a/fake_exercise/.gitmastery-exercise.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "exercise_name": "fake-exercise", - "tags": [], - "requires_git": true, - "requires_github": true, - "base_files": {}, - "exercise_repo": { - "repo_type": "remote", - "repo_name": "make-exercise", - "repo_title": "samplerepo-funny-glossary", - "create_fork": true, - "fork_all_branches": true, - "init": null - } -} \ No newline at end of file diff --git a/fake_exercise/README.md b/fake_exercise/README.md deleted file mode 100644 index 2a913619..00000000 --- a/fake_exercise/README.md +++ /dev/null @@ -1 +0,0 @@ -See https://git-mastery.github.io/lessons/{LESSON_ID}/exercise-fake-exercise.html diff --git a/fake_exercise/__init__.py b/fake_exercise/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/fake_exercise/download.py b/fake_exercise/download.py deleted file mode 100644 index df0bbc24..00000000 --- a/fake_exercise/download.py +++ /dev/null @@ -1,8 +0,0 @@ -from exercise_utils.cli import run_command -from exercise_utils.gitmastery import create_start_tag - -__resources__ = {} - - -def setup(verbose: bool = False): - create_start_tag(verbose) diff --git a/fake_exercise/test_verify.py b/fake_exercise/test_verify.py deleted file mode 100644 index 0c6a15a5..00000000 --- a/fake_exercise/test_verify.py +++ /dev/null @@ -1,12 +0,0 @@ -from exercise_utils.test import GitAutograderTestLoader - -from .verify import verify - -REPOSITORY_NAME = "fake-exercise" - -loader = GitAutograderTestLoader(REPOSITORY_NAME, verify) - - -def test_base(): - with loader.start() as (test, rs): - pass diff --git a/fake_exercise/verify.py b/fake_exercise/verify.py deleted file mode 100644 index 1288d3de..00000000 --- a/fake_exercise/verify.py +++ /dev/null @@ -1,11 +0,0 @@ -from git_autograder import ( - GitAutograderOutput, - GitAutograderExercise, - GitAutograderStatus, -) - - -def verify(exercise: GitAutograderExercise) -> GitAutograderOutput: - # INSERT YOUR GRADING CODE HERE - - return exercise.to_output([], GitAutograderStatus.SUCCESSFUL)