03.11 Git: трёхстороннее слияние; приложения с командной строкой
Напоминание: все упражнения с git-ом ведутся на ветке ⑂ main и растущих от нее ветках
Трёхстороннее слияние
- Повторение: интерференция коммитов в git
diff3 и ему подобные
ручное вмешательство при merge или rebase (правка, коммит, continue) — или abort
- формат 3way diff файла
упражнение из лекции: merge интерферирующих веток, разрешение конфликтов:
- Создаём общий коммит — длинный файл
Создаём ветку second
(⑂ main) Делаем коммит — изменения начала и середины файла
(⑂ second) Делаем коммит — середины (в том же месте) и конца файла
( отличие от лекции) Мержим second в main
Использование mergetool (kdiff3 / [g]vimdiff / …)
- Удалим merge commit — ветки снова можно мержить или ребейзить!
упражнение: rebase интерферирующих веток c kdiff3, gvimdiff или meld
Rebase ⑂ second поверх ⑂ main
Создание приложения с командной строкой
- принцип организации:
do_*()
complete_*()
docstring-и и help_*()
пример do_() из лекций
Сделать командную строку для TextCalendar
Принцип работы complete_*()
Пример complete_*() из лекций
Посмотреть, как устроены имена месяцев в calendar: это элементы глобального IntEnum, у которых есть имена и значения. Список месяцев — это просто list(calendar.Month).
На основании имён месяцев и их значений сделать подстановку для второго параметра команды prmonth по имени
- принцип организации:
Д/З
Задача_1: переход на cmd, разработка на ветке с конфликтом объединения
Скопируйте решение Задачи_1 с предыдущего занятия. Сделайте коммит.
Продолжите историю на ветке work:
Реорганизуйте уже имеющиеся команды с помощью cmd и do_команда()
- При этом "из коробки" приедет автодополнение частично введенного имени команды по нажатию TAB
- Решение оформить в виде серии коммитов
ВНИМАНИЕ: поскольку в дальнейшем нужно будет реализовать в MUD поддержку пакетного режима выполнения команд со считыванием их из командного файла (*.mood), разделяйте в коде работу с командной строкой (т.е. ввод команд) и разбор/выполнение команд. Так чтобы без существенной переделки кода можно было добавить альтернативный источник команд - файл, а не командную строку.
Реализуйте поддержку базовой команды attack (без параметров). Обработка команды:
Если в позиции, где находится игрок, нет монстра, вывести "No monster here" и завершить обработку команды
- Атака наносит урон монстру в 10 очков здоровья, если у монстра не менее 10 о.з., в противном случае урон равен количеству о.з. монстра
Вывести: "Attacked <имя монстра>, damage <урон> hp", где <имя монстра> - имя монстра в одной позиции с игроком (таких монстров ровно один), <урон> - число списанных о.з.
- После корректировки здоровья монстра (как принято говорить, "отрицательного выздоровления") вывести:
если о.з. монстра равны 0: "<имя монстра> died"
в противном случае: "<имя монстра> now has <очки здоровья>", где <очки здоровья> - количество оставшихся о.з. у монстра
- Если у монстра 0 о.з., удалить монстра с позиции
Далее последний коммит в реализации базовой команды attack обозначен как
Создайте ветку weapon_name на базе коммита и переключитесь на неё (проверьте!)
Реализуйте на ветке weapon_name атаку разными видами оружия, с указанием оружия в параметре with команды attack
синтаксис команды: attack with <имя оружия>
варианты для <имя оружия>: sword, spear, axe; наносимый урон, соответственно: 10, 15, 20
при указании неизвестного оружия выводить: "Unknown weapon", и завершать обработку команды
параметр with необязательный, значение по умолчанию: sword
для имени оружия должно работать автодополнение имен через TAB (используйте complete_команда())
если имя оружия указано правильно, продолжать обработку как для базовой команды attack, но с соответствующим оружию значением урона
Создайте ветку attack_by_name на базе коммита и переключитесь на неё (проверьте!)
Реализуйте на ветке attack_by_name атаку с обязательным указанием имени монстра
синтаксис команды: attack <имя монстра>
если монстра с данным именем нет в позиции, где находится игрок, вывести "No <имя монстра> here" и завершить обработку команды
в противном случае (т.е. монстр с данным именем есть), продолжить обработку как для базовой команды attack
для имени монстра должно работать автодополнение, а также пролистывание имен через TAB (используйте complete_команда()); пролистываться должны имена ДОСТУПНЫХ В ИГРЕ монстров, т.е. тех, которые могут быть добавлены через команду addmon
сделайте merge ветки weapon_name на ветку work, он будет бесконфликтным (т.к. на work история не продвинулась дальше )
сделайте merge ветки attack_by_name на ветку work, при этом разрешите конфликты из-за разных доработок команды attack
в результате должна появиться поддержка команды с синтаксисом "attack <имя монстра> with <имя оружия>", с поддержкой автодополнения и пролистывания как по имени монстра, так и по имени оружия