Maintenance#
This chapter describes the maintenance structure of icalendar.
icalendar Maintainers#
Currently the maintainers are the following people.
Maintainers need the following permissions.
Adminaccess to the repository.These can be enabled by a current maintainer or a GitHub organization administrator in the settings.
MaintainerorOwneraccess to the PyPI project.Each owner and maintainer needs a PyPI account. All PyPI accounts require two-factor authentication (2FA) enabled. Owners can invite either new owners or maintainers in the collaboration Section on PyPI.
Maintaineraccess to the Read the Docs project.Existing maintainers can invite another maintainer through the Maintainers page.
Environments/Configure PyPIaccess for GitHub Workflows to grant new releases from tags.Organization owners and repository administrators can grant this access in , or at collective/icalendar, by adding their GitHub username to the list of Required Reviewers.
OwnerorManageraccess toicalendar-coc@googlegroups.comThis Google Group is used for managing Code of Conduct infringement reports.
Managers may manage and moderate messages, whereasOwners may also manage members. Management is performed through Google Groups icalendar-coc settings.Registeredaccess to the OSS Fuzz issue tracker for icalendar.icalendar contributors use this issue tracker for managing Fuzz testing issues that arise from time to time. New issues do not get immediately disclosed to the public, and require that you register with a Google Account. Add your Google Account's email address to google/oss-fuzz, and create a pull request, to request the following access:
instant notification about fuzzing errors
undisclosed fuzzing issues
Existing issues will be disclosed after some time to the public.
- Maintainer in
pyproject.toml Maintainers should be mentioned with or without email address in the
pyproject.tomlfile's maintainers' section.
Collaborators#
Collaborators have write access to the repository. As a collaborator, you can
merge pull requests,
initiate a new release, and
become a Code owner.
The maintainers of icalendar want to have as many knowledgeable people with write access taking responsibility as possible for these reasons:
a constant flow of fixes and new features
better code review
lower bus factor and backup
future maintainers
Nobody should merge their own pull requests. If you like to review or merge pull requests of other people and you have shown that you know how to contribute, you can ask to become a collaborator. A maintainer may ask if you would like to become one.
Code owner#
A code owner is a type of collaborator or maintainer who is responsible for a specific part of the code. Code owners are automatically requested for review when someone opens a pull request that modifies code that they own.
You may ask, or be invited, to become a code owner as part of becoming a collaborator or maintainer.
When doing so, you or the inviter may submit a pull request to update the .github/CODEOWNERS file.
See also
Release versions#
See also
New releases#
This section explains how to create a new release on PyPI.
Its examples were used for the 7.0.0 release of icalendar, a major release. Adjust the examples for the current release as needed.
Since collaborators and maintainers have write access to the repository, they can start the release process.
However, only people with Environments/Configure PyPI access can approve an automated release to PyPI.
Set an environment variable to use in subsequent commands during the release process.
export VERSION=7.0.0
Update the
mainbranch.git checkout main git pull
If you'll create a new major release, update
.github/workflows/tests.ymlto include the new release branch in the list of branches that trigger the CI tests.push: branches: - main - 7.x tags: - v*
Update the change log
CHANGES.rstwith the change log entries in/newsusing towncrier.make changesAdd the changes, create a commit on the
mainbranch, and push the changes to prepare a release of this version.git add CHANGES.rst news/ git add .github/workflows/tests.yml # Only for a new major release git commit -m"version $VERSION" git push # to collective/icalendar
See if the CI tests are running on the commit. If they are not running, no new release can be issued. If the CI passes, go ahead.
Create a tag for the release on its release branch
*.x, push, and make sure the CI tests are running.First, make sure you're on the
mainbranch and it's current, in case someone else updatedmainwhile tests ran.git checkout main git pull
Next, depending on the release type, do one of the following.
For a major release, create a new branch, and check it out.
git switch -c 7.x
For a minor or patch release, check out the existing branch, and update it.
git checkout 7.x git pull
Next, merge
maininto the release branch.git merge main
Next, push changes upstream, changing the command according to the release type.
For a major release, push, create, and track the upstream branch.
git push -u upstream 7.x # to collective/icalendar
For a minor or patch release, just push.
git push # to collective/icalendar
Next create a tag, and push the tag.
git tag "v$VERSION" git push upstream "v$VERSION" # to collective/icalendar
Warning
Once a tag is pushed to the repository, it must not be re-tagged or deleted. This creates issues for downstream repositories. See #1033.
Once the tag is pushed and its CI tests pass, check the GitHub Actions, and wait for maintainers to get an email:
Subject: Deployment review in collective/icalendar tests: PyPI is waiting for your review
If the release is approved by a maintainer, it will be pushed to PyPI. Don't wait for that, continue.
Update the version switcher file
docs/_static/version-switcher.json.Note
This file is configured in
docs/conf.pyon all branches to use the version on themainbranch, which is "latest" on Read the Docs.json_url = "https://icalendar.readthedocs.io/en/latest/_static/version-switcher.json"
The following examples were used for the 7.0.0 release.
Check out the
mainbranch and update it.git checkout main git pull
When cutting a new major release version, update
docs/_static/version-switcher.jsonto match that version.Duplicate the second previous major version stanza and renumber it to the first previous version. In other words, duplicate the
5.xstanza, and renumber the copy to6.x.{ "version": "6.x", "url": "https://icalendar.readthedocs.io/en/6.x/" },
Next, edit the array item for the previous version to reflect the current major release.
{ "name": "7.x (stable)", "version": "v7.0.0", "url": "https://icalendar.readthedocs.io/en/stable/", "preferred": "true" },
When cutting a minor or patch release version, update
docs/_static/version-switcher.jsonto match that version's tag name.{ "name": "7.x (stable)", "version": "v7.0.1", "url": "https://icalendar.readthedocs.io/en/stable/", "preferred": "true" },
For all releases, add, commit, and push the changes.
git add docs/_static/version-switcher.json git commit -m "Update version switcher for $VERSION" git push # to collective/icalendar
Revert the change in the earlier step by updating the Sphinx configuration file
docs/conf.pyto show the version warning banner on themainbranch, which is "latest" on Read the Docs.git checkout main git pull
html_theme_options = { # ... "show_version_warning_banner": True,
git add docs/conf.py git commit -m "Restore version warning banner for 'latest' on Read the Docs" git push # to collective/icalendar
If you cut a new major release version, update the Sphinx configuration file
docs/conf.pyon the previous numbered major release branch to show the version warning banner. For example, when releasing 7.0.0, checkout6.x, and update it as shown.git checkout 6.x git pull
html_theme_options = { # ... "show_version_warning_banner": True,
git add docs/conf.py git commit -m "Show version warning banner for previous major version 6.x on Read the Docs" git push # to collective/icalendar
Configure Read the Docs.
Verify that the "stable" version was activated automatically on Read the Docs.
Deactivate previous releases in that current stable release line. Click on the ellipsis icon, and select Configure version. Toggle the Active switch to deactivate the version.
Add a comment to each of the issues mentioned in the new release. Example:
This is included in v7.0.0.
Links#
This section contains useful links for maintainers and collaborators.
Updating Python versions#
When adding support for a new Python version, or removing support for an old one, the following files need to be updated:
.github/workflows/tests.ymlUpgrade Python versions.
.github/workflows/*.pyAdd or remove the Python version from the test matrix.
tox.iniUpdate the
envlistto include or remove the Python version.pyproject.tomlUpdate the
requires-pythonline and theclassifierslist.docs/reference/versions-branches.rstUpdate the compatibility information.
docs/maintenance.rstUpdate this list if any new files need to be modified.
- Branch Protection Rules
Update the branch protection rules so that they match the required test names.
Remember to write tests that completely cover the changes, and update any documentation that mentions supported Python versions.