{"id":15030703,"url":"https://github.com/rust-lang/team","last_synced_at":"2025-05-15T04:04:25.696Z","repository":{"id":37550441,"uuid":"159056205","full_name":"rust-lang/team","owner":"rust-lang","description":"Rust teams structure","archived":false,"fork":false,"pushed_at":"2025-05-13T20:21:45.000Z","size":4002,"stargazers_count":327,"open_issues_count":54,"forks_count":301,"subscribers_count":32,"default_branch":"master","last_synced_at":"2025-05-15T00:05:41.086Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rust-lang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-11-25T17:20:38.000Z","updated_at":"2025-05-13T20:21:49.000Z","dependencies_parsed_at":"2022-07-14T06:10:27.557Z","dependency_job_id":"ab303684-180d-42d3-b53e-aeeb5f4f90db","html_url":"https://github.com/rust-lang/team","commit_stats":{"total_commits":2027,"total_committers":313,"mean_commits":6.476038338658147,"dds":0.8978786383818451,"last_synced_commit":"e1c8ac5fdc72a9497ddc5d86c6824620a5927c27"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rust-lang%2Fteam","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rust-lang%2Fteam/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rust-lang%2Fteam/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rust-lang%2Fteam/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rust-lang","download_url":"https://codeload.github.com/rust-lang/team/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254270641,"owners_count":22042858,"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":[],"created_at":"2024-09-24T20:14:08.620Z","updated_at":"2025-05-15T04:04:25.667Z","avatar_url":"https://github.com/rust-lang.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rust teams structure\n\nThis repository contains the structure of the Rust teams. The repository is\nautomatically synchronized with:\n\n| Service                                                    |  Synchronized every   |                                           |\n|------------------------------------------------------------|:---------------------:|-------------------------------------------|\n| [@bors][bors]                                              |    *In real time*     | [Integration source][bors-src]            |\n| [Crater and @craterbot][crater]                            |    *In real time*     | [Integration source][crater-src]          |\n| [Perf and @rust-timer][perf]                               |    *In real time*     | [Integration source][perf-src]            |\n| [@rfcbot][rfcbot]                                          |       5 minutes       | [Integration source][rfcbot-src]          |\n| GitHub teams membership                                    | *Shortly after merge* | [Integration source][sync-team-src]       |\n| GitHub repositories                                        | *Shortly after merge* | [Integration source][sync-team-src]       |\n| Mailing lists and aliases (`@rust-lang.org`, `@crates.io`) | *Shortly after merge* | [Integration source][sync-team-src]       |\n| Zulip user group membership                                | *Shortly after merge* | [Integration source][sync-team-src]       |\n| [Governance section on the website][www]                   |       2 minutes       | [Integration source][www-src]             |\n| crates.io admin access                                     |        1 hour         | [Integration source][crates-io-admin-src] |\n\nIf you need to add or remove a person from a team, send a PR to this\nrepository. After it's merged, their account will be added/removed\nfrom all the supported services.\n\n[bors]: https://buildbot2.rust-lang.org/homu\n\n[bors-src]: https://github.com/rust-lang/homu/blob/master/homu/auth.py\n\n[www]: https://www.rust-lang.org/governance\n\n[www-src]: https://github.com/rust-lang/www.rust-lang.org/blob/master/src/teams.rs\n\n[crater]: https://github.com/rust-lang-nursery/crater\n\n[crater-src]: https://github.com/rust-lang-nursery/crater/blob/master/src/server/auth.rs\n\n[perf]: https://perf.rust-lang.org\n\n[perf-src]: https://github.com/rust-lang-nursery/rustc-perf/blob/master/site/src/server.rs\n\n[rfcbot]: https://rfcbot.rs\n\n[rfcbot-src]: https://github.com/anp/rfcbot-rs/blob/master/src/teams.rs\n\n[sync-team-src]: sync-team\n\n[crates-io-admin-src]: https://github.com/rust-lang/crates.io/blob/main/src/worker/jobs/sync_admins.rs\n\n## Documentation\n\n* [TOML schema reference](docs/toml-schema.md)\n\n## Using the CLI tool\n\nIt's possible to interact with this repository through its CLI tool.\n\n### Verifying the integrity of the repository\n\nThis repository contains some sanity checks to avoid having stale or broken\ndata. You can run the checks locally with the `check` command:\n\n```\ncargo run check\n```\n\nNote that some of these checks will be skipped due to missing API tokens.\n\n### Adding a person to the repository\n\nIt's possible to fetch the public information present in a GitHub profile and\nstore it in a person's TOML file:\n\n```\ncargo run add-person \u003cgithub-username\u003e\n```\n\nYou can also add additional information, such as someone's Discord or Zulip ID by adding additional fields to their `.toml` file.\n\nYou can use the `--fetch-zulip-id` flag to automatically try to find the Zulip ID for the added user based on their GitHub login. This will only work if the user has linked their Zulip and GitHub accounts. You will need to get a [Zulip API key](https://zulip.com/api/api-keys#get-your-api-key) for this to work, and set the following environment variables:\n\n- `ZULIP_USER`: should be set to the e-mail address of your Zulip account\n- `ZULIP_TOKEN`: should be set to your API key\n\nIf you need to determine someone's Zulip ID manually, find them in the list of people on the\nright-hand side in Zulip, click the \"three dots\" menu and then \"View profile\", and copy the 'User ID'\ninto the toml file:\n\n```\nzulip-id = \u003cuser id\u003e\n```\n\n### Querying information out of the repository\n\nThere are a few CLI commands that allow you to get some information generated\nfrom the data in the repository.\n\nYou can get a list of all the people in a team:\n\n```\ncargo run dump-team all\n```\n\nYou can get a list of all the email addresses subscribed to a list:\n\n```\ncargo run dump-list all@rust-lang.org\n```\n\nYou can get a list of all the users with a permission:\n\n```\ncargo run dump-permission perf\n```\n\nYou can generate [www.rust-lang.org](https://github.com/rust-lang/www.rust-lang.org)'s locales/en-US/tools.ftl file by running\n\n```\ncargo run dump-website\n```\n\nThe website will automatically load new teams added here, however they cannot be translated unless `tools.ftl` is also updated.\n\nYou can also print a list of users with individual access to repositories\n\n```\n# Group the accesses by repository\ncargo run dump-individual-access --group-mode repo\n\n# Group the accesses by contributor\ncargo run dump-individual-access --group-mode person\n```\n\n### Building the static API\n\nYou can build locally the content of `https://team-api.infra.rust-lang.org/v1/`\nby running the command:\n\n```\ncargo run static-api output-dir/\n```\n\nThe content will be placed in `output-dir/`.\n\n### Syncing the state\n\nYou can use the tool to synchronize state to the live services. By default, the tool will run in *dry mode* on all the services we synchronize, meaning that the changes will be previewed on the console output but no actual change will be applied:\n\n```\ncargo run sync\n```\n\nOnce you're satisfied with the changes you can run the full synchronization by\npassing the `apply` subcommand:\n\n```\ncargo run sync apply\n```\n\nYou can also limit the services to synchronize on by passing a list of all the\nservice names you want to sync. For example, to synchronize only GitHub and\nMailgun you can run:\n\n```\ncargo run -- sync --services github,mailgun\ncargo run -- sync --services github,mailgun apply\n```\n\nBy default, the synchronization will be based on data from the current `team` repository checkout.\nYou can also perform the sync based on the live `team` endpoint using `--src=production`, or on an existing directory on disk that contains the prebuilt JSON files using `--src=\u003cpath\u003e`.\n\n```\ncargo run -- sync --src=\u003cdirectory\u003e\n```\n\nThe `\u003cdirectory\u003e` with JSON data can be generated using `cargo run static-api`.\n\n### Encrypting email addresses\n\nIf an email address in a list needs to be confidential it's possible to encrypt\nit. Encrypted email addresses look like this:\n\n```\nencrypted+3eeedb8887004d9a8266e9df1b82a2d52dcce82c4fa1d277c5f14e261e8155acc8a66344edc972fa58b678dc2bcad2e8f7c201a1eede9c16639fe07df8bac5aa1097b2ad9699a700edb32ef192eaa74bf7af0a@rust-lang.invalid\n```\n\nThe production key is accessible to select Infrastructure Team members, so if\nyou need to add an encrypted email address you'll need to reach out to that\nteam. The key is stored in the following parameter on AWS SSM Parameter Store:\n\n```\n/prod/sync-team/email-encryption-key\n```\n\nThe `cargo run encrypt-email` and `cargo run decrypt-email` interactive CLI\ncommands are available for infra team members to interact with encrypted\nemails. The `rust_team_data` (with the `email-encryption` feature enabled) also\nprovides a module to programmatically encrypt and decrypt.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frust-lang%2Fteam","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frust-lang%2Fteam","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frust-lang%2Fteam/lists"}