{"id":7666,"library":"reno","title":"Reno: Release Notes Manager","description":"Reno is a release notes manager designed for high-throughput, distributed development teams. It uses Git to store release notes alongside the code, facilitating detailed and accurate notes, peer review, and easy back-porting. It organizes notes into logical groups (features, bug fixes, known issues) and integrates with Sphinx for automated documentation builds. The current version is 4.1.0, with releases tied to the OpenStack development cycle, typically several times a year.","status":"active","version":"4.1.0","language":"en","source_language":"en","source_url":"https://opendev.org/openstack/reno","tags":["release management","release notes","documentation","openstack","cli"],"install":[{"cmd":"pip install reno","lang":"bash","label":"Install from PyPI"}],"dependencies":[{"reason":"Git repository interaction","package":"dulwich"},{"reason":"Version handling and comparison","package":"packaging"},{"reason":"Used for packaging and version management within OpenStack projects","package":"pbr"},{"reason":"Parsing and managing YAML-formatted configuration and note files","package":"pyyaml"}],"imports":[{"note":"Configuration is managed via the `Config` object, not directly imported from the top-level package.","wrong":"import reno.Config","symbol":"Config","correct":"from reno.config import Config"},{"note":"Components like Scanner are part of submodules and should be imported directly.","wrong":"import reno.Scanner","symbol":"Scanner","correct":"from reno.scanner import Scanner"},{"note":"The Loader class for managing release notes data resides in its dedicated submodule.","wrong":"import reno.Loader","symbol":"Loader","correct":"from reno.loader import Loader"}],"quickstart":{"code":"import os\nfrom reno.config import Config\nfrom reno.main import setup_logging, main\n\n# Simulate command-line arguments and environment\n# For a real application, these would come from sys.argv or direct configuration\n# os.environ['RENO_DEBUG'] = '1'\n\n# Initialize logging for reno output\nsetup_logging()\n\n# Example: Setting up a reno repository (usually done once via 'reno init')\n# This is a conceptual quickstart; reno is primarily a CLI tool.\n# To actually run commands, you'd typically invoke the 'reno' CLI.\n# Example for generating release notes (conceptually):\n# config = Config()\n# config.parse_args(['reno', 'new', 'my-first-note', '--type', 'feature'])\n# main(config)","lang":"python","description":"Reno is primarily a command-line interface (CLI) tool for managing release notes within a Git repository. The Python API is mostly for internal use or advanced integrations. A typical workflow involves `reno init` to set up the repository, `reno new` to create new note fragments, and `reno report` or `reno lint` to process them. The quickstart here shows how to import core components programmatically, though direct CLI usage is more common. To use `reno` effectively, consult its command-line documentation."},"warnings":[{"fix":"Always use `reno new`, `reno edit`, or directly modify the `.rst` or `.yaml` files in the `releasenotes/notes` directory for existing notes. The output of `reno report` is generated, not source-managed.","message":"Reno stores release notes as individual files in a special directory within your Git repository. Directly editing the generated release notes document (e.g., after `reno report`) will cause inconsistencies with the source notes. Always edit individual note files.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Refer to the official documentation for the specific version you are upgrading to, paying close attention to the 'Upgrading' or 'Changes' sections. Review `reno.conf` and command usage.","message":"Older versions of `reno` (prior to 3.x) had different command-line arguments and configuration file structures. Upgrading might require adjusting your CI/CD pipelines and `reno.conf` files.","severity":"breaking","affected_versions":"< 3.0.0"},{"fix":"While `reno`'s CLI generally handles this, if you are integrating `reno`'s internal classes like `Scanner` or `Loader` programmatically, ensure you use them within a `with` statement to guarantee proper resource cleanup. E.g., `with scanner.Scanner(conf) as s: ...`.","message":"When `reno` scans for notes, it may leave open `dulwich.repo.Repo` file handles if not properly closed. This can lead to resource exhaustion in long-running processes or continuous integration environments.","severity":"gotcha","affected_versions":"All versions (if not using context managers)"}],"env_vars":null,"last_verified":"2026-04-16T00:00:00.000Z","next_check":"2026-07-15T00:00:00.000Z","problems":[{"fix":"Ensure `reno init` has been executed in your repository. Create a new note using `reno new <note-name> --type <type>`. Verify that you are on the correct Git branch or that the `reno.conf` settings for `branch` are correct.","cause":"This error occurs when `reno` cannot find any release note fragments in the expected location (typically `releasenotes/notes/`) or for the specified branch/version. This can happen if `reno init` was not run, no notes have been created, or the branch specified does not contain any `reno` notes.","error":"reno.exceptions.NoNotesFound: No notes found in repository"},{"fix":"Update `reno` to the latest version (`pip install --upgrade reno`). Check the documentation for your specific `reno` version regarding `reno new` command-line arguments. The standard is `reno new <name> --type <category>`.","cause":"This typically means you are using an older version of `reno` where the `--type` argument for `reno new` might not have been introduced or had a different syntax. Alternatively, there might be a typo in the command.","error":"Error: unrecognized arguments: --type bugfix"},{"fix":"Upgrade `reno` to version 3.2.0 or newer: `pip install --upgrade reno`. If upgrading is not an option, remove the `encoding` setting from your `reno.conf` file.","cause":"This error indicates that you are attempting to use the `encoding` configuration option with a version of `reno` that does not support it. The `encoding` option was added in `reno` 3.2.0.","error":"TypeError: __init__() got an unexpected keyword argument 'encoding'"}]}