{"id":25543432,"url":"https://github.com/gatoreducator/reporover","last_synced_at":"2026-05-05T21:31:17.975Z","repository":{"id":278107610,"uuid":"934542571","full_name":"GatorEducator/reporover","owner":"GatorEducator","description":":dog: RepoRover manages and analyzes remote GitHub repositories! :robot:","archived":false,"fork":false,"pushed_at":"2025-02-18T14:51:34.000Z","size":119,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-02-18T15:25:33.691Z","etag":null,"topics":["github","github-actions","github-classroom","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GatorEducator.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-18T02:24:13.000Z","updated_at":"2025-02-18T15:23:38.000Z","dependencies_parsed_at":"2025-02-18T15:36:51.156Z","dependency_job_id":null,"html_url":"https://github.com/GatorEducator/reporover","commit_stats":null,"previous_names":["gatoreducator/reporepo","gatoreducator/reporover"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatorEducator%2Freporover","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatorEducator%2Freporover/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatorEducator%2Freporover/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatorEducator%2Freporover/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GatorEducator","download_url":"https://codeload.github.com/GatorEducator/reporover/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239793062,"owners_count":19697893,"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","github-actions","github-classroom","python"],"created_at":"2025-02-20T07:19:18.698Z","updated_at":"2026-05-05T21:31:17.962Z","avatar_url":"https://github.com/GatorEducator.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/GatorEducator/reporover/blob/main/.github/images/reporover-logo.svg\" alt=\"RepoRover Logo\"\n    title=\"RepoRover Logo\" /\u003e\n\u003c/p\u003e\n\n# RepoRover\n\n[![Build](https://github.com/GatorEducator/reporover/actions/workflows/build.yml/badge.svg)](https://github.com/GatorEducator/reporover/actions/workflows/build.yml)\n[![Coverage](https://img.shields.io/badge/dynamic/json?color=brightgreen\u0026label=coverage\u0026query=%24.totals.percent_covered_display\u0026suffix=%25\u0026url=https%3A//raw.githubusercontent.com/wiki/GatorEducator/reporover/coverage.json)](https://github.com/GatorEducator/reporover)\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/reporover)\n![PyPI - Version](https://img.shields.io/pypi/v/reporover?logoColor=blue\u0026color=blue)\n[![Code Style: ruff](https://img.shields.io/badge/style-Ruff-blue.svg)](https://docs.astral.sh/ruff/)\n[![Maintenance](https://img.shields.io/badge/maintained%3F-Yes-blue.svg)](https://github.com/gkapfham/chasten/graphs/commit-activity)\n[![License LGPL v3](https://img.shields.io/badge/license-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0)\n\n## :sparkles: Table of Contents\n\n\u003c!---toc start--\u003e\n\n- [:robot: Introduction](#robot-introduction)\n- [:smile: Perspectives](#smile-perspectives)\n- [:rocket: Motivation](#rocket-motivation)\n- [:package: Installation and Configuration](#package-installation-and-configuration)\n- [:wrench: Prerequisites](#wrench-prerequisites)\n- [:inbox_tray: Installation](#inbox_tray-installation)\n- [:dog: Running RepoRover](#dog-running-reporover)\n- [:key: Access Command](#key-access-command)\n- [:bulb: Comment Command](#speech_balloon-comment-command)\n- [:bar_chart: Status Command](#bar_chart-status-command)\n- [:handshake: Contributing](#handshake-contributing)\n\n\u003c!---toc end--\u003e\n\n## :robot: Introduction\n\nRepoRover is your command-line companion for managing and analyzing multiple\nGitHub repositories at once! Whether you're an instructor managing student\nrepositories on GitHub Classroom or a developer handling multiple project\nrepositories, RepoRover is here to make your life easier and more fun!\n\n## :smile: Perspectives\n\nRepoRover is a tool that automatically manages and analyzes multiple GitHub\nrepositories within a GitHub organization. Here are three different perspectives\nthat people may have about the tool!\n\n- **Student perspective**: \"I'm glad RepoRover made it easy for me to quickly\nreceive feedback on my project repositories from GitHub Classroom.\"\n- **Instructor perspective**: \"RepoRover makes it much easier for me to oversee\nmy students' repositories, manage access levels, and leave feedback on their\npull requests.\"\n- **Developer perspective**: \"Since RepoRover uses `uv` to manage its\ndevelopment, I found that it is very easy to add features, saving me a lot of\ntime and effort.\"\n\n## :rocket: Motivation\n\nHandy command-line tools like `gh` let you access and manipulate a GitHub\nrepository. However, these tools may be limiting for certain scenarios because\nthey normally operate on a single repository. In contrast, RepoRover operates on\nmultiple repositories within the same GitHub organization. It's perfect for\nmanaging project repositories created by GitHub Classroom, making it easier to\nhandle bulk operations efficiently. When you use RepoRover, you can say goodbye\nto repetitive tasks and hello to automation! RepoRover roves across the remote\nGitHub repositories for your student's projects, operating like a trusty robotic\ndog as it fetches the results you need.\n\n## :package: Installation and Configuration\n\n### :wrench: Prerequisites\n\nTo use RepoRover, you'll need the following:\n\n- Python 3.11+\n- GitHub Personal Access Token\n\nTo use RepoRover, you'll need a GitHub Personal Access Token with the necessary\npermissions to complete tasks like managing repositories and leave comments on\npull requests. Keep it handy and make sure to keep it secure!\n\n### :inbox_tray: Installation\n\nYou can easily install RepoRover with `pipx` or `uv`! Depending on which tool\nyou prefer, just run one of the following commands:\n\nInstall RepoRover with `pipx`:\n\n```bash\npipx install reporover\n```\n\nInstall RepoRover with `uv`:\n\n```bash\nuv tool install reporover\n```\n\nIf you do not want to install `reporover` directly but you have `uv` installed,\nthen you can also replace the `reporover` command in the following instructions\nwith `uvx reporover`. This will run the `reporover` tool with the `uvx` command\nwithout requiring you to install it globally on your system.\n\n## :dog: Running RepoRover\n\nRepoRover comes with several powerful commands to make your life easier when you\nmanage multiple GitHub repositories. The concrete examples of these commands use\na synthetic GitHub personal access token of\n`ghp_12345ABCDEfghijKLMNOP67890qrstuvWXYZ`. Please note that this is a fake\ntoken used for illustrative purposes. To run these commands you need to create\nyour own GitHub personal access token and use it in the command-line.\n\n### :key: Access Command\n\nNeed to modify user access levels for multiple repositories? You can type the\ncommand `reporover access --help` to change the access level for one or more\nusers, providing the following arguments and options:\n\n```bash\nUsage: reporover access [OPTIONS] github_org_url repo_prefix usernames_file token\n\nArguments:\n* github_org_url TEXT URL of GitHub organization [default: None] [required]\n* repo_prefix TEXT Prefix for GitHub repository [default: None] [required]\n* usernames_file PATH Path to JSON file with usernames [default: None] [required]\n* token TEXT GitHub token for authentication [default: None] [required]\n\nOptions:\n--username TEXT One or more usernames accounts to modify [default: None]\n--pr-number INTEGER Pull request number in GitHub repository [default: 1]\n--pr-message TEXT Pull request number in GitHub repository\n--access-level [read|triage|write|maintain|admin] The access level for user [default: read]\n--help Show this message and exit.\n```\n\nHere is a concrete example that shows how to use the `reporover access` command.\nPlease note that in this command-line example on the following examples, the `$`\nindicates that you should type the command at the prompt in your terminal\nwindow.\n\n```bash\n$ reporover access https://github.com/my-org repo-prefix usernames.json \\\nghp_12345ABCDEfghijKLMNOP67890qrstuvWXYZ --username student1 --access-level write\n```\n\nThis command will change the access level for the specified users in all\nrepositories matching the prefix. In the context of GitHub Classroom, the\n`repo_prefix` is the initial part of the name of a GitHub repository that is\nshared in common by the individual repository for each student who accepted the\nassignment. Finally, an example `usernames.json` file might include the\nfollowing content for a class that has two students and `gkapfham` as the course\ninstructor:\n\n```json\n{\n\"usernames\": [\"gkapfham\", \"student1\", \"student2\"]\n}\n```\n\n### :bulb: Comment Command\n\nNeed to leave comments on pull requests for multiple repositories? You can type\nthe command `reporover comment --help` to learn how to comment on an existing\npull request in the GitHub repository for one or more users. To run this command\nyou need to provide the following arguments and options:\n\n```bash\nUsage: reporover comment [OPTIONS] github_org_url repo_prefix usernames_file pr_message token\n\nArguments:\n* github_org_url TEXT URL of GitHub organization [default: None] [required]\n* repo_prefix TEXT Prefix for GitHub repository [default: None] [required]\n* usernames_file PATH Path to JSON file with usernames [default: None] [required]\n* pr_message TEXT Pull request message for GitHub repository [default: None] [required]\n* token TEXT GitHub token for authentication [default: None] [required]\n\nOptions:\n--username TEXT One or more usernames accounts to modify [default: None]\n--pr-number INTEGER Pull request number in GitHub repository [default: 1]\n--help Show this message and exit.\n```\n\nHere is a concrete example that shows how to use the `reporover comment`\ncommand:\n\n```bash\n$ reporover comment https://github.com/my-org repo-prefix usernames.json \\\n\"✨Update?\" ghp_12345ABCDEfghijKLMNOP67890qrstuvWXYZ --pr-number 1\n```\n\nThis command will leave a comment on the specified pull request for each\nmatching repository. When using this command, it is important to note that, if\nconfigured correctly, GitHub Classroom will automatically create pull request\nnumber `1` that can be used for sending the comment.\n\n### :cyclone: Clone Command\n\nNeed to clone multiple GitHub repositories to your local machine? The clone\ncommand makes it easy to download all repositories matching a prefix to a local\ndirectory. You can type the command `reporover clone --help` to learn how to\nclone repositories from a GitHub organization. To run this command you need to\nprovide the following arguments and options:\n\n```bash\nUsage: reporover clone [OPTIONS] github_org_url repo_prefix usernames_file token destination_directory\n\nArguments:\n* github_org_url TEXT URL of GitHub organization [default: None] [required]\n* repo_prefix TEXT Prefix for GitHub repository [default: None] [required]\n* usernames_file PATH Path to JSON file with usernames [default: None] [required]\n* token TEXT GitHub token for authentication [default: None] [required]\n* destination_directory PATH Local directory to clone repositories into [default: None] [required]\n\nOptions:\n--username TEXT One or more usernames accounts to clone [default: None]\n--help Show this message and exit.\n```\n\nHere is a concrete example that shows how to use the `reporover clone` command:\n\n```bash\n$ reporover clone https://github.com/my-org repo-prefix usernames.json \\\nghp_12345ABCDEfghijKLMNOP67890qrstuvWXYZ /tmp/cloned-repos --username student1\n```\n\nThis command will clone the specified repositories to the chosen local\ndirectory. Each repository will be cloned into a subdirectory named after the\nfull repository name. This is particularly useful for instructors who want to\ndownload all student repositories for local review, grading, or analysis. The\ncommand respects the username filtering, so you can clone repositories for\nspecific students or all students at once.\n\n### :hammer: Commit Command\n\nNeed to commit one or more files to multiple GitHub repositories? The commit\ncommand allows you to add and commit files to repositories across your\norganization. You can type the command `reporover commit --help` to learn how to\ncommit files to repositories. To run this command you need to provide the\nfollowing arguments and options:\n\n```bash\nUsage: reporover commit [OPTIONS] github_org_url repo_prefix usernames_file token directory files commit_message\ndestination_directory\n\nArguments:\n* github_org_url TEXT URL of GitHub organization [default: None] [required]\n* repo_prefix TEXT Prefix for GitHub repository [default: None] [required]\n* usernames_file PATH Path to JSON file with usernames [default: None] [required]\n* token TEXT GitHub token for authentication [default: None] [required]\n* directory PATH Directory containing the file(s) to commit [default: None] [required]\n* files PATH File(s) to commit [default: None] [required]\n* commit_message TEXT Commit message for the files [default: None] [required]\n* destination_directory PATH Destination directory inside the GitHub repository [default: None] [required]\n\nOptions:\n--username TEXT One or more usernames accounts to modify [default: None]\n--help Show this message and exit.\n```\n\nHere is a concrete example that shows how to use the `reporover commit` command:\n\n```bash\n$ reporover commit https://github.com/my-org repo-prefix usernames.json \\\nghp_12345ABCDEfghijKLMNOP67890qrstuvWXYZ /local/files test.py main.py \\\n\"Add new test files\" src --username student1\n```\n\nThis command will commit the specified files from your local directory to the\ndestination directory in each matching repository. This sub-command of\n`reporover` is perfect using the command-line to distribute starter files,\ntests, or updates to all student repositories at once.\n\n### :bar_chart: Status Command\n\nCurious about the GitHub Actions status for multiple repositories? RepoRover has\ncan fetch that information for you! You can type the command `reporover status\n--help` to learn how to comment on an existing pull request in the GitHub\nrepository for one or more users. To run this command you need to provide the\nfollowing arguments and options:\n\n```bash\nUsage: reporover status [OPTIONS] github_org_url repo_prefix usernames_file token\n\nGet the GitHub Actions status for repositories.\n\nArguments:\n* github_org_url TEXT URL of GitHub organization [default: None] [required]\n* repo_prefix TEXT Prefix for GitHub repository [default: None] [required]\n* usernames_file PATH Path to JSON file with usernames [default: None] [required]\n* token TEXT GitHub token for authentication [default: None] [required]\n\nOptions:\n--username TEXT One or more usernames accounts to modify [default: None]\n--pr-number INTEGER Pull request number in GitHub repository [default: 1]\n--pr-message TEXT Pull request number in GitHub repository\n--access-level [read|triage|write|maintain|admin] The access level for user [default: read]\n--help Show this message and exit.\n```\n\nHere is a concrete example that shows how to use the `reporover status` command:\n\n```bash\nreporover status https://github.com/my-org repo-prefix usernames.json ghp_12345ABCDEfghijKLMNOP67890qrstuvWXYZ\n```\n\nThis command will fetch and display the latest GitHub Actions status for each\nrepository. If you are a course instructor, this will help you to quickly stay\ninformed about the status of each student's project, all without leaving the\ncomfort of your terminal window!\n\n## :handshake: Contributing\n\nThe RepoRover developers welcome contributions with wagging tails! If you find a\nbug or have a feature request, please open an issue on our [issue\ntracker](https://github.com/your-repo/reporover/issues). Potential contributions\ncan fork this repository and submit a pull request with their suggested changes.\nQuestions or comments about RepoRover? You can direct those to the development\nby opening an issue in our [issue\ntracker](https://github.com/your-repo/reporover/issues). We'd love to hear from\nand collaborate with you! Happy RepoRovering!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgatoreducator%2Freporover","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgatoreducator%2Freporover","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgatoreducator%2Freporover/lists"}