From 6af921ee44002faa5407fce8638c1def26ff091a Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Fri, 14 Aug 2020 18:26:47 -0500 Subject: [PATCH 1/5] Added Merge Conflicts Level class --- gitgud/skills/__init__.py | 4 +++- gitgud/skills/level_builder.py | 14 +++++++----- gitgud/skills/newbasics/__init__.py | 31 ++++++++++++++++++++++++++ gitgud/skills/newbasics/test_levels.py | 15 +++++++++++++ setup.py | 2 ++ 5 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 gitgud/skills/newbasics/__init__.py create mode 100644 gitgud/skills/newbasics/test_levels.py diff --git a/gitgud/skills/__init__.py b/gitgud/skills/__init__.py index ae8bcbd4..200345e8 100644 --- a/gitgud/skills/__init__.py +++ b/gitgud/skills/__init__.py @@ -4,6 +4,7 @@ from gitgud.skills.rework import skill as rework_skill from gitgud.skills.mixedbag import skill as mixedbag_skill from gitgud.skills.extras import skill as extras_skill +from gitgud.skills.newbasics import skill as newbasics_skill from gitgud.skills.util import AllSkills @@ -13,7 +14,8 @@ rampup_skill, rework_skill, mixedbag_skill, - extras_skill + extras_skill, + newbasics_skill ]) all_levels = [] diff --git a/gitgud/skills/level_builder.py b/gitgud/skills/level_builder.py index 064a978f..d6266fb6 100644 --- a/gitgud/skills/level_builder.py +++ b/gitgud/skills/level_builder.py @@ -93,16 +93,20 @@ def file(self, path): def cat_file(self, path): cat_file(self.file(path)) + def details(self): + details_path = self.file('details.yaml') + if details_path.is_file(): + with open(details_path) as details_file: + return yaml.safe_load(details_file) + else: + return None + def _setup(self): file_operator = operations.get_operator() file_operator.use_repo() commits, head = parse_spec(self.file('setup.spec')) - details_path = self.file('details.yaml') - if details_path.is_file(): - details = yaml.safe_load(details_path.open()) - else: - details = None + details = self.details() file_operator.create_tree(commits, head, details, self.level_dir) diff --git a/gitgud/skills/newbasics/__init__.py b/gitgud/skills/newbasics/__init__.py new file mode 100644 index 00000000..30eeab54 --- /dev/null +++ b/gitgud/skills/newbasics/__init__.py @@ -0,0 +1,31 @@ +from gitgud import operations +from gitgud.skills.level_builder import BasicLevel +from gitgud.skills.util import Skill + + +class MergeConflicts(BasicLevel): + def _test(self): + if not super()._test(): + return False + + op = operations.get_operator() + tree = op.repo.head.commit.tree + merge_details = self.details()['M1']['files'] + + for blob in tree.blobs: + path = blob.path + content = merge_details[path][0] + blob_content = blob.data_stream.read().decode('ascii') + + if content.strip() != blob_content.strip(): + return False + + return True + + +skill = Skill( + 'Placeholder', + 'newbasics', + [ + ] +) diff --git a/gitgud/skills/newbasics/test_levels.py b/gitgud/skills/newbasics/test_levels.py new file mode 100644 index 00000000..5a2467f7 --- /dev/null +++ b/gitgud/skills/newbasics/test_levels.py @@ -0,0 +1,15 @@ +import pytest + +from gitgud.skills.testing import simulate + +from . import skill + + +level_tests = [ + (level, level.solution_list()) for level in skill +] + + +@pytest.mark.parametrize('level,commands', level_tests) +def test_level(gg, level, commands): + simulate(gg, level, commands) diff --git a/setup.py b/setup.py index 6271b645..d42c80c3 100644 --- a/setup.py +++ b/setup.py @@ -18,6 +18,7 @@ 'gitgud', 'gitgud.hooks', 'gitgud.skills', + 'gitgud.skills.newbasics', 'gitgud.skills.basics', 'gitgud.skills.extras', 'gitgud.skills.rampup', @@ -28,6 +29,7 @@ package_data={ 'gitgud': ['version.txt', 'welcome.txt'], 'gitgud.skills.intro': ['_*/*'], + 'gitgud.skills.newbasics': ['_*/*'], 'gitgud.skills.basics': ['_*/*'], 'gitgud.skills.extras': ['_*/*'], 'gitgud.skills.rampup': ['_*/*'], From 2cabc1094643b7d17fbc378e971125c0df096cce Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Fri, 14 Aug 2020 18:30:33 -0500 Subject: [PATCH 2/5] Added Merge Conflicts level files --- .../skills/newbasics/_conflicts/details.yaml | 26 +++++++++++++++++++ .../newbasics/_conflicts/explanation.txt | 3 +++ gitgud/skills/newbasics/_conflicts/goal.txt | 1 + gitgud/skills/newbasics/_conflicts/setup.spec | 4 +++ .../skills/newbasics/_conflicts/solution.txt | 4 +++ gitgud/skills/newbasics/_conflicts/test.spec | 5 ++++ 6 files changed, 43 insertions(+) create mode 100644 gitgud/skills/newbasics/_conflicts/details.yaml create mode 100644 gitgud/skills/newbasics/_conflicts/explanation.txt create mode 100644 gitgud/skills/newbasics/_conflicts/goal.txt create mode 100644 gitgud/skills/newbasics/_conflicts/setup.spec create mode 100644 gitgud/skills/newbasics/_conflicts/solution.txt create mode 100644 gitgud/skills/newbasics/_conflicts/test.spec diff --git a/gitgud/skills/newbasics/_conflicts/details.yaml b/gitgud/skills/newbasics/_conflicts/details.yaml new file mode 100644 index 00000000..6ee6732f --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/details.yaml @@ -0,0 +1,26 @@ +'1': + message: "Added intro" + files: + intro.txt: + - Once upon a time, there was a princess +'3': + message: "Added middle" + add-files: + middle.txt: + - She lived a fulfilling life +'2': + message: "Added ending" + add-files: + middle.txt: + - She lived + ending.txt: + - And then she died +'M1': + message: "Merge branch 'ending' into master" + files: + intro.txt: + - Once upon a time, there was a princess + middle.txt: + - She lived a fulfilling life + ending.txt: + - And then she died diff --git a/gitgud/skills/newbasics/_conflicts/explanation.txt b/gitgud/skills/newbasics/_conflicts/explanation.txt new file mode 100644 index 00000000..f632181b --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/explanation.txt @@ -0,0 +1,3 @@ +Use this file to explain to the users how to use the git feature that this level focuses on. +>>> +Separate blocks using ">>>", and be sure to include tips and examples as explanation aids. diff --git a/gitgud/skills/newbasics/_conflicts/goal.txt b/gitgud/skills/newbasics/_conflicts/goal.txt new file mode 100644 index 00000000..674aaaae --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/goal.txt @@ -0,0 +1 @@ +In this file, write a short explanation of the level's goal (e.g. "Merge commits 1 and 2"). diff --git a/gitgud/skills/newbasics/_conflicts/setup.spec b/gitgud/skills/newbasics/_conflicts/setup.spec new file mode 100644 index 00000000..0ada6f7f --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/setup.spec @@ -0,0 +1,4 @@ +1 +2 (master) +3 : 1 (other) +master diff --git a/gitgud/skills/newbasics/_conflicts/solution.txt b/gitgud/skills/newbasics/_conflicts/solution.txt new file mode 100644 index 00000000..015a72f9 --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/solution.txt @@ -0,0 +1,4 @@ +git merge other +echo "She lived a fulfilling life" > middle.txt +git add middle.txt +git commit --no-edit diff --git a/gitgud/skills/newbasics/_conflicts/test.spec b/gitgud/skills/newbasics/_conflicts/test.spec new file mode 100644 index 00000000..f21c4bcf --- /dev/null +++ b/gitgud/skills/newbasics/_conflicts/test.spec @@ -0,0 +1,5 @@ +1 +2 +3 : 1 (other) +M1 : 2 3 (master) +master From 6edc37fb68c6171989e8051bafe7ebe328ff8a19 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Fri, 14 Aug 2020 19:44:44 -0500 Subject: [PATCH 3/5] Added Rebasing files --- .../skills/newbasics/_rebasing/details.yaml | 26 +++++++++++++++++++ .../newbasics/_rebasing/explanation.txt | 3 +++ gitgud/skills/newbasics/_rebasing/goal.txt | 1 + gitgud/skills/newbasics/_rebasing/setup.spec | 4 +++ .../skills/newbasics/_rebasing/solution.txt | 4 +++ gitgud/skills/newbasics/_rebasing/test.spec | 5 ++++ 6 files changed, 43 insertions(+) create mode 100644 gitgud/skills/newbasics/_rebasing/details.yaml create mode 100644 gitgud/skills/newbasics/_rebasing/explanation.txt create mode 100644 gitgud/skills/newbasics/_rebasing/goal.txt create mode 100644 gitgud/skills/newbasics/_rebasing/setup.spec create mode 100644 gitgud/skills/newbasics/_rebasing/solution.txt create mode 100644 gitgud/skills/newbasics/_rebasing/test.spec diff --git a/gitgud/skills/newbasics/_rebasing/details.yaml b/gitgud/skills/newbasics/_rebasing/details.yaml new file mode 100644 index 00000000..6ee6732f --- /dev/null +++ b/gitgud/skills/newbasics/_rebasing/details.yaml @@ -0,0 +1,26 @@ +'1': + message: "Added intro" + files: + intro.txt: + - Once upon a time, there was a princess +'3': + message: "Added middle" + add-files: + middle.txt: + - She lived a fulfilling life +'2': + message: "Added ending" + add-files: + middle.txt: + - She lived + ending.txt: + - And then she died +'M1': + message: "Merge branch 'ending' into master" + files: + intro.txt: + - Once upon a time, there was a princess + middle.txt: + - She lived a fulfilling life + ending.txt: + - And then she died diff --git a/gitgud/skills/newbasics/_rebasing/explanation.txt b/gitgud/skills/newbasics/_rebasing/explanation.txt new file mode 100644 index 00000000..f632181b --- /dev/null +++ b/gitgud/skills/newbasics/_rebasing/explanation.txt @@ -0,0 +1,3 @@ +Use this file to explain to the users how to use the git feature that this level focuses on. +>>> +Separate blocks using ">>>", and be sure to include tips and examples as explanation aids. diff --git a/gitgud/skills/newbasics/_rebasing/goal.txt b/gitgud/skills/newbasics/_rebasing/goal.txt new file mode 100644 index 00000000..674aaaae --- /dev/null +++ b/gitgud/skills/newbasics/_rebasing/goal.txt @@ -0,0 +1 @@ +In this file, write a short explanation of the level's goal (e.g. "Merge commits 1 and 2"). diff --git a/gitgud/skills/newbasics/_rebasing/setup.spec b/gitgud/skills/newbasics/_rebasing/setup.spec new file mode 100644 index 00000000..0ada6f7f --- /dev/null +++ b/gitgud/skills/newbasics/_rebasing/setup.spec @@ -0,0 +1,4 @@ +1 +2 (master) +3 : 1 (other) +master diff --git a/gitgud/skills/newbasics/_rebasing/solution.txt b/gitgud/skills/newbasics/_rebasing/solution.txt new file mode 100644 index 00000000..015a72f9 --- /dev/null +++ b/gitgud/skills/newbasics/_rebasing/solution.txt @@ -0,0 +1,4 @@ +git merge other +echo "She lived a fulfilling life" > middle.txt +git add middle.txt +git commit --no-edit diff --git a/gitgud/skills/newbasics/_rebasing/test.spec b/gitgud/skills/newbasics/_rebasing/test.spec new file mode 100644 index 00000000..f21c4bcf --- /dev/null +++ b/gitgud/skills/newbasics/_rebasing/test.spec @@ -0,0 +1,5 @@ +1 +2 +3 : 1 (other) +M1 : 2 3 (master) +master From 23ba9d23599df6d8db678f9728c91853fc2c13c6 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Fri, 14 Aug 2020 21:08:23 -0500 Subject: [PATCH 4/5] Updated Rebasing Instead technical files --- gitgud/skills/newbasics/__init__.py | 1 + gitgud/skills/newbasics/_rebasing/setup.spec | 4 ++-- gitgud/skills/newbasics/_rebasing/solution.txt | 4 ++-- gitgud/skills/newbasics/_rebasing/test.spec | 5 ++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gitgud/skills/newbasics/__init__.py b/gitgud/skills/newbasics/__init__.py index 30eeab54..cd6c07e0 100644 --- a/gitgud/skills/newbasics/__init__.py +++ b/gitgud/skills/newbasics/__init__.py @@ -27,5 +27,6 @@ def _test(self): 'Placeholder', 'newbasics', [ + MergeConflicts('Rebasing', 'rebasing', __name__) ] ) diff --git a/gitgud/skills/newbasics/_rebasing/setup.spec b/gitgud/skills/newbasics/_rebasing/setup.spec index 0ada6f7f..52a71d4c 100644 --- a/gitgud/skills/newbasics/_rebasing/setup.spec +++ b/gitgud/skills/newbasics/_rebasing/setup.spec @@ -1,4 +1,4 @@ 1 -2 (master) -3 : 1 (other) +2 (other) +3 : 1 (master) master diff --git a/gitgud/skills/newbasics/_rebasing/solution.txt b/gitgud/skills/newbasics/_rebasing/solution.txt index 015a72f9..891e5489 100644 --- a/gitgud/skills/newbasics/_rebasing/solution.txt +++ b/gitgud/skills/newbasics/_rebasing/solution.txt @@ -1,4 +1,4 @@ -git merge other +git rebase master other echo "She lived a fulfilling life" > middle.txt git add middle.txt -git commit --no-edit +git rebase --continue diff --git a/gitgud/skills/newbasics/_rebasing/test.spec b/gitgud/skills/newbasics/_rebasing/test.spec index f21c4bcf..4cc4d322 100644 --- a/gitgud/skills/newbasics/_rebasing/test.spec +++ b/gitgud/skills/newbasics/_rebasing/test.spec @@ -1,5 +1,4 @@ 1 2 -3 : 1 (other) -M1 : 2 3 (master) -master +3' : 1 (other) +other From 952ed07d11ec5159ed57bd37b5e975bac776bf10 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Sun, 13 Sep 2020 13:45:54 -0500 Subject: [PATCH 5/5] Updated comments in create_tree --- gitgud/operations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitgud/operations.py b/gitgud/operations.py index 032aa5d0..dbd24a15 100644 --- a/gitgud/operations.py +++ b/gitgud/operations.py @@ -66,7 +66,7 @@ def clear_tree_and_index(self): if path != self.git_path: shutil.rmtree(path) - # Easiest way to clear the index is to commit an empty directory + # Since all files are gone, updating removes them from the index self.repo.git.add(update=True) def shutoff_pager(self): @@ -161,7 +161,7 @@ def create_tree(self, commits, head, details, level_dir): self.repo.index.commit( "Placeholder commit\n\n" "This commit is used when initializing levels." - "Something must have gone wrong", + "If you see this, something must have gone wrong.", parent_commits=[], skip_hooks=True) # Detach HEAD so we can delete branches