{"id":14128573,"url":"https://github.com/spyder-ide/loghub","last_synced_at":"2025-06-25T00:02:51.507Z","repository":{"id":60721363,"uuid":"56267537","full_name":"spyder-ide/loghub","owner":"spyder-ide","description":"Changelog generator based on github milestones or tags.","archived":false,"fork":false,"pushed_at":"2020-07-05T02:12:58.000Z","size":260,"stargazers_count":43,"open_issues_count":6,"forks_count":11,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-06-12T05:34:12.867Z","etag":null,"topics":["changelog","generator","github","github-api","productivity","python","zenhub","zenhub-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spyder-ide.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"open_collective":"spyder"}},"created_at":"2016-04-14T20:20:28.000Z","updated_at":"2025-04-21T12:51:17.000Z","dependencies_parsed_at":"2022-10-03T19:45:32.907Z","dependency_job_id":null,"html_url":"https://github.com/spyder-ide/loghub","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/spyder-ide/loghub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Floghub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Floghub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Floghub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Floghub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spyder-ide","download_url":"https://codeload.github.com/spyder-ide/loghub/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spyder-ide%2Floghub/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260195392,"owners_count":22972720,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["changelog","generator","github","github-api","productivity","python","zenhub","zenhub-api"],"created_at":"2024-08-15T16:01:51.272Z","updated_at":"2025-06-25T00:02:51.477Z","avatar_url":"https://github.com/spyder-ide.png","language":"Python","funding_links":["https://opencollective.com/spyder"],"categories":["Python"],"sub_categories":[],"readme":"# Loghub\n\n## Project details\n\n[![license](https://img.shields.io/pypi/l/loghub.svg)](./LICENSE.txt)\n[![pypi version](https://img.shields.io/pypi/v/loghub.svg)](https://pypi.org/project/loghub/)\n[![conda version](https://img.shields.io/conda/vn/conda-forge/loghub.svg)](https://www.anaconda.com/download/)\n[![OpenCollective Backers](https://opencollective.com/spyder/backers/badge.svg?color=blue)](#backers)\n[![OpenCollective Sponsors](https://opencollective.com/spyder/sponsors/badge.svg?color=blue)](#sponsors)\n[![Join the chat at https://gitter.im/spyder-ide/public](https://badges.gitter.im/spyder-ide/spyder.svg)](https://gitter.im/spyder-ide/public)\n[![PyPI status](https://img.shields.io/pypi/status/loghub.svg)](https://github.com/spyder-ide/loghub)\n\n## Build status\n\n[![Build status](https://github.com/spyder-ide/loghub/workflows/Tests%20master/badge.svg)](https://github.com/spyder-ide/loghub/actions?query=workflow%3A%22Tests+master%22)\n[![Codecov](https://codecov.io/gh/spyder-ide/loghub/branch/master/graph/badge.svg)](https://codecov.io/gh/spyder-ide/loghub/branch/master)\n[![Scrutinizer](https://scrutinizer-ci.com/g/spyder-ide/loghub/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/spyder-ide/loghub/?branch=master)\n\n## Description\n\nChangelog generator based on milestone or tags for github.\n\n## Example output\n\nSo how does this look in practice? It looks like this for 0.3 release of loghub:\n\n```Markdown\n## Version 0.3 (2017-10-10)\n\n### Issues Closed\n\n#### Enhancements\n\n* [Issue 63](https://github.com/spyder-ide/loghub/issues/63) - Add PR link / commit link inside issue ([PR 69](https://github.com/spyder-ide/loghub/pull/69))\n\nIn this release 1 issue was closed.\n\n### Pull Requests Merged\n\n* [PR 69](https://github.com/spyder-ide/loghub/pull/69) - PR: Add extra links for related issues and prs ([63](https://github.com/spyder-ide/loghub/issues/63))\n\nIn this release 1 pull request was closed.\n```\n\nYou can look at [loghub's CHANGELOG.md](https://github.com/spyder-ide/loghub/blob/master/CHANGELOG.md), or\n[spyder's CHANGELOG.md](https://github.com/spyder-ide/spyder/blob/master/CHANGELOG.md) for a more complete example output.\n\n\n## Installation\n\nUsing pip\n\n```bash\npip install loghub\n````\n\nUsing conda\n\n```bash\nconda install loghub -c conda-forge\n````\n\nor\n\n```bash\nconda install loghub -c spyder-ide\n```\n\n## Usage\n\nloghub can be used to generate changelog based on milestones or on tags.\n\nIn projects where milestones are used to track a release we can use for example:\n\n```bash\nloghub spyder-ide/spyder --milestone v3.0\n```\n\nIn projects where milestones are used to track chunks of work but not releases,\nwe can use tags to get the changes after the latest release, for example:\n\n```bash\nloghub spyder-ide/spyder --since-tag v3.0.0b7\n```\n\nOr if loghub is used to generate old changelogs (or update changelogs),\nwe can also use tags to limit the range , for example:\n\n```bash\nloghub spyder-ide/spyder --since-tag v3.0.0b7 --until-tag v3.0.0\n```\n\nFor private repos, just add the username and password arguments, for example:\n\n```bash\nloghub spyder-ide/spyder --since-tag v3.0.0b7 --since-tag v3.0.0 --username \u003cusername\u003e --password \u003cpassword\u003e\n```\n\nOr, just add the username and a password prompt will appear, for example:\n\n```bash\nloghub spyder-ide/spyder --since-tag v3.0.0b7 --since-tag v3.0.0 --username \u003cusername\u003e\n```\n\nOr generate a Github access token and use that instead, for example:\n\n```bash\nloghub spyder-ide/spyder --since-tag v3.0.0b7 -until-tag v3.0.0 --token \u003ctoken\u003e\n```\n\n**Important**\n\nBecause of the Github API rate limitations it is advised to always use authentication\nby either access token or user and password.\n\n## ZenHub Integration\n\nIf your project is using [Zenhub](https://www.zenhub.com/) to manage the workflow, you can also\nuse Zenhub releases to create your changelog.\n\n```bash\nloghub spyder-ide/spyder --zenhub-release \"spyder v4.1.0\" --zenhub-token \u003czenhub-token\u003e\n```\n\n**Important**\n\nFor Zenhub integration to work you need to always use a zenhub token. You can generate one by\ngoing to your [dashboard](https://app.zenhub.com/dashboard/tokens). Same GitHub API rate limits apply here so it is advised to always\nuse authentication by either access token or user and password.\n\n```bash\nloghub spyder-ide/spyder --zenhub-release \"spyder v4.1.0\" --zenhub-token \u003czenhub-token\u003e --token \u003cgithub-token\u003e\n```\n\n## Advanced Usage\n\n### Filter PR base branch\n\nPull requests to display can be filtered depending on the branch they were\nmerged against (base branch):\n              \n```bash\nloghub spyder-ide/spyder --branch 3.x\n```\n\n### Filter issues/PRs by labels\n\nTo filter issues to display, we can use a regular expression:\n\n```bash\nloghub spyder-ide/spyder --issue-label-regex \"Type.*\" --milestone v3.1\n```\n\nThis will filter all the issues that start with *Type*\n\nThe same can be done with PRs\n\n```bash\nloghub spyder-ide/spyder --pr-label-regex \"\u003csome-regex\u003e\" --milestone v3.1\n```\n\n### Group issues by label\n\nIssues displayed can be grouped by labels:\n\n```bash\nloghub spyder-ide/spyder --issue-label-group \"Type-Bug\" \"Bugs Fixed\" --issue-label-group \"Type-Enhancement\" \"New Features\" --milestone v3.1\n```\n\nThis will result in issues being grouped in two sections with the headings\n*Bugs Fixed* and *New Features* respectively.\n\n### Output format\n\nLoghub provides two formats:\n\n* ***changelog***, which is the default and includes links to issues and PRs\n* ***release***, which does not include links\n\n```bash\nloghub spyder-ide/spyder --milestone v3.1 --format release\n```\n\n### Custom templates\n\nLoghub uses Jinja2 templates to format the output. If the current template\ndoes not meet your needs, you can copy the default `templates \u003chttps://github.com/spyder-ide/loghub/tree/master/loghub/templates\u003e`_ \nand create a new one and provide the path to it as:\n\n```bash\nloghub spyder-ide/spyder --milestone v3.1 --template \u003cPATH_TO_TEMPLATE\u003e\n```\n\n## Detailed CLI arguments\n\n```text\nusage: loghub [-h] [-u USERNAME] [-p PASSWORD] [-t TOKEN] [-zt ZENHUB_TOKEN]\n            [-m MILESTONE] [-zr ZENHUB_RELEASE] [-st SINCE_TAG]\n            [-ut UNTIL_TAG] [-b BRANCH]\n            [-ilg ISSUE_LABEL_GROUPS [ISSUE_LABEL_GROUPS ...]]\n            [-plg PR_LABEL_GROUPS [PR_LABEL_GROUPS ...]]\n            [-lg LABEL_GROUPS [LABEL_GROUPS ...]] [-ilr ISSUE_LABEL_REGEX]\n            [-plr PR_LABEL_REGEX] [-f OUTPUT_FORMAT] [--template TEMPLATE]\n            [--batch {milestones,tags}] [--no-prs]\n            repository\n\nScript to print the list of issues and pull requests closed in a given\nmilestone, tag including additional filtering options.\n\npositional arguments:\nrepository            Repository name to generate the Changelog for, in the\n                        form user/repo or org/repo (e.g. spyder-ide/spyder)\n\noptional arguments:\n-h, --help            show this help message and exit\n-u USERNAME, --username USERNAME\n                        Github user name\n-p PASSWORD, --password PASSWORD\n                        Github user password\n-t TOKEN, --token TOKEN\n                        Github access token\n-zt ZENHUB_TOKEN, --zenhub-token ZENHUB_TOKEN\n                        Zenhub access token\n-m MILESTONE, --milestone MILESTONE\n                        Github milestone to get issues and pull requests for\n-zr ZENHUB_RELEASE, --zenhub-release ZENHUB_RELEASE\n                        Zenhub release to get issues and pull requests for\n-st SINCE_TAG, --since-tag SINCE_TAG\n                        Github issues and pull requests since tag\n-ut UNTIL_TAG, --until-tag UNTIL_TAG\n                        Github issues and pull requests until tag\n-b BRANCH, --branch BRANCH\n                        Github base branch for merged PRs\n-ilg ISSUE_LABEL_GROUPS [ISSUE_LABEL_GROUPS ...], --issue-label-group ISSUE_LABEL_GROUPS [ISSUE_LABEL_GROUPS ...]\n                        Groups the generated issues by the specified label.\n                        This optiontakes 1 or 2 arguments, where the first one\n                        is the label to match and the second one is the label\n                        to print on the finaloutput\n-plg PR_LABEL_GROUPS [PR_LABEL_GROUPS ...], --pr-label-group PR_LABEL_GROUPS [PR_LABEL_GROUPS ...]\n                        Groups the generated PRs by the specified label. This\n                        optiontakes 1 or 2 arguments, where the first one is\n                        the label to match and the second one is the label to\n                        print on the finaloutput\n-lg LABEL_GROUPS [LABEL_GROUPS ...], --label-group LABEL_GROUPS [LABEL_GROUPS ...]\n                        Groups the generated issues and PRs by the specified\n                        label. This option takes 1 or 2 arguments, where the\n                        first one is the label to match and the second one is\n                        the label to print on the final output\n-ilr ISSUE_LABEL_REGEX, --issue-label-regex ISSUE_LABEL_REGEX\n                        Label issue filter using a regular expression filter\n-plr PR_LABEL_REGEX, --pr-label-regex PR_LABEL_REGEX\n                        Label pull request filter using a regular expression\n                        filter\n-f OUTPUT_FORMAT, --format OUTPUT_FORMAT\n                        Format for print, either 'changelog' (for Changelog.md\n                        file) or 'release' (for the Github Releases page).\n                        Default is 'changelog'. The 'release' option doesn't\n                        generate Markdown hyperlinks.\n--template TEMPLATE   Use a custom Jinja2 template file\n--batch {milestones,tags}\n                        Run loghub for all milestones or all tags\n--no-prs              Run loghub without any pull requests output\n--no-related-prs      Do not display related prs on issues\n--no-related-issues   Do not display related issues on prs\n```\n\n## Label utility CLI arguments\n\nloghub includes an additional utility to get or update labels.\n\n```text\nusage: loghub-labels [-h] [-u USERNAME] [-p PASSWORD] [-t TOKEN]\n                        [-a [{get,update}]] [-f FILENAME]\n                        repository\n\npositional arguments:\n    repository            Repository name to generate the Changelog for, in the\n                        form user/repo or org/repo (e.g. spyder-ide/spyder)\n\noptional arguments:\n    -h, --help            \n                        show this help message and exit\n\n    -u USERNAME, --username USERNAME\n                        Github user name\n\n    -p PASSWORD, --password PASSWORD\n                        Github user password\n\n    -t TOKEN, --token TOKEN\n                        Github access token\n\n    -a [{get,update}], --action [{get,update}]\n                        Action to take\n\n    -f FILENAME, --filename FILENAME\n                        File for storing labels\n```\n\n## Contributing\n\nEveryone is welcome to contribute!\n\n### Backers\n\nSupport us with a monthly donation and help us continue our activities.\n\n[![Backers](https://opencollective.com/spyder/backers.svg)](https://opencollective.com/spyder#support)\n\n### Sponsors\n\nBecome a sponsor to get your logo on our README on Github.\n\n[![Sponsors](https://opencollective.com/spyder/sponsors.svg)](https://opencollective.com/spyder#support)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspyder-ide%2Floghub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspyder-ide%2Floghub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspyder-ide%2Floghub/lists"}