{"id":25843255,"url":"https://github.com/gouttegd/grainyhead","last_synced_at":"2025-03-01T06:48:13.522Z","repository":{"id":39601936,"uuid":"390461448","full_name":"gouttegd/grainyhead","owner":"gouttegd","description":"Helper tools for GitHub","archived":false,"fork":false,"pushed_at":"2024-09-09T18:07:08.000Z","size":241,"stargazers_count":2,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-09-09T22:16:33.056Z","etag":null,"topics":["github","python"],"latest_commit_sha":null,"homepage":"https://incenp.org/dvlpt/grainyhead/index.html","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gouttegd.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-28T18:28:54.000Z","updated_at":"2024-09-09T18:07:11.000Z","dependencies_parsed_at":"2023-11-22T14:31:46.375Z","dependency_job_id":"2ec0196f-2108-49f0-891c-518e6d66f564","html_url":"https://github.com/gouttegd/grainyhead","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gouttegd%2Fgrainyhead","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gouttegd%2Fgrainyhead/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gouttegd%2Fgrainyhead/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gouttegd%2Fgrainyhead/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gouttegd","download_url":"https://codeload.github.com/gouttegd/grainyhead/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241329402,"owners_count":19944984,"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":["github","python"],"created_at":"2025-03-01T06:48:12.991Z","updated_at":"2025-03-01T06:48:13.510Z","avatar_url":"https://github.com/gouttegd.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8329980.svg)](https://doi.org/10.5281/zenodo.8329980)\n\nGrainyHead - Helper tools for GitHub\n====================================\n\nGrainyHead is a set of Python scripts to work with GitHub repositories\nfrom the command line.\n\nThe name comes from the fruit fly gene _grainyhead_ (_grh_).\n\n\nFeatures\n--------\nCurrently, GrainyHead allows to:\n\n* list “old” issues (issues that have not been updated for a while) in a\n  repository;\n* automatically close said “old” issues;\n* obtain some metrics about what happened in a repository (e.g. how many\n  issues were opened, how many pull requests were merged, how many\n  comments were added, etc.).\n\n\nConfiguration\n-------------\nGrainyHead needs a configuration file. The default configuration file is\n`$XDG_CONFIG_HOME/grainyhead/config` on GNU/Linux and similar systems,\nor `~/Library/Application Support/grainyhead/config` on Mac OS. Another\nlocation may be specified with the `-c` option.\n\nThe configuration file uses the INI-style format where each section\ndescribes a repository to work with. Here is a minimal configuration:\n\n```\n[default]\nrepository: https://github.com/\u003cGitHub owner name\u003e/\u003crepository name\u003e\ntoken: \u003caccess token\u003e\n```\n\nSee [GitHub's documentation](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)\non how to get an access token. Note that some features of GrainyHead\nrequire that the token has the `read:org` permission.\n\nIf the configuration file does not exist, you will be prompted for the\nrepository URL and your access token when you first invoke the program.\n\n\nUsage\n-----\nInvoke `grainyhead` with the `--help` option to get the list of\navailable commands. Invoke a command with that same option to get a\ndetailled help message for the command.\n\nIf called without any command, `grainyhead` will enter into an\ninteractive shell mode, from which commands can be entered repeatedly\nwithout leaving the program.\n\n\n### Listing old issues in a repository\n\nUse the `issues` command to list open issues that have not been updated\nfor a while (365 days by default):\n\n```\n$ grainyhead issues\n```\n\nThe output is a Markdown-style table containing, for each issue, its\nname, its author, a value indicating whether the author is a known\ncontributor to the repository, and the names of any user(s) assigned to\ntake care of the issue.\n\nUse the `--team` option to specify the name of the GitHub team from the\norganisation that owns the repository. The command will then indicate\nfor each issue whether its author is a member of that team.\n\n\n### Closing old issues in a repository\n\nThe `close` command will automatically close all issues that have not\nbeen updated for a while (365 days by default).\n\nEach issue to be closed with be tagged with `autoclosed-unfixed` and a\ncomment will be added to explain that the issue has been closed\nautomatically.\n\n\n### Listing repository metrics\n\nThe `metrics` command will list some statistics about the repository\nover a given period of time:\n\n```\n$ grainyhead metrics\nFrom 2021-09-02 to 2021-12-01\n\n| Event | Total | Internal | Internal (%) | External | Externam (%) |\n| -------- | -------- | -------- | -------- | -------- | -------- |\n| Contributors | 24 | 15 | 62.50 | 9 | 37.50 |\n| Issues opened | 71 | 64 | 90.14 | 7 | 9.86 |\n| Issues closed | 89 | 77 | 86.52 | 12 | 13.48 |\n| Pull requests opened | 86 | 68 | 79.07 | 18 | 20.93 |\n| Pull requests closed | 94 | 78 | 82.98 | 16 | 17.02 |\n| Pull requests merged | 79 | 65 | 82.28 | 14 | 17.72 |\n| Comments | 476 | 412 | 86.55 | 64 | 13.45 |\n| Commits | 232 | 201 | 86.64 | 31 | 13.36 |\n| Releases | 4 | 4 | 100.00 | 0 | 0.00 |\n```\n\n\nCopying\n-------\nGrainyHead is distributed under the terms of the GNU General Public\nLicense, version 3 or higher. The full license is included in the\n[COPYING file](COPYING) of the source distribution.\n\n\nHomepage and repository\n-----------------------\n\nThe project is located at \u003chttps://incenp.org/dvlpt/grainyhead.html\u003e\nwith the manual at \u003chttps://incenp.org/dvlpt/grainyhead/index.html\u003e.\nThe source code is available in a Git repository at\n\u003chttps://github.com/gouttegd/grainyhead\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgouttegd%2Fgrainyhead","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgouttegd%2Fgrainyhead","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgouttegd%2Fgrainyhead/lists"}