- This release implements a basic form of the `cutty update` command, which applies changes from a template to the projects that were generated from it.
- To allow tracking template changes, `cutty create` now creates a branch `cutty/latest` containing the pristine generated project. The branch is updated each time `cutty update` is invoked, and updates are applied by cherry-picking the tip of this branch.
- This release also refactors the `create` service to be more service-like, moving implementation details into the relevant adapters.
<details>
<summary>List of PRs</summary>
:rocket: Features
* :sparkles: [services] Honor file deletions when applying changes from templates (287) cjolowicz
* :sparkles: [services] Implement service for updating generated projects (286) cjolowicz
* :sparkles: [filestorage] Update `cutty/latest` branch in existing repository (285) cjolowicz
* :sparkles: [filestorage] Create `cutty/latest` branch at initial commit (284) cjolowicz
* :tada: [cli] Add stub update command and functional test (250) cjolowicz
:racehorse: Performance
* :racehorse: [util] Do not cache all project files in memory (265) cjolowicz
* :racehorse: [util] Avoid O(n) for cached items in lazy sequence (264) cjolowicz
:rotating_light: Testing
* :white_check_mark: [cli] Improve functional test coverage and consolidate fixtures (249) cjolowicz
* :fire: [cli] Remove functional test for repository creation (248) cjolowicz
:hammer: Refactoring
* :art: Rename exception classes with an `Error` suffix (280) cjolowicz
* :recycle: [filestorage] Remove unused parameter `templatedir` in `createcookiecutterstorage` (267) cjolowicz
* :heavy_plus_sign: Replace util.lazysequence with lazysequence from PyPI (269) cjolowicz
* :recycle: services.create: Rename some variables and inline a helper function (266) cjolowicz
* :sparkles: LazySequence: Support negative indices (263) cjolowicz
* :recycle: LazySequence: Rename some parameters and clean up docstring (262) cjolowicz
* :fire: [util] Remove function `peek` (261) cjolowicz
* :recycle: [templates] Rename loadconfig to loadcookiecutterconfig (260) cjolowicz
* :recycle: [util] Add lazy sequence implementation (259) cjolowicz
* :recycle: [templates] Move function for locating project files from services.create (258) cjolowicz
* :recycle: [templates] Move function for locating hooks from services.create (257) cjolowicz
* :recycle: [templates] Extract Cookiecutter bind adapter from services.create (256) cjolowicz
* :recycle: [filestorage] Extract Cookiecutter storage adapter from services.create (255) cjolowicz
* :recycle: [filestorage] Move observer adapters under adapters.observers (254) cjolowicz
* :recycle: [services] Separate hook discovery and rendering from storage creation (253) cjolowicz
* :recycle: [services] Extract functions from create service (252) cjolowicz
* :white_check_mark: [cli] Refactor uses of pygit2 in functional tests (251) cjolowicz
* :recycle: [services] Improve control flow in create service (247) cjolowicz
* :recycle: [filestorage] Avoid depending on concrete classes using Decorator (246) cjolowicz
:package: Dependencies
* ⬆️ Bump sphinx from 4.0.2 to 4.1.1 (283) dependabot
* ⬆️ Bump sphinx from 4.0.2 to 4.1.1 in /docs (281) dependabot
* ⬆️ Bump virtualenv from 20.4.7 to 20.6.0 in /.github/workflows (282) dependabot
* ⬆️ Bump pep8-naming from 0.11.1 to 0.12.0 (273) dependabot
* ⬆️ Bump lazysequence from 0.2.1 to 0.3.0 (279) dependabot
</details>