From bf3fcfcdd8932ccf65c8eed955438d90cb5e72a5 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 15:26:50 +0900 Subject: [PATCH 01/16] Merge contributing guides of Bundler and RubyGems --- CONTRIBUTING.md | 348 ++++++++++++++++++- doc/bundler/README.md | 11 +- doc/bundler/contributing/BUG_TRIAGE.md | 53 --- doc/bundler/contributing/COMMUNITY.md | 13 - doc/bundler/contributing/HOW_YOU_CAN_HELP.md | 26 -- doc/bundler/contributing/README.md | 28 -- doc/rubygems/CONTRIBUTING.md | 231 ------------ 7 files changed, 346 insertions(+), 364 deletions(-) delete mode 100644 doc/bundler/contributing/BUG_TRIAGE.md delete mode 100644 doc/bundler/contributing/COMMUNITY.md delete mode 100644 doc/bundler/contributing/HOW_YOU_CAN_HELP.md delete mode 100644 doc/bundler/contributing/README.md delete mode 100644 doc/rubygems/CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a3766e852236..ee79ef141984 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,351 @@ # How to contribute -## Contributing to RubyGems +Community involvement is essential to RubyGems. We want to keep it as easy as +possible to contribute changes. There are a few guidelines that we need +contributors to follow to reduce the time it takes to get changes merged in. -Check [RubyGems contribution guidelines](doc/rubygems/CONTRIBUTING.md). +## Guidelines + +1. New features should be coupled with tests. + +2. Ensure that your code blends well with ours: + * No trailing whitespace + * Match indentation (two spaces) + * Match coding style (run `bin/rake rubocop`) + +3. If any new files are added or existing files removed in a commit or PR, + please update the `Manifest.txt` accordingly. This can be done by running + `bin/rake update_manifest` + +4. Don't modify the history file or version number. + +5. If you have any questions, Feel free to join us on Slack, you can register + by signing up at http://slack.bundler.io or file an issue here: + http://github.com/ruby/rubygems/issues + + +For more information and ideas on how to contribute to RubyGems ecosystem, see +here: https://guides.rubygems.org/contributing/ + +## Getting Started + +### Installing dependencies + + bin/rake setup + +> **NOTE**: If the above fails with permission related errors, you're most +> likely using a global Ruby installation (like the one packaged by your OS), +> which sets `GEM_HOME` to a location regular users can't write to. Consider +> using a Ruby version manager like [RVM](https://github.com/rvm/rvm), +> [rbenv](https://github.com/rbenv/rbenv), +> [chruby](https://github.com/postmodern/chruby) or [asdf](https://github.com/asdf-vm/asdf-ruby). These will install Ruby to a +> location regular users can write to, so you won't run into permission issues. +> Alternatively, consider setting `GEM_HOME` environment variable to a writable +> location with something like `export GEM_HOME=/tmp/rubygems.gems` and try +> again. + +### Manually trying your local changes + +To run commands like `gem install` from the repo: + + ruby -Ilib exe/gem install + +To run commands like `bundle install` from the repo: + + bundler/bin/bundle install + +### Running Tests + +To run the entire test suite you can use: + + bin/rake test + +To run an individual test file located for example in `test/rubygems/test_deprecate.rb` you can use: + + ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb + +And to run an individual test method named `test_default` within a test file, you can use: + + ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb -n /test_default/ + +### Running bundler tests + +To run the entire bundler test suite in parallel (it takes a while), run the following from the `bundler/` subfolder: + + bin/parallel_rspec + +There are some realworld higher level specs run in CI, but not run by `bin/parallel_rspec`. You can run those with: + + bin/rake spec:realworld + +To run an individual test file location for example in `spec/install/gems/standalone_spec.rb` you can use the following from the `bundler/` subfolder: + + bin/rspec spec/install/gems/standalone_spec.rb + +To test Rubygems changes in bundler, set the path to your local Rubygems copy using the `RGV` environment variable: + + RGV=.. bin/rspec spec/install/gems/standalone_spec.rb + +### Checking code style + +You can check compliance with our code style with + + bin/rake rubocop + +Optionally you can configure git hooks with to check this before every commit with + + bin/rake git_hooks + +For more information, check [SETUP.md](../bundler/development/SETUP.md) and [DEBUGGING.md](../bundler/development/DEBUGGING.md). + +## Issues + +RubyGems uses labels to track all issues and pull requests. In order to +provide guidance to the community this is documentation of how labels are used +in the rubygems repository. + +### Contribution + +These labels are made to guide contributors to issue/pull requests that they +can help with. + +* **good first issue** - The issue described here is considered a good option + for a new contributor. We encourage new contributors though to work on + whichever issue they find most interesting, the ones labeled here as just + estimated to have a reasonable level of complexity for someone new to the + code base. +* **help wanted** - The issue has not been claimed for work, and is awaiting + willing volunteers! + + +### Type + +Issues might have a light green `type: *` label, which describes the type of +the issue. + +* **bug report** - An issue describing a bug in rubygems. This would be + something that is broken, confusing, unexpected behavior etc. +* **feature request** - An issue describing a request for a new feature or + enhancement. +* **question** - An issue that is a more of a question than a call for + specific changes in the codebase. +* **cleanup** - An issue that proposes cleanups to the code base without + fixing a bug or implementing a feature. +* **major bump** - This issue request requires a major version bump +* **administrative** - This issue relates to administrative tasks that need + to take place as it relates to rubygems +* **documentation** - This issue relates to improving the documentation for + in this repo. Note that much of the rubygems documentation is here: + https://github.com/rubygems/guides + +Pull request might have a light orange `rubygems: *` or a light blue `bundler: +*` label which describes the pull request according to the following criteria: + +* **security fix** - A pull request that fixes a security issue. +* **breaking change** - A pull request including any change that requires a + major version bump. +* **major enhancement** - A pull request including a backwards compatible + change worth a special mention in the changelog +* **deprecation** - A pull request that introduces a deprecation. +* **feature** - A pull request implementing a feature request. +* **deprecation** - A pull request that implements a performance improvement. +* **documentation** - A pull request introducing documentation improvements + worth mentioning to end users. +* **minor enhancements** - A pull request introducing small but user visible changes. +* **bug fix** - A pull request that fixes a bug report. + +In the case of `bundler`, these labels are set by maintainers on PRs and have +special importance because they are used to automatically build the changelog. + +### Workflow / Status + +The light yellow `status: *` labels that indicate the state of an issue, +where it is in the process from being submitted to being closed. These are +listed in rough progression order from submitted to closed. + +* **triage** - This is an issue or pull request that needs to be properly + labeled by a maintainer. +* **confirmed** - This issue/pull request has been accepted as valid, but is + not yet immediately ready for work. +* **ready** - An issue that is available for collaboration. This issue + should have existing discussion on the problem, and a description of how + to go about solving it. +* **working** - An issue that has a specific individual assigned to and + planning to do work on it. +* **user feedback required** - The issue/pull request is blocked pending + more feedback from an end user +* **blocked / backlog** - the issue/pull request is currently unable to move + forward because of some specific reason, generally this will be a reason + that is outside RubyGems or needs feedback from some specific individual + or group, and it may be a while before something it is resolved. + + +### Closed Reason + +Reasons are why an issue / pull request was closed without being worked on or +accepted. There should also be more detailed information in the comments. The +closed reason labels are maroon `closed: *`. + +* **duplicate** - This is a duplicate of an existing bug. The comments must + reference the existing issue. +* **abandoned** - This is an issue/pull request that has aged off, is no + longer applicable or similar. +* **declined** - An issue that won't be fixed/implemented or a pull request + that is not accepted. +* **deprecated** - An issue/pull request that no longer applies to the + actively maintained codebase. +* **discussion** - An issue/pull that is no longer about a concrete change, + and is instead being used for discussion. + + +### Categories + +These are aspects of the codebase, or what general area the issue or pull +request pertains too. Not all issues will have a category. All categorized +issues have a blue `category: *` label. + +* **gemspec** - related to the gem specification itself +* **API** - related to the public supported rubygems API. This is the code + API, not a network related API. +* **command** - related to something in `Gem::Commands` +* **install** - related to gem installations +* **documentation** - related to updating / fixing / clarifying + documentation or guides + + +### Platforms + +If an issue or pull request pertains to only one platform, then it should have +an appropriate purple `platform: *` label. Current platform labels: +**windows**, **java**, **osx**, **linux** + +### Git + +Please sign your commits. Although not required in order for you to contribute, +it ensures that any code submitted by you wasn't altered while you were +transferring it, and proves that it was you who submitted it and not someone +else. + +Please see https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work or +https://help.github.com/en/articles/signing-commits for details on how to +to generate a signature and automatically sign your commits. +# Bug triage + +Triaging is the work of processing tickets that have been opened by users. Common tasks include verifying bugs, categorizing tickets, and ensuring there's enough information to reproduce the bug for anyone who wants to try to fix it. + +We've created an [issue template]( https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue) to walk users through the process of how to report an issue with the Bundler project. We also have a [troubleshooting guide](../TROUBLESHOOTING.md) to diagnose common problems. + +Not every ticket will be a bug in Bundler's code, but open tickets usually mean that there is something we could improve to help that user. Sometimes that means writing additional documentation or making error messages clearer. + +## Triaging existing issues + +When you're looking at a ticket, here are the main questions to ask: + + * Can I reproduce this bug myself? + * Are the steps to reproduce the bug clearly documented in the ticket? + * Which versions of Bundler (2.1.x, 2.2.x, git, etc.) manifest this bug? + * Which operating systems (macOS, Windows, Ubuntu, CentOS, etc.) manifest this bug? + * Which rubies (MRI, JRuby, Rubinius, etc.) and which versions (3.0.1, 3.1.2, etc.) have this bug? + +Strategies for triaging a ticket: + * Be sure to ask the user to output the entirety of their `bundle env`. Sometimes users forget to post all of their `bundle env` output in the issue. + * After seeing the output of the user's `bundle env`, try to replicate the user's problem in your current environment. Only portions of the code base is changed in each release, so there's a good chance your version of bundler might have the same bug. + * If you're having trouble replicating their issue with your current environment, slowly try to incorporate the user's environment setup. As in, this is where you begin matching their environment. For example, try switching to the user's version of Ruby, RubyGems, RVM, et cetera, step by step. + * Is the user running the latest version of bundler? If not, ask them to update by running `gem install bundler`. There's a chance that the newest version of bundler has already solved their problem. + +If the issue still requires user information, apply the label "user feedback required". This will help identify stale issues in the future. + +If you can't reproduce the issue, chances are good that the bug has been fixed already (hurrah!). That's a good time to post to the ticket explaining what you did and how it worked. + +If you can reproduce an issue, you're well on your way to fixing it. :) + +## Fixing your triaged bug + +Everyone is welcome and encouraged to fix any open bug, improve an error message or add documentation. If you have a fix or an improvement to a ticket that you would like to contribute, we have a small guide to help: + + 1. Discuss the fix on the existing issue. Coordinating with everyone else saves duplicate work and serves as a great way to get suggestions and ideas if you need any. + 2. Review the [pull request guide](../development/PULL_REQUESTS.md). + 3. Commit the code with at least one test covering your changes to a named branch in your fork. + 4. Send us a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) from your bugfix branch. + +You do not have to update [CHANGELOG](../../../bundler/CHANGELOG.md) in your PR. Our release scripts will automatically prepare it from the title of each PR. + +## Duplicates! + +Finally, the ticket may be a duplicate of another older ticket. If you notice a ticket is a duplicate, simply comment on the ticket noting the original ticket's number. For example, you could say “This is a duplicate of issue #42, and can be closed”. + +## Stale issues + +Any issue that is waiting for more information is what we could consider "stale". And the process is: + +1. If the issue is not updated in a while (2-4 weeks), we usually leave a comment saying "Hey :wave:, is this still a problem for you?". +2. If they don't respond within a week or two, then we will close the ticket. +3. If they do respond and they say it's still an issue, then we'll remind we are waiting for more information. +4. If the user doesn't provide the required information after being reminded, the ticket will be closed. +# Community + +Community is an important part of all we do. If you'd like to be part of the Bundler community, you can jump right in and start helping make Bundler better for everyone who uses it. + +It would be tremendously helpful to have more people answering questions about Bundler (and often simply about [RubyGems](https://github.com/ruby/rubygems) or Ruby itself) in our [issue tracker](https://github.com/ruby/rubygems/issues) or on [Stack Overflow](https://stackoverflow.com/questions/tagged/bundler). + +Additional documentation and explanation is always helpful, too. If you have any suggestions for the Bundler website [bundler.io](https://bundler.io), we would absolutely love it if you opened an issue or pull request on the [bundler-site](https://github.com/rubygems/bundler-site) repository. + +Sharing your experiences and discoveries by writing them up is a valuable way to help others who have similar problems or experiences in the future. You can write a blog post, create an example and commit it to GitHub, take screenshots, or make videos. + +Publishing examples of how Bundler is used helps everyone, and we've discovered that people already use it in ways that we never imagined when we were writing it. If you're still not sure what to write about, there are also several projects doing interesting things based on Bundler. They could probably use publicity too. + +Finally, all contributors to the Bundler project must agree to the contributor [code of conduct](https://bundler.io/conduct.html). By participating in this project you agree to abide by its terms. +# How you can help: your first commits! + +If you're interested in contributing to Bundler, that's awesome! We'd love your help. + +If at any point you get stuck, here's how to [get in touch with the Bundler team for help](https://bundler.slack.com). + +## First contribution suggestions + +We track [small bugs and features](https://github.com/ruby/rubygems/issues?q=is%3Aissue+is%3Aopen+label%3Abundler+label%3A%22good+first+issue%22) so that anyone who wants to help can start with something that's not too overwhelming. + +Generally, great ways to get started helping out with Bundler are: + + - using prerelease versions (run `gem install bundler --pre`) + - [reporting bugs you encounter or suggesting new features](https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md) + - see the [new features documentation](../development/NEW_FEATURES.md) for more + - adding to or editing [the Bundler documentation website](https://bundler.io) and [Bundler man pages](https://bundler.io/man/bundle.1.html) + - [checking issues for completeness](BUG_TRIAGE.md) + - closing issues that are not complete + - adding a failing test for reproducible [reported bugs](https://github.com/ruby/rubygems/issues) + - reviewing [pull requests](https://github.com/ruby/rubygems/pulls) and suggesting improvements + - improving existing code + - writing code (no patch is too small! fix typos or bad whitespace) + - get started setting up your dev environment with [these instructions](../development/SETUP.md) + - backfilling [unit tests](https://github.com/ruby/rubygems/tree/master/bundler/spec/bundler) for modules that lack coverage. + +If nothing on those lists looks good, [talk to us](https://bundler.slack.com/), and we'll figure out what you can help with. We can absolutely use your help, no matter what level of programming skill you have at the moment. +# Bundler Contributor Guidelines + +Thank you for your interest in making Bundler better! We welcome contributions from everyone. Dozens of contributors like you have submitted feature improvements, fixed bugs, and written new documentation. [Join the Bundler Slack community](https://slack.bundler.io/) to connect with the Bundler core team and other contributors like you. + +Before submitting a contribution, read through the following guidelines: + +* [Bundler Code of Conduct](https://github.com/ruby/rubygems/blob/master/CODE_OF_CONDUCT.md) (By participating in Bundler, you agree to abide by the terms laid out in the CoC.) +* [Pull Request Guidelines](../development/PULL_REQUESTS.md) + +And be sure to [set up your development environment](../development/SETUP.md). + +## Feature Requests + +To request substantial changes to Bundler and/or Bundler documentation, please refer to the [README](https://github.com/rubygems/rfcs/blob/master/README.md) in the [RFC repository](https://github.com/rubygems/rfcs) for instructions. ## Contributing to Bundler -Check [Bundler contribution guidelines](doc/bundler/contributing/README.md). +Here are the different ways you can start contributing to the Bundler project: + +* [First contribution suggestions](HOW_YOU_CAN_HELP.md) +* [Adding new features](../development/NEW_FEATURES.md) +* [Triaging bugs](BUG_TRIAGE.md) +* [Writing documentation](../documentation/WRITING.md) +* [Community engagement](COMMUNITY.md) + +## Supporting Bundler + +RubyGems is managed by [Ruby Central](https://rubycentral.org), a non-profit organization that supports the Ruby community through projects like this one, as well as [RubyConf](https://rubyconf.org), [RailsConf](https://railsconf.org), and [RubyGems.org](https://rubygems.org). You can support Ruby Central by attending or [sponsoring](sponsors@rubycentral.org) a conference, or by [joining as a supporting member](https://rubycentral.org/#/portal/signup). diff --git a/doc/bundler/README.md b/doc/bundler/README.md index 4e6630e1dd0c..e0d39f8c4a29 100644 --- a/doc/bundler/README.md +++ b/doc/bundler/README.md @@ -1,4 +1,4 @@ -# Docs: Contributing and developing Bundler +# Docs: Developing Bundler _If you're looking for documentation on how to use Bundler: visit [bundler.io](https://bundler.io/), or run `bundle help` from the command line. You may also be interested in [troubleshooting common issues](TROUBLESHOOTING.md) found when using Bundler._ @@ -6,15 +6,6 @@ Bundler welcomes contributions from *everyone*. While contributing, please follo If you'd like to help make Bundler better, you totally rock! Thanks for helping us make Bundler better. -## Contributing - -* [Overview & getting started](contributing/README.md) -* [How you can help: your first contributions!](contributing/HOW_YOU_CAN_HELP.md) -* [Bug triage](contributing/BUG_TRIAGE.md) -* [Getting help](https://slack.bundler.io) -* [Filing issues](https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md) -* [Community](contributing/COMMUNITY.md) - ## Development * [Overview](development/README.md) diff --git a/doc/bundler/contributing/BUG_TRIAGE.md b/doc/bundler/contributing/BUG_TRIAGE.md deleted file mode 100644 index 04fba7a9810c..000000000000 --- a/doc/bundler/contributing/BUG_TRIAGE.md +++ /dev/null @@ -1,53 +0,0 @@ -# Bug triage - -Triaging is the work of processing tickets that have been opened by users. Common tasks include verifying bugs, categorizing tickets, and ensuring there's enough information to reproduce the bug for anyone who wants to try to fix it. - -We've created an [issue template]( https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue) to walk users through the process of how to report an issue with the Bundler project. We also have a [troubleshooting guide](../TROUBLESHOOTING.md) to diagnose common problems. - -Not every ticket will be a bug in Bundler's code, but open tickets usually mean that there is something we could improve to help that user. Sometimes that means writing additional documentation or making error messages clearer. - -## Triaging existing issues - -When you're looking at a ticket, here are the main questions to ask: - - * Can I reproduce this bug myself? - * Are the steps to reproduce the bug clearly documented in the ticket? - * Which versions of Bundler (2.1.x, 2.2.x, git, etc.) manifest this bug? - * Which operating systems (macOS, Windows, Ubuntu, CentOS, etc.) manifest this bug? - * Which rubies (MRI, JRuby, Rubinius, etc.) and which versions (3.0.1, 3.1.2, etc.) have this bug? - -Strategies for triaging a ticket: - * Be sure to ask the user to output the entirety of their `bundle env`. Sometimes users forget to post all of their `bundle env` output in the issue. - * After seeing the output of the user's `bundle env`, try to replicate the user's problem in your current environment. Only portions of the code base is changed in each release, so there's a good chance your version of bundler might have the same bug. - * If you're having trouble replicating their issue with your current environment, slowly try to incorporate the user's environment setup. As in, this is where you begin matching their environment. For example, try switching to the user's version of Ruby, RubyGems, RVM, et cetera, step by step. - * Is the user running the latest version of bundler? If not, ask them to update by running `gem install bundler`. There's a chance that the newest version of bundler has already solved their problem. - -If the issue still requires user information, apply the label "user feedback required". This will help identify stale issues in the future. - -If you can't reproduce the issue, chances are good that the bug has been fixed already (hurrah!). That's a good time to post to the ticket explaining what you did and how it worked. - -If you can reproduce an issue, you're well on your way to fixing it. :) - -## Fixing your triaged bug - -Everyone is welcome and encouraged to fix any open bug, improve an error message or add documentation. If you have a fix or an improvement to a ticket that you would like to contribute, we have a small guide to help: - - 1. Discuss the fix on the existing issue. Coordinating with everyone else saves duplicate work and serves as a great way to get suggestions and ideas if you need any. - 2. Review the [pull request guide](../development/PULL_REQUESTS.md). - 3. Commit the code with at least one test covering your changes to a named branch in your fork. - 4. Send us a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) from your bugfix branch. - -You do not have to update [CHANGELOG](../../../bundler/CHANGELOG.md) in your PR. Our release scripts will automatically prepare it from the title of each PR. - -## Duplicates! - -Finally, the ticket may be a duplicate of another older ticket. If you notice a ticket is a duplicate, simply comment on the ticket noting the original ticket's number. For example, you could say “This is a duplicate of issue #42, and can be closed”. - -## Stale issues - -Any issue that is waiting for more information is what we could consider "stale". And the process is: - -1. If the issue is not updated in a while (2-4 weeks), we usually leave a comment saying "Hey :wave:, is this still a problem for you?". -2. If they don't respond within a week or two, then we will close the ticket. -3. If they do respond and they say it's still an issue, then we'll remind we are waiting for more information. -4. If the user doesn't provide the required information after being reminded, the ticket will be closed. diff --git a/doc/bundler/contributing/COMMUNITY.md b/doc/bundler/contributing/COMMUNITY.md deleted file mode 100644 index 43a199a9d54d..000000000000 --- a/doc/bundler/contributing/COMMUNITY.md +++ /dev/null @@ -1,13 +0,0 @@ -# Community - -Community is an important part of all we do. If you'd like to be part of the Bundler community, you can jump right in and start helping make Bundler better for everyone who uses it. - -It would be tremendously helpful to have more people answering questions about Bundler (and often simply about [RubyGems](https://github.com/ruby/rubygems) or Ruby itself) in our [issue tracker](https://github.com/ruby/rubygems/issues) or on [Stack Overflow](https://stackoverflow.com/questions/tagged/bundler). - -Additional documentation and explanation is always helpful, too. If you have any suggestions for the Bundler website [bundler.io](https://bundler.io), we would absolutely love it if you opened an issue or pull request on the [bundler-site](https://github.com/rubygems/bundler-site) repository. - -Sharing your experiences and discoveries by writing them up is a valuable way to help others who have similar problems or experiences in the future. You can write a blog post, create an example and commit it to GitHub, take screenshots, or make videos. - -Publishing examples of how Bundler is used helps everyone, and we've discovered that people already use it in ways that we never imagined when we were writing it. If you're still not sure what to write about, there are also several projects doing interesting things based on Bundler. They could probably use publicity too. - -Finally, all contributors to the Bundler project must agree to the contributor [code of conduct](https://bundler.io/conduct.html). By participating in this project you agree to abide by its terms. diff --git a/doc/bundler/contributing/HOW_YOU_CAN_HELP.md b/doc/bundler/contributing/HOW_YOU_CAN_HELP.md deleted file mode 100644 index c9858eff20d0..000000000000 --- a/doc/bundler/contributing/HOW_YOU_CAN_HELP.md +++ /dev/null @@ -1,26 +0,0 @@ -# How you can help: your first commits! - -If you're interested in contributing to Bundler, that's awesome! We'd love your help. - -If at any point you get stuck, here's how to [get in touch with the Bundler team for help](https://bundler.slack.com). - -## First contribution suggestions - -We track [small bugs and features](https://github.com/ruby/rubygems/issues?q=is%3Aissue+is%3Aopen+label%3Abundler+label%3A%22good+first+issue%22) so that anyone who wants to help can start with something that's not too overwhelming. - -Generally, great ways to get started helping out with Bundler are: - - - using prerelease versions (run `gem install bundler --pre`) - - [reporting bugs you encounter or suggesting new features](https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md) - - see the [new features documentation](../development/NEW_FEATURES.md) for more - - adding to or editing [the Bundler documentation website](https://bundler.io) and [Bundler man pages](https://bundler.io/man/bundle.1.html) - - [checking issues for completeness](BUG_TRIAGE.md) - - closing issues that are not complete - - adding a failing test for reproducible [reported bugs](https://github.com/ruby/rubygems/issues) - - reviewing [pull requests](https://github.com/ruby/rubygems/pulls) and suggesting improvements - - improving existing code - - writing code (no patch is too small! fix typos or bad whitespace) - - get started setting up your dev environment with [these instructions](../development/SETUP.md) - - backfilling [unit tests](https://github.com/ruby/rubygems/tree/master/bundler/spec/bundler) for modules that lack coverage. - -If nothing on those lists looks good, [talk to us](https://bundler.slack.com/), and we'll figure out what you can help with. We can absolutely use your help, no matter what level of programming skill you have at the moment. diff --git a/doc/bundler/contributing/README.md b/doc/bundler/contributing/README.md deleted file mode 100644 index a3ad90f3ce3a..000000000000 --- a/doc/bundler/contributing/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Bundler Contributor Guidelines - -Thank you for your interest in making Bundler better! We welcome contributions from everyone. Dozens of contributors like you have submitted feature improvements, fixed bugs, and written new documentation. [Join the Bundler Slack community](https://slack.bundler.io/) to connect with the Bundler core team and other contributors like you. - -Before submitting a contribution, read through the following guidelines: - -* [Bundler Code of Conduct](https://github.com/ruby/rubygems/blob/master/CODE_OF_CONDUCT.md) (By participating in Bundler, you agree to abide by the terms laid out in the CoC.) -* [Pull Request Guidelines](../development/PULL_REQUESTS.md) - -And be sure to [set up your development environment](../development/SETUP.md). - -## Feature Requests - -To request substantial changes to Bundler and/or Bundler documentation, please refer to the [README](https://github.com/rubygems/rfcs/blob/master/README.md) in the [RFC repository](https://github.com/rubygems/rfcs) for instructions. - -## Contributing to Bundler - -Here are the different ways you can start contributing to the Bundler project: - -* [First contribution suggestions](HOW_YOU_CAN_HELP.md) -* [Adding new features](../development/NEW_FEATURES.md) -* [Triaging bugs](BUG_TRIAGE.md) -* [Writing documentation](../documentation/WRITING.md) -* [Community engagement](COMMUNITY.md) - -## Supporting Bundler - -RubyGems is managed by [Ruby Central](https://rubycentral.org), a non-profit organization that supports the Ruby community through projects like this one, as well as [RubyConf](https://rubyconf.org), [RailsConf](https://railsconf.org), and [RubyGems.org](https://rubygems.org). You can support Ruby Central by attending or [sponsoring](sponsors@rubycentral.org) a conference, or by [joining as a supporting member](https://rubycentral.org/#/portal/signup). diff --git a/doc/rubygems/CONTRIBUTING.md b/doc/rubygems/CONTRIBUTING.md deleted file mode 100644 index 35db373939fe..000000000000 --- a/doc/rubygems/CONTRIBUTING.md +++ /dev/null @@ -1,231 +0,0 @@ -# How to contribute - -Community involvement is essential to RubyGems. We want to keep it as easy as -possible to contribute changes. There are a few guidelines that we need -contributors to follow to reduce the time it takes to get changes merged in. - -## Guidelines - -1. New features should be coupled with tests. - -2. Ensure that your code blends well with ours: - * No trailing whitespace - * Match indentation (two spaces) - * Match coding style (run `bin/rake rubocop`) - -3. If any new files are added or existing files removed in a commit or PR, - please update the `Manifest.txt` accordingly. This can be done by running - `bin/rake update_manifest` - -4. Don't modify the history file or version number. - -5. If you have any questions, Feel free to join us on Slack, you can register - by signing up at http://slack.bundler.io or file an issue here: - http://github.com/ruby/rubygems/issues - - -For more information and ideas on how to contribute to RubyGems ecosystem, see -here: https://guides.rubygems.org/contributing/ - -## Getting Started - -### Installing dependencies - - bin/rake setup - -> **NOTE**: If the above fails with permission related errors, you're most -> likely using a global Ruby installation (like the one packaged by your OS), -> which sets `GEM_HOME` to a location regular users can't write to. Consider -> using a Ruby version manager like [RVM](https://github.com/rvm/rvm), -> [rbenv](https://github.com/rbenv/rbenv), -> [chruby](https://github.com/postmodern/chruby) or [asdf](https://github.com/asdf-vm/asdf-ruby). These will install Ruby to a -> location regular users can write to, so you won't run into permission issues. -> Alternatively, consider setting `GEM_HOME` environment variable to a writable -> location with something like `export GEM_HOME=/tmp/rubygems.gems` and try -> again. - -### Manually trying your local changes - -To run commands like `gem install` from the repo: - - ruby -Ilib exe/gem install - -To run commands like `bundle install` from the repo: - - bundler/bin/bundle install - -### Running Tests - -To run the entire test suite you can use: - - bin/rake test - -To run an individual test file located for example in `test/rubygems/test_deprecate.rb` you can use: - - ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb - -And to run an individual test method named `test_default` within a test file, you can use: - - ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb -n /test_default/ - -### Running bundler tests - -To run the entire bundler test suite in parallel (it takes a while), run the following from the `bundler/` subfolder: - - bin/parallel_rspec - -There are some realworld higher level specs run in CI, but not run by `bin/parallel_rspec`. You can run those with: - - bin/rake spec:realworld - -To run an individual test file location for example in `spec/install/gems/standalone_spec.rb` you can use the following from the `bundler/` subfolder: - - bin/rspec spec/install/gems/standalone_spec.rb - -To test Rubygems changes in bundler, set the path to your local Rubygems copy using the `RGV` environment variable: - - RGV=.. bin/rspec spec/install/gems/standalone_spec.rb - -### Checking code style - -You can check compliance with our code style with - - bin/rake rubocop - -Optionally you can configure git hooks with to check this before every commit with - - bin/rake git_hooks - -For more information, check [SETUP.md](../bundler/development/SETUP.md) and [DEBUGGING.md](../bundler/development/DEBUGGING.md). - -## Issues - -RubyGems uses labels to track all issues and pull requests. In order to -provide guidance to the community this is documentation of how labels are used -in the rubygems repository. - -### Contribution - -These labels are made to guide contributors to issue/pull requests that they -can help with. - -* **good first issue** - The issue described here is considered a good option - for a new contributor. We encourage new contributors though to work on - whichever issue they find most interesting, the ones labeled here as just - estimated to have a reasonable level of complexity for someone new to the - code base. -* **help wanted** - The issue has not been claimed for work, and is awaiting - willing volunteers! - - -### Type - -Issues might have a light green `type: *` label, which describes the type of -the issue. - -* **bug report** - An issue describing a bug in rubygems. This would be - something that is broken, confusing, unexpected behavior etc. -* **feature request** - An issue describing a request for a new feature or - enhancement. -* **question** - An issue that is a more of a question than a call for - specific changes in the codebase. -* **cleanup** - An issue that proposes cleanups to the code base without - fixing a bug or implementing a feature. -* **major bump** - This issue request requires a major version bump -* **administrative** - This issue relates to administrative tasks that need - to take place as it relates to rubygems -* **documentation** - This issue relates to improving the documentation for - in this repo. Note that much of the rubygems documentation is here: - https://github.com/rubygems/guides - -Pull request might have a light orange `rubygems: *` or a light blue `bundler: -*` label which describes the pull request according to the following criteria: - -* **security fix** - A pull request that fixes a security issue. -* **breaking change** - A pull request including any change that requires a - major version bump. -* **major enhancement** - A pull request including a backwards compatible - change worth a special mention in the changelog -* **deprecation** - A pull request that introduces a deprecation. -* **feature** - A pull request implementing a feature request. -* **deprecation** - A pull request that implements a performance improvement. -* **documentation** - A pull request introducing documentation improvements - worth mentioning to end users. -* **minor enhancements** - A pull request introducing small but user visible changes. -* **bug fix** - A pull request that fixes a bug report. - -In the case of `bundler`, these labels are set by maintainers on PRs and have -special importance because they are used to automatically build the changelog. - -### Workflow / Status - -The light yellow `status: *` labels that indicate the state of an issue, -where it is in the process from being submitted to being closed. These are -listed in rough progression order from submitted to closed. - -* **triage** - This is an issue or pull request that needs to be properly - labeled by a maintainer. -* **confirmed** - This issue/pull request has been accepted as valid, but is - not yet immediately ready for work. -* **ready** - An issue that is available for collaboration. This issue - should have existing discussion on the problem, and a description of how - to go about solving it. -* **working** - An issue that has a specific individual assigned to and - planning to do work on it. -* **user feedback required** - The issue/pull request is blocked pending - more feedback from an end user -* **blocked / backlog** - the issue/pull request is currently unable to move - forward because of some specific reason, generally this will be a reason - that is outside RubyGems or needs feedback from some specific individual - or group, and it may be a while before something it is resolved. - - -### Closed Reason - -Reasons are why an issue / pull request was closed without being worked on or -accepted. There should also be more detailed information in the comments. The -closed reason labels are maroon `closed: *`. - -* **duplicate** - This is a duplicate of an existing bug. The comments must - reference the existing issue. -* **abandoned** - This is an issue/pull request that has aged off, is no - longer applicable or similar. -* **declined** - An issue that won't be fixed/implemented or a pull request - that is not accepted. -* **deprecated** - An issue/pull request that no longer applies to the - actively maintained codebase. -* **discussion** - An issue/pull that is no longer about a concrete change, - and is instead being used for discussion. - - -### Categories - -These are aspects of the codebase, or what general area the issue or pull -request pertains too. Not all issues will have a category. All categorized -issues have a blue `category: *` label. - -* **gemspec** - related to the gem specification itself -* **API** - related to the public supported rubygems API. This is the code - API, not a network related API. -* **command** - related to something in `Gem::Commands` -* **install** - related to gem installations -* **documentation** - related to updating / fixing / clarifying - documentation or guides - - -### Platforms - -If an issue or pull request pertains to only one platform, then it should have -an appropriate purple `platform: *` label. Current platform labels: -**windows**, **java**, **osx**, **linux** - -### Git - -Please sign your commits. Although not required in order for you to contribute, -it ensures that any code submitted by you wasn't altered while you were -transferring it, and proves that it was you who submitted it and not someone -else. - -Please see https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work or -https://help.github.com/en/articles/signing-commits for details on how to -to generate a signature and automatically sign your commits. From 29d1f816dbc402ffbbc95c2137ff03017e53d20e Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 16:07:18 +0900 Subject: [PATCH 02/16] Extract Issue triage guide --- CONTRIBUTING.md | 173 -------------------------------------------- doc/ISSUE_TRIAGE.md | 128 ++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 173 deletions(-) create mode 100644 doc/ISSUE_TRIAGE.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ee79ef141984..266e75bcfd76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -98,127 +98,6 @@ Optionally you can configure git hooks with to check this before every commit wi For more information, check [SETUP.md](../bundler/development/SETUP.md) and [DEBUGGING.md](../bundler/development/DEBUGGING.md). -## Issues - -RubyGems uses labels to track all issues and pull requests. In order to -provide guidance to the community this is documentation of how labels are used -in the rubygems repository. - -### Contribution - -These labels are made to guide contributors to issue/pull requests that they -can help with. - -* **good first issue** - The issue described here is considered a good option - for a new contributor. We encourage new contributors though to work on - whichever issue they find most interesting, the ones labeled here as just - estimated to have a reasonable level of complexity for someone new to the - code base. -* **help wanted** - The issue has not been claimed for work, and is awaiting - willing volunteers! - - -### Type - -Issues might have a light green `type: *` label, which describes the type of -the issue. - -* **bug report** - An issue describing a bug in rubygems. This would be - something that is broken, confusing, unexpected behavior etc. -* **feature request** - An issue describing a request for a new feature or - enhancement. -* **question** - An issue that is a more of a question than a call for - specific changes in the codebase. -* **cleanup** - An issue that proposes cleanups to the code base without - fixing a bug or implementing a feature. -* **major bump** - This issue request requires a major version bump -* **administrative** - This issue relates to administrative tasks that need - to take place as it relates to rubygems -* **documentation** - This issue relates to improving the documentation for - in this repo. Note that much of the rubygems documentation is here: - https://github.com/rubygems/guides - -Pull request might have a light orange `rubygems: *` or a light blue `bundler: -*` label which describes the pull request according to the following criteria: - -* **security fix** - A pull request that fixes a security issue. -* **breaking change** - A pull request including any change that requires a - major version bump. -* **major enhancement** - A pull request including a backwards compatible - change worth a special mention in the changelog -* **deprecation** - A pull request that introduces a deprecation. -* **feature** - A pull request implementing a feature request. -* **deprecation** - A pull request that implements a performance improvement. -* **documentation** - A pull request introducing documentation improvements - worth mentioning to end users. -* **minor enhancements** - A pull request introducing small but user visible changes. -* **bug fix** - A pull request that fixes a bug report. - -In the case of `bundler`, these labels are set by maintainers on PRs and have -special importance because they are used to automatically build the changelog. - -### Workflow / Status - -The light yellow `status: *` labels that indicate the state of an issue, -where it is in the process from being submitted to being closed. These are -listed in rough progression order from submitted to closed. - -* **triage** - This is an issue or pull request that needs to be properly - labeled by a maintainer. -* **confirmed** - This issue/pull request has been accepted as valid, but is - not yet immediately ready for work. -* **ready** - An issue that is available for collaboration. This issue - should have existing discussion on the problem, and a description of how - to go about solving it. -* **working** - An issue that has a specific individual assigned to and - planning to do work on it. -* **user feedback required** - The issue/pull request is blocked pending - more feedback from an end user -* **blocked / backlog** - the issue/pull request is currently unable to move - forward because of some specific reason, generally this will be a reason - that is outside RubyGems or needs feedback from some specific individual - or group, and it may be a while before something it is resolved. - - -### Closed Reason - -Reasons are why an issue / pull request was closed without being worked on or -accepted. There should also be more detailed information in the comments. The -closed reason labels are maroon `closed: *`. - -* **duplicate** - This is a duplicate of an existing bug. The comments must - reference the existing issue. -* **abandoned** - This is an issue/pull request that has aged off, is no - longer applicable or similar. -* **declined** - An issue that won't be fixed/implemented or a pull request - that is not accepted. -* **deprecated** - An issue/pull request that no longer applies to the - actively maintained codebase. -* **discussion** - An issue/pull that is no longer about a concrete change, - and is instead being used for discussion. - - -### Categories - -These are aspects of the codebase, or what general area the issue or pull -request pertains too. Not all issues will have a category. All categorized -issues have a blue `category: *` label. - -* **gemspec** - related to the gem specification itself -* **API** - related to the public supported rubygems API. This is the code - API, not a network related API. -* **command** - related to something in `Gem::Commands` -* **install** - related to gem installations -* **documentation** - related to updating / fixing / clarifying - documentation or guides - - -### Platforms - -If an issue or pull request pertains to only one platform, then it should have -an appropriate purple `platform: *` label. Current platform labels: -**windows**, **java**, **osx**, **linux** - ### Git Please sign your commits. Although not required in order for you to contribute, @@ -229,59 +108,7 @@ else. Please see https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work or https://help.github.com/en/articles/signing-commits for details on how to to generate a signature and automatically sign your commits. -# Bug triage - -Triaging is the work of processing tickets that have been opened by users. Common tasks include verifying bugs, categorizing tickets, and ensuring there's enough information to reproduce the bug for anyone who wants to try to fix it. - -We've created an [issue template]( https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue) to walk users through the process of how to report an issue with the Bundler project. We also have a [troubleshooting guide](../TROUBLESHOOTING.md) to diagnose common problems. - -Not every ticket will be a bug in Bundler's code, but open tickets usually mean that there is something we could improve to help that user. Sometimes that means writing additional documentation or making error messages clearer. - -## Triaging existing issues - -When you're looking at a ticket, here are the main questions to ask: - - * Can I reproduce this bug myself? - * Are the steps to reproduce the bug clearly documented in the ticket? - * Which versions of Bundler (2.1.x, 2.2.x, git, etc.) manifest this bug? - * Which operating systems (macOS, Windows, Ubuntu, CentOS, etc.) manifest this bug? - * Which rubies (MRI, JRuby, Rubinius, etc.) and which versions (3.0.1, 3.1.2, etc.) have this bug? - -Strategies for triaging a ticket: - * Be sure to ask the user to output the entirety of their `bundle env`. Sometimes users forget to post all of their `bundle env` output in the issue. - * After seeing the output of the user's `bundle env`, try to replicate the user's problem in your current environment. Only portions of the code base is changed in each release, so there's a good chance your version of bundler might have the same bug. - * If you're having trouble replicating their issue with your current environment, slowly try to incorporate the user's environment setup. As in, this is where you begin matching their environment. For example, try switching to the user's version of Ruby, RubyGems, RVM, et cetera, step by step. - * Is the user running the latest version of bundler? If not, ask them to update by running `gem install bundler`. There's a chance that the newest version of bundler has already solved their problem. - -If the issue still requires user information, apply the label "user feedback required". This will help identify stale issues in the future. - -If you can't reproduce the issue, chances are good that the bug has been fixed already (hurrah!). That's a good time to post to the ticket explaining what you did and how it worked. - -If you can reproduce an issue, you're well on your way to fixing it. :) - -## Fixing your triaged bug - -Everyone is welcome and encouraged to fix any open bug, improve an error message or add documentation. If you have a fix or an improvement to a ticket that you would like to contribute, we have a small guide to help: - - 1. Discuss the fix on the existing issue. Coordinating with everyone else saves duplicate work and serves as a great way to get suggestions and ideas if you need any. - 2. Review the [pull request guide](../development/PULL_REQUESTS.md). - 3. Commit the code with at least one test covering your changes to a named branch in your fork. - 4. Send us a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) from your bugfix branch. - -You do not have to update [CHANGELOG](../../../bundler/CHANGELOG.md) in your PR. Our release scripts will automatically prepare it from the title of each PR. - -## Duplicates! - -Finally, the ticket may be a duplicate of another older ticket. If you notice a ticket is a duplicate, simply comment on the ticket noting the original ticket's number. For example, you could say “This is a duplicate of issue #42, and can be closed”. - -## Stale issues - -Any issue that is waiting for more information is what we could consider "stale". And the process is: -1. If the issue is not updated in a while (2-4 weeks), we usually leave a comment saying "Hey :wave:, is this still a problem for you?". -2. If they don't respond within a week or two, then we will close the ticket. -3. If they do respond and they say it's still an issue, then we'll remind we are waiting for more information. -4. If the user doesn't provide the required information after being reminded, the ticket will be closed. # Community Community is an important part of all we do. If you'd like to be part of the Bundler community, you can jump right in and start helping make Bundler better for everyone who uses it. diff --git a/doc/ISSUE_TRIAGE.md b/doc/ISSUE_TRIAGE.md new file mode 100644 index 000000000000..4091b00e488f --- /dev/null +++ b/doc/ISSUE_TRIAGE.md @@ -0,0 +1,128 @@ +# Issue triage for ruby/rubygems + +This document describes how we manage and triage issues and pull requests in the ruby/rubygems repository, which includes both RubyGems and Bundler. + +## Overview + +Triaging is the process of reviewing tickets opened by users—verifying bugs, categorizing issues, and ensuring enough information is available for reproduction. We use [issue templates](https://github.com/ruby/rubygems/issues/new) and labels to organize work and guide contributors. + +Not every ticket will be a bug in our code, but all open tickets indicate room for improvement. This may mean fixing code, clarifying documentation, or improving error messages. + +## Triaging existing issues + +When examining a ticket, consider these key questions: + +- Can you reproduce the issue? +- Are the reproduction steps clearly documented? +- Which versions (RubyGems or Bundler, depending on the issue) exhibit this bug? +- Which operating systems (macOS, Windows, Linux, etc.) are affected? +- Which Ruby versions and implementations (MRI, JRuby, etc.) are affected? + +### Triage strategies + +- Request complete output when needed (e.g., `gem env` for RubyGems issues, `bundle env` for Bundler issues). +- Attempt to reproduce the issue in your environment; many bugs are version-specific. +- If reproduction is difficult, incrementally match the reporter's setup (Ruby version, gem versions, environment variables, etc.). +- Confirm the reporter is using the latest RubyGems or Bundler (`gem update` or `gem install bundler`). + +### Determining issue status + +- **Cannot reproduce**: Comment with what you tried; the bug may already be fixed. +- **User feedback needed**: Apply the "user feedback required" label to mark stale issues. +- **Successfully reproduced**: You're ready to fix or assign it. :) + +## Fixing a triaged issue + +Once you've reproduced and understand an issue, you can help fix it: + +1. **Discuss on the issue**: Coordinate with others to avoid duplicate work and gather feedback. +2. **Follow the pull request guide**: See [PULL_REQUESTS.md](development/PULL_REQUESTS.md). +3. **Write tests**: Commit changes with tests on a named branch in your fork. +4. **Submit a pull request**: See [about pull requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests). + +**Note on changelogs**: Do not manually update the changelog in your PR. Our release scripts generate changelogs from PR titles and labels. + +## Handling duplicates + +If you identify a duplicate ticket, comment on it with the original issue number. For example: "This is a duplicate of #42 and can be closed." + +## Managing stale issues + +Issues waiting for user feedback may become stale. The process is: + +1. After 2–4 weeks without updates: Leave a comment like "Hey :wave:, is this still a problem for you?" +2. If no response within another week or two: Close the ticket. +3. If the reporter responds: Remind them what information you're waiting for. +4. If required details never arrive: Close the ticket. + +## Label guide + +### Contribution labels + +Guide contributors to issues they can take on: + +- **good first issue**: Suitable for newcomers; reasonably scoped for someone new to the codebase. +- **help wanted**: Unclaimed work awaiting volunteers. + +### Type labels (light green `type:*`) + +Describe the type of issue: + +- **bug report**: Something broken, confusing, or unexpected. +- **feature request**: Request for a new feature or enhancement. +- **question**: Request for clarification or guidance. +- **cleanup**: Code refactoring or internal improvements. +- **major bump**: Requires a major version increment. +- **administrative**: Project-process or housekeeping tasks. +- **documentation**: Documentation improvements. RubyGems docs: https://github.com/rubygems/guides + +### Pull request scope labels (orange `rubygems:*`, blue `bundler:*`) + +Describe the scope and impact of PR changes. These are set by maintainers and used to auto-generate changelogs: + +- **security fix**: Addresses a security vulnerability. +- **breaking change**: Requires a major version bump. +- **major enhancement**: Backward compatible and noteworthy for changelog. +- **deprecation**: Introduces a deprecation. +- **feature**: Implements a requested feature. +- **performance**: Improves speed or resource usage. +- **documentation**: User-facing documentation improvements. +- **minor enhancements**: Small but user-visible changes. +- **bug fix**: Resolves a reported bug. + +### Workflow / status labels (light yellow `status:*`) + +Indicate issue/PR state in progression from submission to closure: + +- **triage**: Needs maintainer review and labeling. +- **confirmed**: Accepted as valid; not yet ready for work. +- **ready**: Open for collaboration with a described approach. +- **working**: Assigned and in progress. +- **user feedback required**: Blocked waiting on reporter information. +- **blocked / backlog**: Paused due to external dependency or decision. + +### Closed reason labels (maroon `closed:*`) + +Why an issue/PR was closed without resolution. Always include context in comments: + +- **duplicate**: References an existing issue. +- **abandoned**: Aged out or no longer applicable. +- **declined**: Will not be fixed or merged. +- **deprecated**: No longer relevant to maintained code. +- **discussion**: Not actionable; kept for conversation. + +### Category labels (blue `category:*`) + +Aspects of the codebase. Not all issues are categorized: + +- **gemspec**: Gem specification. +- **API**: Public RubyGems code API (not network/HTTP). +- **command**: Related to `Gem::Commands`. +- **install**: Gem installation. +- **documentation**: Docs and guides. + +### Platform labels (purple `platform:*`) + +For platform-specific issues or PRs: + +- **windows**, **java**, **osx**, **linux** From b5fb8bccf0fd0ca943104800b9f88684c8abb076 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 16:39:17 +0900 Subject: [PATCH 03/16] Extract and unified setup guide to Getting started guide --- CONTRIBUTING.md | 82 --------------------- doc/GETTING_STARTED.md | 120 +++++++++++++++++++++++++++++++ doc/bundler/development/SETUP.md | 64 ----------------- 3 files changed, 120 insertions(+), 146 deletions(-) create mode 100644 doc/GETTING_STARTED.md delete mode 100644 doc/bundler/development/SETUP.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 266e75bcfd76..5bfb3d8aa6f7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,88 +27,6 @@ contributors to follow to reduce the time it takes to get changes merged in. For more information and ideas on how to contribute to RubyGems ecosystem, see here: https://guides.rubygems.org/contributing/ -## Getting Started - -### Installing dependencies - - bin/rake setup - -> **NOTE**: If the above fails with permission related errors, you're most -> likely using a global Ruby installation (like the one packaged by your OS), -> which sets `GEM_HOME` to a location regular users can't write to. Consider -> using a Ruby version manager like [RVM](https://github.com/rvm/rvm), -> [rbenv](https://github.com/rbenv/rbenv), -> [chruby](https://github.com/postmodern/chruby) or [asdf](https://github.com/asdf-vm/asdf-ruby). These will install Ruby to a -> location regular users can write to, so you won't run into permission issues. -> Alternatively, consider setting `GEM_HOME` environment variable to a writable -> location with something like `export GEM_HOME=/tmp/rubygems.gems` and try -> again. - -### Manually trying your local changes - -To run commands like `gem install` from the repo: - - ruby -Ilib exe/gem install - -To run commands like `bundle install` from the repo: - - bundler/bin/bundle install - -### Running Tests - -To run the entire test suite you can use: - - bin/rake test - -To run an individual test file located for example in `test/rubygems/test_deprecate.rb` you can use: - - ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb - -And to run an individual test method named `test_default` within a test file, you can use: - - ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb -n /test_default/ - -### Running bundler tests - -To run the entire bundler test suite in parallel (it takes a while), run the following from the `bundler/` subfolder: - - bin/parallel_rspec - -There are some realworld higher level specs run in CI, but not run by `bin/parallel_rspec`. You can run those with: - - bin/rake spec:realworld - -To run an individual test file location for example in `spec/install/gems/standalone_spec.rb` you can use the following from the `bundler/` subfolder: - - bin/rspec spec/install/gems/standalone_spec.rb - -To test Rubygems changes in bundler, set the path to your local Rubygems copy using the `RGV` environment variable: - - RGV=.. bin/rspec spec/install/gems/standalone_spec.rb - -### Checking code style - -You can check compliance with our code style with - - bin/rake rubocop - -Optionally you can configure git hooks with to check this before every commit with - - bin/rake git_hooks - -For more information, check [SETUP.md](../bundler/development/SETUP.md) and [DEBUGGING.md](../bundler/development/DEBUGGING.md). - -### Git - -Please sign your commits. Although not required in order for you to contribute, -it ensures that any code submitted by you wasn't altered while you were -transferring it, and proves that it was you who submitted it and not someone -else. - -Please see https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work or -https://help.github.com/en/articles/signing-commits for details on how to -to generate a signature and automatically sign your commits. - # Community Community is an important part of all we do. If you'd like to be part of the Bundler community, you can jump right in and start helping make Bundler better for everyone who uses it. diff --git a/doc/GETTING_STARTED.md b/doc/GETTING_STARTED.md new file mode 100644 index 000000000000..19987db63418 --- /dev/null +++ b/doc/GETTING_STARTED.md @@ -0,0 +1,120 @@ +## Getting Started + +### Prerequisites and Setup + +[Fork the ruby/rubygems repo](https://github.com/ruby/rubygems) and clone the fork onto your machine. ([Follow this tutorial](https://help.github.com/articles/fork-a-repo/) for instructions on forking a repo.) + +Install development dependencies from the repository root directory: + + bin/rake setup + +> **NOTE**: If the above fails with permission related errors, you're most +> likely using a global Ruby installation (like the one packaged by your OS), +> which sets `GEM_HOME` to a location regular users can't write to. Consider +> using a Ruby version manager like [RVM](https://github.com/rvm/rvm), +> [rbenv](https://github.com/rbenv/rbenv), +> [chruby](https://github.com/postmodern/chruby) or [asdf](https://github.com/asdf-vm/asdf-ruby). These will install Ruby to a +> location regular users can write to, so you won't run into permission issues. +> Alternatively, consider setting `GEM_HOME` environment variable to a writable +> location with something like `export GEM_HOME=/tmp/rubygems.gems` and try +> again. + +### Testing Your Local Changes + +#### RubyGems Commands + +To run RubyGems commands like `gem install` from your local copy: + + ruby -Ilib exe/gem install + +#### Bundler Commands + +To run Bundler commands like `bundle install` from your local copy: + + bundler/bin/bundle install + +### Running Tests + +#### RubyGems Tests + +To run the entire RubyGems test suite: + + bin/rake test + +To run an individual test file, for example `test/rubygems/test_deprecate.rb`: + + ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb + +To run a specific test method named `test_default`: + + ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb -n /test_default/ + +#### Bundler Tests + +To run the entire Bundler test suite in parallel from the `bundler/` directory: + + bin/parallel_rspec + +For realworld higher level specs (also run in CI): + + bin/rake spec:realworld + +To run an individual Bundler test file, for example `spec/install/gems/standalone_spec.rb`, from the `bundler/` directory: + + bin/rspec spec/install/gems/standalone_spec.rb + +### Developing Bundler and RubyGems Together + +When developing Bundler features or bug fixes that require changes in RubyGems, you can set the `RGV` environment variable to point to the repository root so Bundler's test suite picks up those changes: + + RGV=.. bin/parallel_rspec + +You can also test against specific RubyGems versions: + + RGV=v3.2.33 bin/parallel_rspec + +It's recommended to set this variable permanently using [direnv](https://direnv.net) for consistent development. + +### Code Style and Quality + +Check code style compliance: + + bin/rake rubocop + +Optionally configure git hooks to check this before every commit: + + bin/rake git_hooks + +### Shell Aliases (Optional) + +Set up a shell alias to run Bundler from your clone for convenience. + +**Bash:** + + alias dbundle='ruby /[repo root]/bundler/bin/bundle' + +See [this tutorial](https://www.moncefbelyamani.com/create-aliases-in-bash-profile-to-assign-shortcuts-for-common-terminal-commands/) for adding aliases to your `~/.bashrc` profile. + +**Windows (PowerShell):** + +Add this to your [PowerShell profile](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4) (use `vim $profile` on the command line if you have `vim` installed): + +```powershell +$Env:RUBYOPT="-rdebug" +function dbundle +{ + & "ruby.exe" E:\[repo root]\bundler\bin\bundle $args +} +``` + +For a better command line experience on Windows, consider using [Windows Terminal](https://github.com/microsoft/terminal). + +### Git Commits + +Please sign your commits. Although not required to contribute, it ensures that code you submit wasn't altered during transfer and proves it came from you. + +See [Git commit signing documentation](https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work) or [GitHub's guide](https://help.github.com/en/articles/signing-commits) for details on generating signatures and automatically signing your commits. + +### Debugging + +See [DEBUGGING.md](../bundler/development/DEBUGGING.md) for debugging tips and techniques. diff --git a/doc/bundler/development/SETUP.md b/doc/bundler/development/SETUP.md deleted file mode 100644 index 9c91de4f0858..000000000000 --- a/doc/bundler/development/SETUP.md +++ /dev/null @@ -1,64 +0,0 @@ -# Bundler Development setup - -To work on Bundler, you'll probably want to do a couple of things: - -* [Fork the Rubygems repo](https://github.com/ruby/rubygems), and clone the fork onto your machine. ([Follow this tutorial](https://help.github.com/articles/fork-a-repo/) for instructions on forking a repo.) - -* Install development dependencies from the rubygems root directory: - - bin/rake setup - -* Change into the bundler directory: - - cd bundler - -* Now you can run the test suite in parallel: - - bin/parallel_rspec - -* Set up a shell alias to run Bundler from your clone, e.g. a Bash alias ([follow these instructions](https://www.moncefbelyamani.com/create-aliases-in-bash-profile-to-assign-shortcuts-for-common-terminal-commands/) for adding aliases to your `~/.bashrc` profile): - - alias dbundle='ruby /[repo root]/bundler/bin/bundle' - -On Windows, you can add this to your [PowerShell profile][profile] (you can use `vim $profile` on the command line if you have `vim` installed): - -```powershell -$Env:RUBYOPT="-rdebug" -function dbundle -{ - & "ruby.exe" E:\[repo root]\bundler\bin\bundle $args -} -``` - -It is also recommended to use [Windows Terminal][terminal] for a better command line experience: - -![windows terminal](windows-terminal.png) - -[profile]: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4 -[terminal]: https://github.com/microsoft/terminal - -## Jointly developing on Bundler and RubyGems - -When developing Bundler features or bug fixes that require changes in RubyGems, -you can make sure Bundler's test suite picks up those changes by setting the -`RGV` environment variable to point to the root of the repository, like this: - -``` -RGV=.. bin/parallel_rspec -``` - -It's a good idea to make sure that your changes always work against the latest -RubyGems, so setting this variable permanently might be a good idea. You can use -[direnv](https://direnv.net) for that. - -The `RGV` environment variable can also be set to arbitrary RubyGems versions, -to make sure your changes in Bundler work fine with those versions. For example, - -``` -RGV=v3.2.33 bin/parallel_rspec -``` - -## Debugging - -See [DEBUGGING.md](DEBUGGING.md). - From 7a7544d11a714490c96f5a937e25c731a8e194ce Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 17:01:44 +0900 Subject: [PATCH 04/16] Refine contributing guide --- CONTRIBUTING.md | 115 ++++++++++-------------- doc/bundler/development/NEW_FEATURES.md | 20 +++-- 2 files changed, 57 insertions(+), 78 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5bfb3d8aa6f7..2d26ccf798b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,96 +1,71 @@ -# How to contribute +# How to Contribute -Community involvement is essential to RubyGems. We want to keep it as easy as -possible to contribute changes. There are a few guidelines that we need -contributors to follow to reduce the time it takes to get changes merged in. +Thank you for your interest in contributing to the ruby/rubygems! Community involvement is essential to both RubyGems and Bundler. We welcome contributions from everyone, and we want to keep it as easy as possible to contribute changes. -## Guidelines +## Code of Conduct -1. New features should be coupled with tests. +By participating in this project, you agree to abide by the terms of the [Code of Conduct](CODE_OF_CONDUCT.md). -2. Ensure that your code blends well with ours: - * No trailing whitespace - * Match indentation (two spaces) - * Match coding style (run `bin/rake rubocop`) +## Getting Started -3. If any new files are added or existing files removed in a commit or PR, - please update the `Manifest.txt` accordingly. This can be done by running - `bin/rake update_manifest` +Before submitting a contribution: -4. Don't modify the history file or version number. +1. **Set up your development environment** - See [GETTING_STARTED.md](doc/GETTING_STARTED.md) for detailed setup instructions +2. **Understand the repository structure** - This is a monorepo containing both RubyGems and Bundler: + - RubyGems code is in the root `lib/` and `exe/` directories + - Bundler code is in the `bundler/` subdirectory -5. If you have any questions, Feel free to join us on Slack, you can register - by signing up at http://slack.bundler.io or file an issue here: - http://github.com/ruby/rubygems/issues +## Contribution Guidelines +All contributions to this repository should follow these guidelines: -For more information and ideas on how to contribute to RubyGems ecosystem, see -here: https://guides.rubygems.org/contributing/ +1. **Write tests** - New features must be coupled with tests. Bug fixes should include a test that reproduces the issue. -# Community +2. **Code style compliance**: + - No trailing whitespace + - Use two-space indentation + - Run `bin/rake rubocop` to check style compliance -Community is an important part of all we do. If you'd like to be part of the Bundler community, you can jump right in and start helping make Bundler better for everyone who uses it. +3. **File management** (RubyGems only): + - If you add or remove files in the RubyGems portion of the repo, update `Manifest.txt` by running `bin/rake update_manifest` -It would be tremendously helpful to have more people answering questions about Bundler (and often simply about [RubyGems](https://github.com/ruby/rubygems) or Ruby itself) in our [issue tracker](https://github.com/ruby/rubygems/issues) or on [Stack Overflow](https://stackoverflow.com/questions/tagged/bundler). +4. **Preserve version history**: + - Don't modify version numbers or changelog files directly; maintainers handle these -Additional documentation and explanation is always helpful, too. If you have any suggestions for the Bundler website [bundler.io](https://bundler.io), we would absolutely love it if you opened an issue or pull request on the [bundler-site](https://github.com/rubygems/bundler-site) repository. +5. **Ask questions** - Have questions? Feel free to [open an issue](https://github.com/ruby/rubygems/issues) -Sharing your experiences and discoveries by writing them up is a valuable way to help others who have similar problems or experiences in the future. You can write a blog post, create an example and commit it to GitHub, take screenshots, or make videos. +For more information on contributing to the RubyGems ecosystem, see [guides.rubygems.org/contributing](https://guides.rubygems.org/contributing/). -Publishing examples of how Bundler is used helps everyone, and we've discovered that people already use it in ways that we never imagined when we were writing it. If you're still not sure what to write about, there are also several projects doing interesting things based on Bundler. They could probably use publicity too. +## First-Time Contributors -Finally, all contributors to the Bundler project must agree to the contributor [code of conduct](https://bundler.io/conduct.html). By participating in this project you agree to abide by its terms. -# How you can help: your first commits! +We track [good first issues](https://github.com/ruby/rubygems/issues?q=is%3Aissue+is%3Aopen+label%3Abundler+label%3A%22good+first+issue%22) to help new contributors get started. Here are some great ways to begin: -If you're interested in contributing to Bundler, that's awesome! We'd love your help. +- **Test prerelease versions**: Run `gem install bundler --pre` and report any issues +- **Report bugs or suggest features**: [Open an issue](https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md) (see [new features documentation](bundler/development/NEW_FEATURES.md)) +- **Improve documentation**: Contribute to the [Bundler website](https://bundler.io) or [man pages](https://bundler.io/man/bundle.1.html) +- **Triage issues**: [Check issue completeness](doc/ISSUE_TRIAGE.md) and help close incomplete reports +- **Write tests**: Add failing tests for [reported bugs](https://github.com/ruby/rubygems/issues) or backfill missing test coverage +- **Review pull requests**: Provide feedback on [pull requests](https://github.com/ruby/rubygems/pulls) +- **Improve code**: No patch is too small—fix typos, improve code clarity, or clean up whitespace +- **Contribute features**: See [adding new features](bundler/development/NEW_FEATURES.md) -If at any point you get stuck, here's how to [get in touch with the Bundler team for help](https://bundler.slack.com). +## Pull Request Guidelines -## First contribution suggestions +See [bundler/development/PULL_REQUESTS.md](bundler/development/PULL_REQUESTS.md) for detailed guidelines. -We track [small bugs and features](https://github.com/ruby/rubygems/issues?q=is%3Aissue+is%3Aopen+label%3Abundler+label%3A%22good+first+issue%22) so that anyone who wants to help can start with something that's not too overwhelming. +## Community and Support -Generally, great ways to get started helping out with Bundler are: +Community involvement is vital to both projects: - - using prerelease versions (run `gem install bundler --pre`) - - [reporting bugs you encounter or suggesting new features](https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md) - - see the [new features documentation](../development/NEW_FEATURES.md) for more - - adding to or editing [the Bundler documentation website](https://bundler.io) and [Bundler man pages](https://bundler.io/man/bundle.1.html) - - [checking issues for completeness](BUG_TRIAGE.md) - - closing issues that are not complete - - adding a failing test for reproducible [reported bugs](https://github.com/ruby/rubygems/issues) - - reviewing [pull requests](https://github.com/ruby/rubygems/pulls) and suggesting improvements - - improving existing code - - writing code (no patch is too small! fix typos or bad whitespace) - - get started setting up your dev environment with [these instructions](../development/SETUP.md) - - backfilling [unit tests](https://github.com/ruby/rubygems/tree/master/bundler/spec/bundler) for modules that lack coverage. +- **Answer questions**: Help others on the [issue tracker](https://github.com/ruby/rubygems/issues) or [Stack Overflow](https://stackoverflow.com/questions/tagged/bundler) (questions about RubyGems, Bundler, and Ruby in general are welcome) +- **Share knowledge**: Write blog posts, create examples, make videos, or share your experiences +- **Improve documentation**: Suggest improvements to [bundler.io](https://bundler.io) via issues or pull requests on the [bundler-site](https://github.com/rubygems/bundler-site) repository -If nothing on those lists looks good, [talk to us](https://bundler.slack.com/), and we'll figure out what you can help with. We can absolutely use your help, no matter what level of programming skill you have at the moment. -# Bundler Contributor Guidelines +## Supporting the Projects -Thank you for your interest in making Bundler better! We welcome contributions from everyone. Dozens of contributors like you have submitted feature improvements, fixed bugs, and written new documentation. [Join the Bundler Slack community](https://slack.bundler.io/) to connect with the Bundler core team and other contributors like you. +Both RubyGems and Bundler are managed by [Ruby Central](https://rubycentral.org), a non-profit organization supporting the Ruby community through projects like these, as well as [RubyConf](https://rubyconf.org) and [RubyGems.org](https://rubygems.org). -Before submitting a contribution, read through the following guidelines: +You can support Ruby Central by: -* [Bundler Code of Conduct](https://github.com/ruby/rubygems/blob/master/CODE_OF_CONDUCT.md) (By participating in Bundler, you agree to abide by the terms laid out in the CoC.) -* [Pull Request Guidelines](../development/PULL_REQUESTS.md) - -And be sure to [set up your development environment](../development/SETUP.md). - -## Feature Requests - -To request substantial changes to Bundler and/or Bundler documentation, please refer to the [README](https://github.com/rubygems/rfcs/blob/master/README.md) in the [RFC repository](https://github.com/rubygems/rfcs) for instructions. - -## Contributing to Bundler - -Here are the different ways you can start contributing to the Bundler project: - -* [First contribution suggestions](HOW_YOU_CAN_HELP.md) -* [Adding new features](../development/NEW_FEATURES.md) -* [Triaging bugs](BUG_TRIAGE.md) -* [Writing documentation](../documentation/WRITING.md) -* [Community engagement](COMMUNITY.md) - -## Supporting Bundler - -RubyGems is managed by [Ruby Central](https://rubycentral.org), a non-profit organization that supports the Ruby community through projects like this one, as well as [RubyConf](https://rubyconf.org), [RailsConf](https://railsconf.org), and [RubyGems.org](https://rubygems.org). You can support Ruby Central by attending or [sponsoring](sponsors@rubycentral.org) a conference, or by [joining as a supporting member](https://rubycentral.org/#/portal/signup). +- Attending or [sponsoring](mailto:sponsors@rubycentral.org) a conference +- [Joining as a supporting member](https://rubycentral.org/#/portal/signup) diff --git a/doc/bundler/development/NEW_FEATURES.md b/doc/bundler/development/NEW_FEATURES.md index 94806823d9cd..f571ced62218 100644 --- a/doc/bundler/development/NEW_FEATURES.md +++ b/doc/bundler/development/NEW_FEATURES.md @@ -1,12 +1,16 @@ -# Adding New Features +# Bundler Feature Requests -If you would like to add a new feature to Bundler, please follow these steps: +## Substantial Features - 1. [Create an issue](https://github.com/ruby/rubygems/issues/new) to discuss your feature. - 2. Base your commits on the master branch, since we follow [SemVer](https://semver.org) and don't add new features to old releases. - 3. Commit the code and at least one test covering your changes to a feature branch in your fork. - 4. Send us a [pull request](PULL_REQUESTS.md) from your feature branch. +To request substantial changes to Bundler or Bundler documentation, please refer to the [RFC repository](https://github.com/rubygems/rfcs). See the [README](https://github.com/rubygems/rfcs/blob/master/README.md) for detailed instructions on the RFC process. -If you don't hear back immediately, don't get discouraged! We all have day jobs, but we respond to most tickets within a day or two. +## Contributing New Features -If you'd like to add a substantial feature to Bundler, refer to the [Bundler RFC process](https://github.com/rubygems/rfcs) for more information. +To add a new feature to Bundler: + +1. **Discuss your idea** - [Open an issue](https://github.com/ruby/rubygems/issues/new) to discuss your proposed feature +2. **Base on master branch** - We follow [SemVer](https://semver.org), so new features go in the master branch only, not old releases +3. **Write tests** - Include at least one test covering your changes in your feature branch +4. **Submit a pull request** - See [PULL_REQUESTS.md](PULL_REQUESTS.md) for detailed guidelines + +Don't be discouraged if you don't hear back immediately—we all have day jobs, but we typically respond to most tickets within a day or two. From 10a26abf60ea626fe3be4d479bb19ae466642b70 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 17:15:42 +0900 Subject: [PATCH 05/16] Merge doc/bundler/documentation/*.md to doc/DOCUMENTATION.md with RubyGems guide --- doc/DOCUMENTATION.md | 157 +++++++++++++++++++++++++++ doc/bundler/documentation/README.md | 31 ------ doc/bundler/documentation/VISION.md | 26 ----- doc/bundler/documentation/WRITING.md | 71 ------------ 4 files changed, 157 insertions(+), 128 deletions(-) create mode 100644 doc/DOCUMENTATION.md delete mode 100644 doc/bundler/documentation/README.md delete mode 100644 doc/bundler/documentation/VISION.md delete mode 100644 doc/bundler/documentation/WRITING.md diff --git a/doc/DOCUMENTATION.md b/doc/DOCUMENTATION.md new file mode 100644 index 000000000000..6bfddf38b45b --- /dev/null +++ b/doc/DOCUMENTATION.md @@ -0,0 +1,157 @@ +# Documentation + +Code needs explanation, and sometimes those who know the code well have trouble explaining it to someone just getting into it. We welcome documentation suggestions and patches from everyone, especially from those new to RubyGems or Bundler. + +This repository contains documentation for both RubyGems and Bundler. We have multiple documentation sources depending on what you're documenting: + +## RubyGems Documentation + +**RubyGems guides**: https://guides.rubygems.org/ + +For RubyGems documentation contributions: +- Submit issues or pull requests to the [RubyGems Guides repository](https://github.com/rubygems/guides) +- This covers topics like gem creation, publishing, versioning, and best practices + +## Bundler Documentation + +**Bundler help & man pages**: Built into the `bundler/` directory + +**Bundler documentation site**: https://bundler.io + +For Bundler documentation contributions: +- **Command documentation** (ex: `bundle clean`): Contribute to man pages in this repository (`bundler/lib/bundler/man/`) +- **Guides and tutorials** (ex: "Using Bundler with Rails"): Open an issue or pull request in the [bundler-site](https://github.com/rubygems/bundler-site) repository +- **Using Bundler with gems**: Additional documentation on [RubyGems guides](https://guides.rubygems.org/) + +## Documentation Vision and Goals + +### RubyGems + +RubyGems documentation focuses on: +- Gem creation, packaging, and publishing +- Dependency management best practices +- Version constraints and semantic versioning +- Security and trust topics + +Goals are to provide guides and tutorials at https://guides.rubygems.org/ that help users understand and effectively use RubyGems. + +### Bundler + +Bundler documentation is split across multiple places: + +1. Built-in `help` (including usage information and man pages) +2. [Bundler documentation site](https://bundler.io) +3. [RubyGems guides](https://guides.rubygems.org/) (for gem publishing topics) + +Bundler documentation should provide users with assistance: + +1. Installing Bundler +2. Using Bundler to manage an application's dependencies +3. Using Bundler to create, package, and publish gems + +Our goal is to provide three types of documentation: + +* High-level overviews that provide topical guidance +* Step-by-step tutorials +* Command-specific reference material for the CLI + +Additionally, this documentation should be readily available in a logical place and easy to follow. + +Someday, we'd like to create deep-dive reference material about the inner workings of Bundler. However, while this is part of our overall vision, it is not the focus of our current work. + +# Writing Documentation + +## RubyGems Documentation + +### Contributing to RubyGems guides + +To contribute to RubyGems documentation: + +1. Fork and clone the [rubygems/guides](https://github.com/rubygems/guides) repository +2. Add or edit Markdown files in the `_pages/` directory +3. Follow the existing format and style guidelines +4. Submit a pull request with your changes + +See the [RubyGems Guides repository](https://github.com/rubygems/guides) for detailed contribution instructions. + +## Bundler Documentation + +### Writing docs for man pages + +*Any commands or file paths in this document assume that you are inside [the bundler/ directory of the ruby/rubygems repository](https://github.com/ruby/rubygems/tree/master/bundler).* + +A primary source of help for Bundler users are the man pages: the output printed when you run `bundle help` (or `bundler help`). These pages can be a little tricky to format and preview, but are pretty straightforward once you get the hang of it. + +_Note: `bundler` and `bundle` may be used interchangeably in the CLI. This guide uses `bundle` because it's cuter._ + +### What goes in man pages? + +We use man pages for Bundler commands used in the CLI (command line interface). They can vary in length from large (see `bundle install`) to very short (see `bundle clean`). + +To see a list of commands available in the Bundler CLI, type: + + $ bundle help + +Our goal is to have a man page for every command. + +Don't see a man page for a command? Make a new page and send us a PR! We also welcome edits to existing pages. + +### Creating a new man page + +To create a new man page, simply create a new `.ronn` file in the `lib/bundler/man/` directory. + +For example: to create a man page for the command `bundle cookies` (not a real command, sadly), I would create a file `lib/bundler/man/bundle-cookies.1.ronn` and add my documentation there. + +### Formatting + +Our man pages use ronn formatting, a combination of Markdown and standard man page conventions. It can be a little weird getting used to it at first, especially if you've used Markdown a lot. + +[The ronn guide formatting guide](https://rtomayko.github.io/ronn/ronn.7.html) provides a good overview of the common types of formatting. + +In general, make your page look like the other pages: utilize sections like `##OPTIONS` and formatting like code blocks and definition lists where appropriate. + +If you're not sure if the formatting looks right, that's ok! Make a pull request with what you've got and we'll take a peek. + +### Previewing + +To preview your changes as they will print out for Bundler users, you'll need to run a series of commands: + +``` +$ bin/rake dev:deps +$ bin/rake man:build +$ man ./lib/bundler/man/bundle-cookies.1 +``` + +If you make more changes to `bundle-cookies.1.ronn`, you'll need to run the `bin/rake man:build` again before previewing. + +### Testing + +We have tests for our documentation! The most important test file to run before you make your pull request is the one for the `help` command and another for documentation quality. + +``` +$ bin/rspec ./spec/commands/help_spec.rb +$ bin/rspec ./spec/quality_spec.rb +``` + +## Writing docs for [the Bundler documentation site](https://bundler.io) + +### Primary commands and utilities + +If you'd like to submit a pull request for any of the primary commands or utilities on [the Bundler documentation site](https://bundler.io), please follow the instructions above for writing documentation for man pages from the `ruby/rubygems` repository. They are the same in each case. + +**Note**: Editing `.ronn` files from the `ruby/rubygems` repository for the primary commands and utilities documentation is all you need 🎉. There is no need to manually change anything in the `rubygems/bundler-site` repository, because the man pages and the docs for primary commands and utilities on [the Bundler documentation site](https://bundler.io) are one in the same. They are generated automatically from the `ruby/rubygems` repository's `.ronn` files when you run `bin/rake man:build`. + +### Guides and tutorials + +To add a guide or tutorial to the [Bundler documentation site](https://bundler.io): + +1. Go to the [bundler-site](https://github.com/rubygems/bundler-site) repository +2. Navigate to `/bundler-site/source/current_version_of_bundler/guides` +3. Add a new [Markdown file](https://guides.github.com/features/mastering-markdown/) (ending in `.md`) +4. Format the title correctly: + ``` + --- + title: Your Guide Title Here + --- + ``` +5. Submit a pull request with your changes diff --git a/doc/bundler/documentation/README.md b/doc/bundler/documentation/README.md deleted file mode 100644 index 92cf8c6e1210..000000000000 --- a/doc/bundler/documentation/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Documentation - -Code needs explanation, and sometimes those who know the code well have trouble explaining it to someone just getting into it. Because of that, we welcome documentation suggestions and patches from everyone, especially if they are brand new to using Bundler. - -Currently, Bundler has two main sources of documentation: - -1. built-in `help` (including usage information and man pages) -2. [Bundler documentation site](https://bundler.io) - -If you have a suggestion or proposed change for [bundler.io](https://bundler.io), please open an issue or send a pull request to the [bundler-site](https://github.com/rubygems/bundler-site) repository. - -Not sure where to write documentation? In general, follow these guidelines: - -* For an explanation of a specific Bundler command (ex: `bundle clean`): make changes to the man pages -* For longer explanations or usage guides (ex: "Using Bundler with Rails"): create new documentation within the [bundler-site](https://github.com/rubygems/bundler-site) repository - -If you are unsure where to begin, ping [@feministy](https://github.com/feministy) or [@indirect](https://github.com/indirect) in [the Bundler Slack](https://slack.bundler.io). - -## [Writing docs for man pages](WRITING.md) - -If you'd like to submit a patch to the man pages, you're in the right place! Details on editing and previewing changes to man pages can be found [here](WRITING.md). - -## [Documentation vision](VISION.md) - -Just like Bundler, we have a grand plan (really, a wish list of sorts) for Bundler documentation. Preview our hopes and dreams for our documentation [here](VISION.md). - -## Translations - -We don't currently have any translations, but please reach out to us if you would like to help get this going. - -Please feel free to reach out to [@arbonap](https://github.com/arbonap) if you'd like to help localize Bundler in Spanish. diff --git a/doc/bundler/documentation/VISION.md b/doc/bundler/documentation/VISION.md deleted file mode 100644 index d92483ae6cf2..000000000000 --- a/doc/bundler/documentation/VISION.md +++ /dev/null @@ -1,26 +0,0 @@ -# Documentation vision - -Currently, documentation for using Bundler is spread across two places: - -1. built-in `help` (including usage information and man pages) -2. [Bundler documentation site](https://bundler.io) - -Additional documentation about using Bundler to publish gems can also be found on the [RubyGems guides](https://guides.rubygems.org/). - -## Goals - -Bundler documentation should provide users with assistance: - -1. Installing Bundler -2. Using Bundler to manage an application's dependencies -3. Using Bundler to create, package, and publish gems - -Our goal is to provide three types of documentation: - -* High level overviews that provide topical guidance -* Step-by-step tutorials -* Command-specific reference material for the CLI - -Additionally, this documentation should be readily available in a logical place and easy to follow. - -Someday, we'd like to create deep-dive reference material about the inner workings of Bundler. However, while this is part of our overall vision for Bundler documentation, it is not the focus of our current work. diff --git a/doc/bundler/documentation/WRITING.md b/doc/bundler/documentation/WRITING.md deleted file mode 100644 index a7e18b759786..000000000000 --- a/doc/bundler/documentation/WRITING.md +++ /dev/null @@ -1,71 +0,0 @@ -# Writing documentation for Bundler - -## Writing docs for man pages - -*Any commands or file paths in this document assume that you are inside [the bundler/ directory of the ruby/rubygems repository](https://github.com/ruby/rubygems/tree/master/bundler).* - -A primary source of help for Bundler users are the man pages: the output printed when you run `bundle help` (or `bundler help`). These pages can be a little tricky to format and preview, but are pretty straightforward once you get the hang of it. - -_Note: `bundler` and `bundle` may be used interchangeably in the CLI. This guide uses `bundle` because it's cuter._ - -### What goes in man pages? - -We use man pages for Bundler commands used in the CLI (command line interface). They can vary in length from large (see `bundle install`) to very short (see `bundle clean`). - -To see a list of commands available in the Bundler CLI, type: - - $ bundle help - -Our goal is to have a man page for every command. - -Don't see a man page for a command? Make a new page and send us a PR! We also welcome edits to existing pages. - -### Creating a new man page - -To create a new man page, simply create a new `.ronn` file in the `lib/bundler/man/` directory. - -For example: to create a man page for the command `bundle cookies` (not a real command, sadly), I would create a file `lib/bundler/man/bundle-cookies.1.ronn` and add my documentation there. - -### Formatting - -Our man pages use ronn formatting, a combination of Markdown and standard man page conventions. It can be a little weird getting used to it at first, especially if you've used Markdown a lot. - -[The ronn guide formatting guide](https://rtomayko.github.io/ronn/ronn.7.html) provides a good overview of the common types of formatting. - -In general, make your page look like the other pages: utilize sections like `##OPTIONS` and formatting like code blocks and definition lists where appropriate. - -If you're not sure if the formatting looks right, that's ok! Make a pull request with what you've got and we'll take a peek. - -### Previewing - -To preview your changes as they will print out for Bundler users, you'll need to run a series of commands: - -``` -$ bin/rake dev:deps -$ bin/rake man:build -$ man ./lib/bundler/man/bundle-cookies.1 -``` - -If you make more changes to `bundle-cookies.1.ronn`, you'll need to run the `bin/rake man:build` again before previewing. - -### Testing - -We have tests for our documentation! The most important test file to run before you make your pull request is the one for the `help` command and another for documentation quality. - -``` -$ bin/rspec ./spec/commands/help_spec.rb -$ bin/rspec ./spec/quality_spec.rb -``` - -## Writing docs for [the Bundler documentation site](https://bundler.io) - -If you'd like to submit a pull request for any of the primary commands or utilities on [the Bundler documentation site](https://bundler.io), please follow the instructions above for writing documentation for man pages from the `ruby/rubygems` repository. They are the same in each case. - -Note: Editing `.ronn` files from the `ruby/rubygems` repository for the primary commands and utilities documentation is all you need 🎉. There is no need to manually change anything in the `rubygems/bundler-site` repository, because the man pages and the docs for primary commands and utilities on [the Bundler documentation site](https://bundler.io) are one in the same. They are generated automatically from the `ruby/rubygems` repository's `.ronn` files from the `bin/rake man:build` command. - -Additionally, if you'd like to add a guide or tutorial: in the `rubygems/bundler-site` repository, go to `/bundler-site/source/current_version_of_bundler/guides` and add [a new Markdown file](https://guides.github.com/features/mastering-markdown/) (with an extension ending in `.md`). Be sure to correctly format the title of your new guide, like so: -``` ---- -title: RubyGems.org SSL/TLS Troubleshooting Guide ---- -``` From 1d18cf24ab5c2b8afb2ff80aa3c4e6dee5a1f592 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 17:23:16 +0900 Subject: [PATCH 06/16] Merge doc/bundler/playbooks/MERGING_A_PR.md to doc/bundler/development/PULL_REQUESTS.md --- doc/bundler/development/PULL_REQUESTS.md | 39 ++++++++++++++++++++++++ doc/bundler/playbooks/MERGING_A_PR.md | 39 ------------------------ 2 files changed, 39 insertions(+), 39 deletions(-) delete mode 100644 doc/bundler/playbooks/MERGING_A_PR.md diff --git a/doc/bundler/development/PULL_REQUESTS.md b/doc/bundler/development/PULL_REQUESTS.md index ab9ab095e7ee..f338e1ac52cd 100644 --- a/doc/bundler/development/PULL_REQUESTS.md +++ b/doc/bundler/development/PULL_REQUESTS.md @@ -34,3 +34,42 @@ Please ensure that the commit messages included in the pull request __do not__ h If you want to use these mechanisms, please instead include them in the pull request description. This prevents multiple notifications or references being created on commit rebases or pull request/branch force pushes. Additionally, do not use `[ci skip]` or `[skip ci]` mechanisms in your pull request titles/descriptions or commit messages. Every potential commit and pull request should run through Bundler's CI system. This applies to all changes/commits (ex. even a change to just documentation or the removal of a comment). +# Merging a PR + +Bundler requires all CI status checks to pass before a PR can me merged. So make +sure that's the case before merging. + +Also, bundler manages the changelog automatically using information from merged +PRs. So, if a PR has user visible changes that should be included in a future +release, make sure the following information is accurate: + +* The PR has a good descriptive title. That will be the wording for the + corresponding changelog entry. + +* The PR has an accurate label. If a PR is to be included in the changelog since + it has user visible changes, the label must be one of the following: + + * "bundler: security fix" + * "bundler: breaking change" + * "bundler: major enhancement" + * "bundler: deprecation" + * "bundler: feature" + * "bundler: performance" + * "bundler: documentation" + * "bundler: minor enhancement" + * "bundler: bug fix" + + This label will indicate the section in the changelog that the PR will take, + and it will also be automatically used by our release tasks for backporting. + The labels that should be backported only to patch level releases, and to + either patch level or minor releases can be configured in the `.changelog.yml` + file. + + If for some reason you need a PR to be backported to a stable branch, but it + doesn't have any user visible changes, apply the "bundler: skip changelog" + label to it so that our release scripts know about that. + +Finally, don't forget to review the changes in detail. Make sure you try them +locally if they are not trivial and make sure you request changes and ask as +many questions as needed until you are convinced that including the changes into +bundler is a strict improvement and will not make things regress in any way. diff --git a/doc/bundler/playbooks/MERGING_A_PR.md b/doc/bundler/playbooks/MERGING_A_PR.md deleted file mode 100644 index 73dda3595507..000000000000 --- a/doc/bundler/playbooks/MERGING_A_PR.md +++ /dev/null @@ -1,39 +0,0 @@ -# Merging a PR - -Bundler requires all CI status checks to pass before a PR can me merged. So make -sure that's the case before merging. - -Also, bundler manages the changelog automatically using information from merged -PRs. So, if a PR has user visible changes that should be included in a future -release, make sure the following information is accurate: - -* The PR has a good descriptive title. That will be the wording for the - corresponding changelog entry. - -* The PR has an accurate label. If a PR is to be included in the changelog since - it has user visible changes, the label must be one of the following: - - * "bundler: security fix" - * "bundler: breaking change" - * "bundler: major enhancement" - * "bundler: deprecation" - * "bundler: feature" - * "bundler: performance" - * "bundler: documentation" - * "bundler: minor enhancement" - * "bundler: bug fix" - - This label will indicate the section in the changelog that the PR will take, - and it will also be automatically used by our release tasks for backporting. - The labels that should be backported only to patch level releases, and to - either patch level or minor releases can be configured in the `.changelog.yml` - file. - - If for some reason you need a PR to be backported to a stable branch, but it - doesn't have any user visible changes, apply the "bundler: skip changelog" - label to it so that our release scripts know about that. - -Finally, don't forget to review the changes in detail. Make sure you try them -locally if they are not trivial and make sure you request changes and ask as -many questions as needed until you are convinced that including the changes into -bundler is a strict improvement and will not make things regress in any way. From 32c99c67c8496efc5c428fcd0ec9ae9046361e4e Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 17:25:05 +0900 Subject: [PATCH 07/16] Move bundler documents to top-level document directory --- doc/{bundler/development => }/DEBUGGING.md | 0 doc/{bundler/development => }/NEW_FEATURES.md | 0 doc/{bundler/development => }/PULL_REQUESTS.md | 2 +- doc/{bundler => }/TROUBLESHOOTING.md | 0 doc/bundler/development/README.md | 15 --------------- .../development => }/windows-terminal.png | Bin 6 files changed, 1 insertion(+), 16 deletions(-) rename doc/{bundler/development => }/DEBUGGING.md (100%) rename doc/{bundler/development => }/NEW_FEATURES.md (100%) rename doc/{bundler/development => }/PULL_REQUESTS.md (97%) rename doc/{bundler => }/TROUBLESHOOTING.md (100%) delete mode 100644 doc/bundler/development/README.md rename doc/{bundler/development => }/windows-terminal.png (100%) diff --git a/doc/bundler/development/DEBUGGING.md b/doc/DEBUGGING.md similarity index 100% rename from doc/bundler/development/DEBUGGING.md rename to doc/DEBUGGING.md diff --git a/doc/bundler/development/NEW_FEATURES.md b/doc/NEW_FEATURES.md similarity index 100% rename from doc/bundler/development/NEW_FEATURES.md rename to doc/NEW_FEATURES.md diff --git a/doc/bundler/development/PULL_REQUESTS.md b/doc/PULL_REQUESTS.md similarity index 97% rename from doc/bundler/development/PULL_REQUESTS.md rename to doc/PULL_REQUESTS.md index f338e1ac52cd..02b8c30e9dd4 100644 --- a/doc/bundler/development/PULL_REQUESTS.md +++ b/doc/PULL_REQUESTS.md @@ -28,7 +28,7 @@ Ex. For a pull request that changes something with `bundle update`, you might ru ## Commit messages Please ensure that the commit messages included in the pull request __do not__ have the following: - - `@tag` GitHub user or team references (ex. `@indirect` or `@bundler/core`) + - `@tag` GitHub user or team references (ex. `@hsbt`) - `#id` references to issues or pull requests (ex. `#43` or `rubygems/bundler-site#12`) If you want to use these mechanisms, please instead include them in the pull request description. This prevents multiple notifications or references being created on commit rebases or pull request/branch force pushes. diff --git a/doc/bundler/TROUBLESHOOTING.md b/doc/TROUBLESHOOTING.md similarity index 100% rename from doc/bundler/TROUBLESHOOTING.md rename to doc/TROUBLESHOOTING.md diff --git a/doc/bundler/development/README.md b/doc/bundler/development/README.md deleted file mode 100644 index a1850831f4e6..000000000000 --- a/doc/bundler/development/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Development - -So, you're ready to start contributing to Bundler! You've come to the right place. Here you'll find an overview of how to work on Bundler locally and a description of the process from code to release. - -## [Development setup](SETUP.md) - -Guidelines for setting up your local development environment. - -## [Submitting pull requests](PULL_REQUESTS.md) - -An overview of our preferred PR process, including how to run the test suite and what to expect when you submit code for review. - -## [Adding new features](NEW_FEATURES.md) - -Guidelines for proposing and writing new features for Bundler. diff --git a/doc/bundler/development/windows-terminal.png b/doc/windows-terminal.png similarity index 100% rename from doc/bundler/development/windows-terminal.png rename to doc/windows-terminal.png From c6dc3513472bce3c0b54a17e3da4b2802e2cf9d0 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 17:49:55 +0900 Subject: [PATCH 08/16] Merge doc/*/POLICIES.md to POLICIES.md --- doc/{bundler => }/POLICIES.md | 105 ++++++++++++++++++++++++++ doc/bundler/README.md | 25 ------ doc/bundler/playbooks/TEAM_CHANGES.md | 41 ---------- doc/rubygems/POLICIES.md | 60 --------------- 4 files changed, 105 insertions(+), 126 deletions(-) rename doc/{bundler => }/POLICIES.md (63%) delete mode 100644 doc/bundler/README.md delete mode 100644 doc/bundler/playbooks/TEAM_CHANGES.md delete mode 100644 doc/rubygems/POLICIES.md diff --git a/doc/bundler/POLICIES.md b/doc/POLICIES.md similarity index 63% rename from doc/bundler/POLICIES.md rename to doc/POLICIES.md index 4cee19647049..5499436297e7 100644 --- a/doc/bundler/POLICIES.md +++ b/doc/POLICIES.md @@ -1,3 +1,66 @@ +# RubyGems Policies + +## Pull Requests + +Contributions to RubyGems are made via GitHub pull requests, which must be +approved by a project committer other than the author. To approve a PR, a +maintainer can use GitHubs PR review feature. After that, if the original author +is happy to merge the PR, she can press the merge button. + +## Long-Term Support + +RubyGems will support Ruby versions for as long as the Ruby team supports that +Ruby version. That means that the latest RubyGems release will always support +the currently-supported Ruby versions, and RubyGems security fixes will be +released for any RubyGems version that shipped inside a currently-supported +Ruby version. + +### Bugfix Releases + +RubyGems generally releases bugfixes from the master branch. We may mix bug +fixes and new features in the same release. RubyGems does not guarantee it +will ship bugfix releases for previous minor or major versions. + +For example, after RubyGems 2.5 is released, the RubyGems team will not +provide non-security fixes for RubyGems 2.4, or any earlier versions. + +### Security Releases + +Security releases will be made for RubyGems minor versions that were included +in a currently-supported Ruby release. + +For example, since RubyGems 2.0 was shipped in Ruby 2.0, RubyGems 2.0 will +receive security fixes until Ruby 2.0 reaches end-of-life. + +### Ruby Version Support + +When a Ruby version reaches end-of-life the following minor release of +RubyGems will drop backwards compatibility with that Ruby version. + +For example, since Ruby 2.2 has reached end-of-life, future RubyGems minor +releases will only support Ruby 2.3 and above. As of this writing RubyGems is +at version 2.7, so when RubyGems 2.8 is released, it will only support Ruby +2.3 and later. + +## Committer Access + +RubyGems committers may lose their commit privileges if they are inactive for +longer than 12 months. Committer permission may be restored upon request by +having a pull request merged. + +This is designed to improve the maintainability of RubyGems by requiring +committers to maintain familiarity with RubyGems activity and to improve the +security of RubyGems by preventing idle committers from having their commit +permissions compromised or exposed. + +## Changing These Policies + +These policies were set in order to reduce the burden of maintenance and to keep +committers current with existing development and policies. RubyGems work is +primarily volunteer-driven which limits the ability to provide long-term +support. By joining [Ruby Central](https://rubycentral.org/#/portal/signup) you +can help extend support for older RubyGems versions. + # Bundler Policies This document is an attempt to record the policies and processes that are used to govern the Bundler project--it's not fixed or permanent, and will likely evolve as events warrant. @@ -99,3 +162,45 @@ When it comes to carrying out our own policies, we're all regular humans trying Policies are not set in stone, and may be revised if policy violations are found to be in the spirit of the project goals. Likewise, actions that violate the spirit of the project goals will be considered policy violations, and enforcement action will be taken. We're not interested in rules-lawyering, and we will take action when needed to ensure that everyone feels safe and included. If you are comfortable reporting issues to the entire Bundler team, please send an email to team@bundler.io. If you are not comfortable reporting to the entire team, for any reason, please check the [maintainers team list](https://bundler.io/team) and use email, Twitter, or Slack to report to a single maintainer of your choice. Anyone violating a policy or goal is expected to cooperate with the team (and the reporter, if they request it) to resolve the issue in a way that follows the project goals. + +# Team changes + +This file documents how to add and remove team members. For the rules governing adding and removing team members, see [POLICIES](../POLICIES.md). + +## Adding a new team member + +Interested in adding someone to the team? Here's the process. + +1. An existing team member nominates a potential team member to the rest of the team. +2. The existing team reaches consensus about whether to invite the potential member. +3. The nominator asks the potential member if they would like to join the team. +4. The nominator also sends the candidate a link to [POLICIES](../POLICIES.md) as an orientation for being on the team. +5. If the potential member accepts: + - Invite them to the maintainers Slack channel + - Add them to the [maintainers team][org_team] on GitHub + - Add them to the [Team page][team] on bundler.io, in the [maintainers list][maintainers] + - Add them to the [list of team members][list] in `contributors.rake` + - Add them to the authors list in `bundler.gemspec` && `rubygems-update.gemspec` + - Add them to the owners list on RubyGems.org by running + ``` + $ gem owner -a EMAIL bundler + ``` + + +## Removing a team member + +When the conditions in [POLICIES](../POLICIES.md#maintainer-team-guidelines) are met, or when team members choose to retire, here's how to remove someone from the team. + +- Remove them from the owners list on RubyGems.org by running + ``` + $ gem owner -r EMAIL bundler + ``` +- Remove their entry on the [Team page][team] on bundler.io, in the [maintainers list][maintainers] +- Remove them from the [list of team members][list] in `contributors.rake` +- Remove them from the [maintainers team][org_team] on GitHub +- Remove them from the maintainers Slack channel + +[org_team]: https://github.com/orgs/rubygems/teams/maintainers/members +[team]: https://bundler.io/contributors.html +[maintainers]: https://github.com/rubygems/bundler-site/blob/f00eb65da0697c2cb0e7b4d6e5ba47ecc1538eb2/source/contributors.html.haml#L25 +[list]: https://github.com/rubygems/bundler-site/blob/f00eb65da0697c2cb0e7b4d6e5ba47ecc1538eb2/lib/tasks/contributors.rake#L8 diff --git a/doc/bundler/README.md b/doc/bundler/README.md deleted file mode 100644 index e0d39f8c4a29..000000000000 --- a/doc/bundler/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Docs: Developing Bundler - -_If you're looking for documentation on how to use Bundler: visit [bundler.io](https://bundler.io/), or run `bundle help` from the command line. You may also be interested in [troubleshooting common issues](TROUBLESHOOTING.md) found when using Bundler._ - -Bundler welcomes contributions from *everyone*. While contributing, please follow the project [code of conduct](https://bundler.io/conduct.html), so that everyone can be included. Maintainers are expected to work together with the community in accordance with [our project policies](POLICIES.md). - -If you'd like to help make Bundler better, you totally rock! Thanks for helping us make Bundler better. - -## Development - -* [Overview](development/README.md) -* [Development setup](development/SETUP.md) -* [Submitting pull requests](development/PULL_REQUESTS.md) -* [Adding new features](development/NEW_FEATURES.md) -* [Debugging](development/DEBUGGING.md) - -## Documentation - -* [Overview](documentation/README.md) -* [Writing docs for man pages](documentation/WRITING.md) -* [Documentation vision](documentation/VISION.md) - -## Maintainers - -* [Merging pull requests](playbooks/MERGING_A_PR.md) diff --git a/doc/bundler/playbooks/TEAM_CHANGES.md b/doc/bundler/playbooks/TEAM_CHANGES.md deleted file mode 100644 index a4dd0cf49331..000000000000 --- a/doc/bundler/playbooks/TEAM_CHANGES.md +++ /dev/null @@ -1,41 +0,0 @@ -# Team changes - -This file documents how to add and remove team members. For the rules governing adding and removing team members, see [POLICIES](../POLICIES.md). - -## Adding a new team member - -Interested in adding someone to the team? Here's the process. - -1. An existing team member nominates a potential team member to the rest of the team. -2. The existing team reaches consensus about whether to invite the potential member. -3. The nominator asks the potential member if they would like to join the team. -4. The nominator also sends the candidate a link to [POLICIES](../POLICIES.md) as an orientation for being on the team. -5. If the potential member accepts: - - Invite them to the maintainers Slack channel - - Add them to the [maintainers team][org_team] on GitHub - - Add them to the [Team page][team] on bundler.io, in the [maintainers list][maintainers] - - Add them to the [list of team members][list] in `contributors.rake` - - Add them to the authors list in `bundler.gemspec` && `rubygems-update.gemspec` - - Add them to the owners list on RubyGems.org by running - ``` - $ gem owner -a EMAIL bundler - ``` - - -## Removing a team member - -When the conditions in [POLICIES](../POLICIES.md#maintainer-team-guidelines) are met, or when team members choose to retire, here's how to remove someone from the team. - -- Remove them from the owners list on RubyGems.org by running - ``` - $ gem owner -r EMAIL bundler - ``` -- Remove their entry on the [Team page][team] on bundler.io, in the [maintainers list][maintainers] -- Remove them from the [list of team members][list] in `contributors.rake` -- Remove them from the [maintainers team][org_team] on GitHub -- Remove them from the maintainers Slack channel - -[org_team]: https://github.com/orgs/rubygems/teams/maintainers/members -[team]: https://bundler.io/contributors.html -[maintainers]: https://github.com/rubygems/bundler-site/blob/f00eb65da0697c2cb0e7b4d6e5ba47ecc1538eb2/source/contributors.html.haml#L25 -[list]: https://github.com/rubygems/bundler-site/blob/f00eb65da0697c2cb0e7b4d6e5ba47ecc1538eb2/lib/tasks/contributors.rake#L8 diff --git a/doc/rubygems/POLICIES.md b/doc/rubygems/POLICIES.md deleted file mode 100644 index ce6ea9c29b23..000000000000 --- a/doc/rubygems/POLICIES.md +++ /dev/null @@ -1,60 +0,0 @@ -## Pull Requests - -Contributions to RubyGems are made via GitHub pull requests, which must be -approved by a project committer other than the author. To approve a PR, a -maintainer can use GitHubs PR review feature. After that, if the original author -is happy to merge the PR, she can press the merge button. - -## Long-Term Support - -RubyGems will support Ruby versions for as long as the Ruby team supports that -Ruby version. That means that the latest RubyGems release will always support -the currently-supported Ruby versions, and RubyGems security fixes will be -released for any RubyGems version that shipped inside a currently-supported -Ruby version. - -### Bugfix Releases - -RubyGems generally releases bugfixes from the master branch. We may mix bug -fixes and new features in the same release. RubyGems does not guarantee it -will ship bugfix releases for previous minor or major versions. - -For example, after RubyGems 2.5 is released, the RubyGems team will not -provide non-security fixes for RubyGems 2.4, or any earlier versions. - -### Security Releases - -Security releases will be made for RubyGems minor versions that were included -in a currently-supported Ruby release. - -For example, since RubyGems 2.0 was shipped in Ruby 2.0, RubyGems 2.0 will -receive security fixes until Ruby 2.0 reaches end-of-life. - -### Ruby Version Support - -When a Ruby version reaches end-of-life the following minor release of -RubyGems will drop backwards compatibility with that Ruby version. - -For example, since Ruby 2.2 has reached end-of-life, future RubyGems minor -releases will only support Ruby 2.3 and above. As of this writing RubyGems is -at version 2.7, so when RubyGems 2.8 is released, it will only support Ruby -2.3 and later. - -## Committer Access - -RubyGems committers may lose their commit privileges if they are inactive for -longer than 12 months. Committer permission may be restored upon request by -having a pull request merged. - -This is designed to improve the maintainability of RubyGems by requiring -committers to maintain familiarity with RubyGems activity and to improve the -security of RubyGems by preventing idle committers from having their commit -permissions compromised or exposed. - -## Changing These Policies - -These policies were set in order to reduce the burden of maintenance and to keep -committers current with existing development and policies. RubyGems work is -primarily volunteer-driven which limits the ability to provide long-term -support. By joining [Ruby Central](https://rubycentral.org/#/portal/signup) you -can help extend support for older RubyGems versions. From 3330a7c5eb9e6a8051dd42472bb1f5148f33b59f Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 18:06:17 +0900 Subject: [PATCH 09/16] Refine policies document --- doc/POLICIES.md | 163 ++++++++++++++++++------------------------------ 1 file changed, 61 insertions(+), 102 deletions(-) diff --git a/doc/POLICIES.md b/doc/POLICIES.md index 5499436297e7..7d0bb3e94639 100644 --- a/doc/POLICIES.md +++ b/doc/POLICIES.md @@ -1,89 +1,70 @@ -# RubyGems Policies +# ruby/rubygems Policies -## Pull Requests +This document is an attempt to record the policies and processes that are used to govern the Bundler project--it's not fixed or permanent, and will likely evolve as events warrant. -Contributions to RubyGems are made via GitHub pull requests, which must be -approved by a project committer other than the author. To approve a PR, a -maintainer can use GitHubs PR review feature. After that, if the original author -is happy to merge the PR, she can press the merge button. +## Our Goals -## Long-Term Support +0. Treat everyone like a valuable human being, worthy of respect and empathy. No exceptions. +1. Strive to empower users, the Ruby developers who use Bundler. For example, there is no such thing as user error, only insufficient UX design. +2. Strive to empower Bundler contributors, as long as it does not harm users. For example, potential contributors should be able to set up a complete development and testing environment with a single command. +3. Strive to empower maintainers, as long as it does not harm contributors or users. For example, automating issue triage to reduce repetitive work for maintainers, as long as users with problems are not worse off. -RubyGems will support Ruby versions for as long as the Ruby team supports that -Ruby version. That means that the latest RubyGems release will always support -the currently-supported Ruby versions, and RubyGems security fixes will be -released for any RubyGems version that shipped inside a currently-supported -Ruby version. +These policies are intended to be examples of how to apply these goals, and we realize that we can't possibly cover every edge case or loophole. In any case where policies turn out to conflict with these goals, the goals should win. -### Bugfix Releases +## Issue guidelines -RubyGems generally releases bugfixes from the master branch. We may mix bug -fixes and new features in the same release. RubyGems does not guarantee it -will ship bugfix releases for previous minor or major versions. +Anyone is welcome to open an issue, or comment on an issue. Issue comments without useful content (like “me too”) may be removed. -For example, after RubyGems 2.5 is released, the RubyGems team will not -provide non-security fixes for RubyGems 2.4, or any earlier versions. +Opening an issue to ask for help may eventually get you help, but chances are help will arrive faster if you post on [Stack Overflow](https://stackoverflow.com) -### Security Releases +Issues will be handled as soon as possible, which may take some time. Including a script that can be used to reproduce your issue is a great way to help maintainers help you. If you can, writing a failing test for your issue is even more helpful. -Security releases will be made for RubyGems minor versions that were included -in a currently-supported Ruby release. +## Contribution and pull request guidelines -For example, since RubyGems 2.0 was shipped in Ruby 2.0, RubyGems 2.0 will -receive security fixes until Ruby 2.0 reaches end-of-life. +Contributions to RubyGems are made via GitHub pull requests, which must be +approved by a project committer other than the author. To approve a PR, a +maintainer can use GitHubs PR review feature. After that, if the original author +is happy to merge the PR, she can press the merge button. -### Ruby Version Support +Anyone is welcome to [contribute to Bundler](README.md). Contributed code will be released under the same license as the existing codebase. -When a Ruby version reaches end-of-life the following minor release of -RubyGems will drop backwards compatibility with that Ruby version. +Pull requests must have passing tests to be merged. Code changes must also include tests for the new behavior. Squashing commits is not required. -For example, since Ruby 2.2 has reached end-of-life, future RubyGems minor -releases will only support Ruby 2.3 and above. As of this writing RubyGems is -at version 2.7, so when RubyGems 2.8 is released, it will only support Ruby -2.3 and later. +Every pull request should explain: -## Committer Access +1. The problem being solved +2. Why that problem is happening +3. What changes to fix that problem are included in the PR, and +4. Why that implementation was chosen out of the possible options. -RubyGems committers may lose their commit privileges if they are inactive for -longer than 12 months. Committer permission may be restored upon request by -having a pull request merged. +## Long-Term Support -This is designed to improve the maintainability of RubyGems by requiring -committers to maintain familiarity with RubyGems activity and to improve the -security of RubyGems by preventing idle committers from having their commit -permissions compromised or exposed. +### Ruby Version Support -## Changing These Policies +Both RubyGems and Bundler support Ruby versions for as long as the Ruby team supports them, as [listed here](https://www.ruby-lang.org/en/downloads/branches/). When a Ruby version reaches end-of-life, the following minor release of RubyGems/Bundler will drop backwards compatibility with that Ruby version. -These policies were set in order to reduce the burden of maintenance and to keep -committers current with existing development and policies. RubyGems work is -primarily volunteer-driven which limits the ability to provide long-term -support. By joining [Ruby Central](https://rubycentral.org/#/portal/signup) you -can help extend support for older RubyGems versions. +We also support the latest stable versions of JRuby and TruffleRuby, and constantly evaluate changes in Ruby implementation usage to potentially support more implementations. -# Bundler Policies +### Version Support and Releases -This document is an attempt to record the policies and processes that are used to govern the Bundler project--it's not fixed or permanent, and will likely evolve as events warrant. +The team ships features and bugfixes for the latest minor version. We may exceptionally backport security fixes to older series shipped with Rubies that are officially supported. -## Our Goals +Security releases will be made for RubyGems and Bundler versions that were included in a currently-supported Ruby release. For example, if a version was shipped with a Ruby release, it will receive security fixes until that Ruby version reaches end-of-life. -0. Treat everyone like a valuable human being, worthy of respect and empathy. No exceptions. -1. Strive to empower users, the Ruby developers who use Bundler. For example, there is no such thing as user error, only insufficient UX design. -2. Strive to empower Bundler contributors, as long as it does not harm users. For example, potential contributors should be able to set up a complete development and testing environment with a single command. -3. Strive to empower maintainers, as long as it does not harm contributors or users. For example, automating issue triage to reduce repetitive work for maintainers, as long as users with problems are not worse off. +We generally release bugfixes from the main branch and may mix bug fixes and new features in the same release. We do not guarantee bugfix releases for previous minor or major versions. -These policies are intended to be examples of how to apply these goals, and we realize that we can't possibly cover every edge case or loophole. In any case where policies turn out to conflict with these goals, the goals should win. +These policies are not a guarantee that any particular fix will be backported. Instead, this is a way for us to set an upper limit on the versions of Ruby, RubyGems, and Bundler that we have to consider while making changes. Without the limit, the number of versions grows exponentially over time and quickly becomes overwhelming, which leads to maintainer burnout. We want to avoid that. -## Compatibility guidelines +### Backwards Compatibility -Bundler tries for perfect backwards compatibility. That means that if something worked in version 1.x, it should continue to work in 1.y and 1.z. That thing may or may not continue to work in 2.x. We may not always get it right, and there may be extenuating circumstances that force us into choosing between different kinds of breakage, but compatibility is very important to us. Infrastructure should be as unsurprising as possible. +We strive for backwards compatibility. Infrastructure should be as unsurprising as possible, so if something worked in version 1.x, it should continue to work in 1.y and 1.z. Changes in major versions (e.g., 1.x to 2.x) may not maintain full backwards compatibility. We may not always get it right, and there may be extenuating circumstances that force us into choosing between different kinds of breakage, but compatibility is very important to us. -In general, this is what we consider as "public API" of Bundler: +In general, this is what we consider as "public API": -* The `bundle` CLI. Flags and commands will never be removed without +* The `gem` and `bundle` CLIs. Flags and commands will never be removed without deprecation, but we may change the specific output of certain commands without notice, unless a `--parseable` or equivalent flag is given. Don't rely on - empty error output when checking success of Bundler commands, since progress + empty error output when checking success, since progress may be logged to stderr. Instead, check the exit status of the command. * The documented Gemfile DSL (both methods and their options). @@ -93,61 +74,34 @@ In general, this is what we consider as "public API" of Bundler: the same by default and instead provide explicit tools to upgrade existing lockfiles to new formats. -* Any documented methods in the Bundler namespace like - `Bundler.with_original_env`, and similar. +* Any documented methods in the RubyGems and Bundler namespaces, like + `Bundler.with_original_env` and similar. * Actual APIs meant to be used by other libraries, like the plugin API. -* Entrypoints different from the `bundle` CLI, like `bundler/setup` or +* Entrypoints different from the CLI, like `bundler/setup` or `bundler/inline`. We will never intentionally break any of the above in patch or minor releases. Internal classes and their methods (public or private) are not considered public -API, but we are aware that they are used in many places all around. So we try -not to break internal stuff that may be used by others, including proactively +API, but we are aware that they are used in many places. So we try +not to break internal functionality that may be used by others, including proactively using code search tools in public code. That said, we may not always be able to avoid breaking things, and we may even intentionally introduce this kind of "breakage" in a minor release if we deem it affects very few users or edge -cases. So be aware when using Bundler internals and ideally get in touch with us +cases. So be aware when using internals and ideally get in touch with us before doing so, so that we can help find the right APIs. -Bundler supports any MRI Ruby versions supported by the Ruby core team, as [listed here](https://www.ruby-lang.org/en/downloads/branches/). Shortly after Ruby core team officially drops support for a Ruby release, the Bundler team will do the same. Bundler also supports the latest stable versions of JRuby and TruffleRuby, and we constantly evaluate changes in Ruby implementation usage to potentially support more implementations. - -Bundler supports any RubyGems version [included by default](https://stdgems.org/rubygems/) with any supported Ruby version. - -The Bundler team ships features and bugfixes for the latest minor version of Bundler, and may exceptionally backport security fixes to older series shipped with Rubies that are officially supported. - -As of May, 2024, that means Bundler 2.5 is the only supported version, but the Bundler team may exceptionally backport security fixes to Bundler 2.4 (shipped with Ruby 3.2), and Bundler 2.3 (shipped with Ruby 3.1). - -These policies are not a guarantee that any particular fix will be backported. Instead, this is a way for us to set an upper limit on the versions of Ruby, RubyGems, and Bundler that we have to consider while making changes. Without the limit, the number of versions grows exponentially over time and quickly becomes overwhelming, which leads to maintainer burnout. We want to avoid that. - -## Issue guidelines - -Anyone is welcome to open an issue, or comment on an issue. Issue comments without useful content (like “me too”) may be removed. - -Opening an issue to ask for help may eventually get you help, but chances are help will arrive faster if you post on [Stack Overflow](https://stackoverflow.com) or ask in [the Bundler Slack](https://slack.bundler.io). - -Issues will be handled as soon as possible, which may take some time. Including a script that can be used to reproduce your issue is a great way to help maintainers help you. If you can, writing a failing test for your issue is even more helpful. - -## Contribution and pull request guidelines - -Anyone is welcome to [contribute to Bundler](README.md). Contributed code will be released under the same license as the existing codebase. - -Pull requests must have passing tests to be merged. Code changes must also include tests for the new behavior. Squashing commits is not required. - -Every pull request should explain: - -1. The problem being solved -2. Why that problem is happening -3. What changes to fix that problem are included in the PR, and -4. Why that implementation was chosen out of the possible options. - ## RFC guidelines Large changes often benefit from being written out more completely, read by others, and discussed. The [Bundler RFC repo](https://github.com/rubygems/rfcs) is the preferred place for that to happen. -## Maintainer team guidelines +## Committer Access + +Committers may lose their commit privileges if they are inactive for longer than 12 months. Committer permission may be restored upon request by having a pull request merged. + +This is designed to improve project maintainability by requiring committers to maintain familiarity with current development activity and to improve security by preventing idle committers from having their commit permissions compromised or exposed. Always create pull requests rather than pushing directly to the primary branch. Try to get code review and merge approval from someone other than yourself whenever possible. @@ -163,11 +117,9 @@ Policies are not set in stone, and may be revised if policy violations are found If you are comfortable reporting issues to the entire Bundler team, please send an email to team@bundler.io. If you are not comfortable reporting to the entire team, for any reason, please check the [maintainers team list](https://bundler.io/team) and use email, Twitter, or Slack to report to a single maintainer of your choice. Anyone violating a policy or goal is expected to cooperate with the team (and the reporter, if they request it) to resolve the issue in a way that follows the project goals. -# Team changes +## Team changes -This file documents how to add and remove team members. For the rules governing adding and removing team members, see [POLICIES](../POLICIES.md). - -## Adding a new team member +### Adding a new team member Interested in adding someone to the team? Here's the process. @@ -186,10 +138,9 @@ Interested in adding someone to the team? Here's the process. $ gem owner -a EMAIL bundler ``` +### Removing a team member -## Removing a team member - -When the conditions in [POLICIES](../POLICIES.md#maintainer-team-guidelines) are met, or when team members choose to retire, here's how to remove someone from the team. +When team members choose to retire, here's how to remove someone from the team. - Remove them from the owners list on RubyGems.org by running ``` @@ -200,6 +151,14 @@ When the conditions in [POLICIES](../POLICIES.md#maintainer-team-guidelines) are - Remove them from the [maintainers team][org_team] on GitHub - Remove them from the maintainers Slack channel +## Changing These Policies + +These policies were set in order to reduce the burden of maintenance and to keep +committers current with existing development and policies. RubyGems work is +primarily volunteer-driven which limits the ability to provide long-term +support. By joining [Ruby Central](https://rubycentral.org/#/portal/signup) you +can help extend support for older RubyGems versions. + [org_team]: https://github.com/orgs/rubygems/teams/maintainers/members [team]: https://bundler.io/contributors.html [maintainers]: https://github.com/rubygems/bundler-site/blob/f00eb65da0697c2cb0e7b4d6e5ba47ecc1538eb2/source/contributors.html.haml#L25 From b0e7ac4d71db676ad68e0f6931ee13b113a5939a Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 18:08:17 +0900 Subject: [PATCH 10/16] Added README.md for ToC --- doc/README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 doc/README.md diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 000000000000..b1eb98259d24 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,34 @@ +# Documentation + +Welcome to the RubyGems documentation! This directory contains various guides and documentation for contributors, maintainers, and users. + +## Table of Contents + +### Getting Started + +- [Getting Started](GETTING_STARTED.md) - Introduction and setup guide for new contributors +- [Troubleshooting](TROUBLESHOOTING.md) - Common issues and their solutions + +### Contributing + +See also the [CONTRIBUTING](../CONTRIBUTING.md) guide for general contribution guidelines. + +- [Pull Requests](PULL_REQUESTS.md) - Guidelines for submitting pull requests +- [Issue Triage](ISSUE_TRIAGE.md) - How to triage and manage issues +- [Documentation](DOCUMENTATION.md) - How to write and maintain documentation +- [Debugging](DEBUGGING.md) - Debugging tips and techniques + +### Project Management + +- [Policies](POLICIES.md) - Project policies, long-term support, and governance +- [Release](RELEASE.md) - Release process and procedures +- [Maintainers](MAINTAINERS.txt) - List of project maintainers + +### Development + +- [New Features](NEW_FEATURES.md) - Information about new features and changes +- [Upgrading](UPGRADING.md) - Upgrading guide for major version changes + +## Additional Resources + +For general information about the project, see the main [README](../README.md) at the root of the repository. From a2890857dcd04cb22320224d8b160293c359faee Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 18:10:10 +0900 Subject: [PATCH 11/16] Fixed missing links --- doc/DEBUGGING.md | 4 ++-- doc/GETTING_STARTED.md | 2 +- doc/ISSUE_TRIAGE.md | 2 +- doc/POLICIES.md | 4 ++-- doc/PULL_REQUESTS.md | 3 ++- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/doc/DEBUGGING.md b/doc/DEBUGGING.md index 5355205acf64..8d4c58128ae6 100644 --- a/doc/DEBUGGING.md +++ b/doc/DEBUGGING.md @@ -2,7 +2,7 @@ Debugging Bundler can be challenging, don't be discouraged 🤗. -Make sure you've followed the [development setup](SETUP.md) docs before trying to debug. +Make sure you've followed the [development setup](GETTING_STARTED.md) docs before trying to debug. ## Print debugging @@ -50,7 +50,7 @@ RUBYOPT=-rpry-byebug dbundle # for pry-byebug ### Local setup -The easiest way to test locally is to set up a directory with a Gemfile and run your Bundler shell alias (see the [development setup](SETUP.md) docs for instructions on setting up the alias). +The easiest way to test locally is to set up a directory with a Gemfile and run your Bundler shell alias (see the [development setup](GETTING_STARTED.md) docs for instructions on setting up the alias). We recommend putting this directory inside of `tmp` so that your local tests don't accidentally get committed. diff --git a/doc/GETTING_STARTED.md b/doc/GETTING_STARTED.md index 19987db63418..7bd492166a82 100644 --- a/doc/GETTING_STARTED.md +++ b/doc/GETTING_STARTED.md @@ -117,4 +117,4 @@ See [Git commit signing documentation](https://git-scm.com/book/en/v2/Git-Tools- ### Debugging -See [DEBUGGING.md](../bundler/development/DEBUGGING.md) for debugging tips and techniques. +See [DEBUGGING.md](DEBUGGING.md) for debugging tips and techniques. diff --git a/doc/ISSUE_TRIAGE.md b/doc/ISSUE_TRIAGE.md index 4091b00e488f..e440c4e7eb3d 100644 --- a/doc/ISSUE_TRIAGE.md +++ b/doc/ISSUE_TRIAGE.md @@ -36,7 +36,7 @@ When examining a ticket, consider these key questions: Once you've reproduced and understand an issue, you can help fix it: 1. **Discuss on the issue**: Coordinate with others to avoid duplicate work and gather feedback. -2. **Follow the pull request guide**: See [PULL_REQUESTS.md](development/PULL_REQUESTS.md). +2. **Follow the pull request guide**: See [PULL_REQUESTS.md](PULL_REQUESTS.md). 3. **Write tests**: Commit changes with tests on a named branch in your fork. 4. **Submit a pull request**: See [about pull requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests). diff --git a/doc/POLICIES.md b/doc/POLICIES.md index 7d0bb3e94639..fecc3afbae1e 100644 --- a/doc/POLICIES.md +++ b/doc/POLICIES.md @@ -26,7 +26,7 @@ approved by a project committer other than the author. To approve a PR, a maintainer can use GitHubs PR review feature. After that, if the original author is happy to merge the PR, she can press the merge button. -Anyone is welcome to [contribute to Bundler](README.md). Contributed code will be released under the same license as the existing codebase. +Anyone is welcome to [contribute](../CONTRIBUTING.md). Contributed code will be released under the same license as the existing codebase. Pull requests must have passing tests to be merged. Code changes must also include tests for the new behavior. Squashing commits is not required. @@ -126,7 +126,7 @@ Interested in adding someone to the team? Here's the process. 1. An existing team member nominates a potential team member to the rest of the team. 2. The existing team reaches consensus about whether to invite the potential member. 3. The nominator asks the potential member if they would like to join the team. -4. The nominator also sends the candidate a link to [POLICIES](../POLICIES.md) as an orientation for being on the team. +4. The nominator also sends the candidate a link to [POLICIES](POLICIES.md) as an orientation for being on the team. 5. If the potential member accepts: - Invite them to the maintainers Slack channel - Add them to the [maintainers team][org_team] on GitHub diff --git a/doc/PULL_REQUESTS.md b/doc/PULL_REQUESTS.md index 02b8c30e9dd4..07d77b030618 100644 --- a/doc/PULL_REQUESTS.md +++ b/doc/PULL_REQUESTS.md @@ -34,7 +34,8 @@ Please ensure that the commit messages included in the pull request __do not__ h If you want to use these mechanisms, please instead include them in the pull request description. This prevents multiple notifications or references being created on commit rebases or pull request/branch force pushes. Additionally, do not use `[ci skip]` or `[skip ci]` mechanisms in your pull request titles/descriptions or commit messages. Every potential commit and pull request should run through Bundler's CI system. This applies to all changes/commits (ex. even a change to just documentation or the removal of a comment). -# Merging a PR + +## Merging a PR Bundler requires all CI status checks to pass before a PR can me merged. So make sure that's the case before merging. From 9f8807f6fe43f348a692e0b9921ca58cede9b24c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 18:20:14 +0900 Subject: [PATCH 12/16] Update the latest documentation structure --- bundler/README.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/bundler/README.md b/bundler/README.md index 2d634b59d300..ac2bf5319d34 100644 --- a/bundler/README.md +++ b/bundler/README.md @@ -27,23 +27,15 @@ bundle exec rspec See [bundler.io](https://bundler.io) for the full documentation. -## Troubleshooting +## Getting help -For help with common problems, see [TROUBLESHOOTING](../doc/bundler/TROUBLESHOOTING.md). +For help with common problems, see [TROUBLESHOOTING](../doc/TROUBLESHOOTING.md). Still stuck? Try [filing an issue](https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md). -## Other questions - -To see what has changed in recent versions of Bundler, see the [CHANGELOG](CHANGELOG.md). - -To get in touch with the Bundler core team and other Bundler users, please join [the Bundler slack](https://join.slack.com/t/bundler/shared_invite/zt-1rrsuuv3m-OmXKWQf8K6iSla4~F1DBjQ). - ## Contributing -If you'd like to contribute to Bundler, that's awesome, and we <3 you. We've put together [the Bundler contributor guide](https://github.com/ruby/rubygems/blob/master/doc/bundler/contributing/README.md) with all of the information you need to get started. - -If you'd like to request a substantial change to Bundler or its documentation, refer to the [Bundler RFC process](https://github.com/rubygems/rfcs) for more information. +If you'd like to contribute to Bundler, that's awesome, and we <3 you. We've put together [contributor guide](https://github.com/ruby/rubygems/blob/master/CONTRIBUTING.md) with all of the information you need to get started. ## Supporting From 491aee4d48918cabdf2d19d8f0165849ffd842ba Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Tue, 6 Jan 2026 18:23:53 +0900 Subject: [PATCH 13/16] Removed unused image file --- doc/windows-terminal.png | Bin 131802 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/windows-terminal.png diff --git a/doc/windows-terminal.png b/doc/windows-terminal.png deleted file mode 100644 index 8a5c0c41d29c64c86edf2f3cf2a9d08520949008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131802 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 L&zAmt_1^ygH4qj- From 7e2fd476c3e1aea5ab5694d0fa70da927fb84ea1 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA <hsbt@ruby-lang.org> Date: Tue, 6 Jan 2026 18:35:47 +0900 Subject: [PATCH 14/16] rake update_manifest --- Manifest.txt | 3 +-- Rakefile | 10 ++++------ rubygems-update.gemspec | 5 ++--- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Manifest.txt b/Manifest.txt index 6d7aeca638d2..1a12196bdb29 100644 --- a/Manifest.txt +++ b/Manifest.txt @@ -352,9 +352,8 @@ bundler/lib/bundler/vlad.rb bundler/lib/bundler/worker.rb bundler/lib/bundler/yaml_serializer.rb doc/MAINTAINERS.txt +doc/POLICIES.md doc/UPGRADING.md -doc/rubygems/CONTRIBUTING.md -doc/rubygems/POLICIES.md exe/gem exe/update_rubygems hide_lib_for_update/note.txt diff --git a/Rakefile b/Rakefile index d65d1fd50d67..2544c625ba6e 100644 --- a/Rakefile +++ b/Rakefile @@ -93,10 +93,9 @@ RDoc::Task.new rdoc: "docs", clobber_rdoc: "clobber_docs" do |doc| doc.title = "RubyGems #{v} API Documentation" rdoc_files = Rake::FileList.new %w[lib bundler/lib] - rdoc_files.add %w[CHANGELOG.md LICENSE.txt MIT.txt CODE_OF_CONDUCT.md doc/rubygems/CONTRIBUTING.md - doc/MAINTAINERS.txt Manifest.txt doc/rubygems/POLICIES.md README.md doc/UPGRADING.md bundler/CHANGELOG.md - doc/bundler/contributing/README.md bundler/LICENSE.md bundler/README.md - hide_lib_for_update/note.txt].map(&:freeze) + rdoc_files.add %w[CHANGELOG.md LICENSE.txt MIT.txt CODE_OF_CONDUCT.md CONTRIBUTING.md + doc/MAINTAINERS.txt Manifest.txt doc/POLICIES.md README.md doc/UPGRADING.md bundler/CHANGELOG.md + bundler/LICENSE.md bundler/README.md hide_lib_for_update/note.txt].map(&:freeze) doc.rdoc_files = rdoc_files @@ -485,8 +484,7 @@ module Rubygems %w[ doc/MAINTAINERS.txt doc/UPGRADING.md - doc/rubygems/CONTRIBUTING.md - doc/rubygems/POLICIES.md + doc/POLICIES.md ].each {|f| files << f } files.sort diff --git a/rubygems-update.gemspec b/rubygems-update.gemspec index dc779d27e708..da5809e6ed75 100644 --- a/rubygems-update.gemspec +++ b/rubygems-update.gemspec @@ -32,9 +32,8 @@ Gem::Specification.new do |s| s.extra_rdoc_files = [ "LICENSE.txt", "doc/MAINTAINERS.txt", "MIT.txt", "Manifest.txt", "README.md", - "doc/UPGRADING.md", "doc/rubygems/POLICIES.md", "CODE_OF_CONDUCT.md", - "doc/rubygems/CONTRIBUTING.md", - "bundler/LICENSE.md", "bundler/README.md", + "doc/UPGRADING.md", "doc/POLICIES.md", "CODE_OF_CONDUCT.md", + "CONTRIBUTING.md", "bundler/LICENSE.md", "bundler/README.md", "hide_lib_for_update/note.txt", *Dir["bundler/lib/bundler/man/*.1", base: __dir__] ] From a4344e00febee408ba057f691196bdf2a74cba6d Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA <hsbt@ruby-lang.org> Date: Tue, 6 Jan 2026 18:59:39 +0900 Subject: [PATCH 15/16] Fixed mdl error with Markdown formatting --- doc/DOCUMENTATION.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/doc/DOCUMENTATION.md b/doc/DOCUMENTATION.md index 6bfddf38b45b..9c1376dc994b 100644 --- a/doc/DOCUMENTATION.md +++ b/doc/DOCUMENTATION.md @@ -59,9 +59,7 @@ Additionally, this documentation should be readily available in a logical place Someday, we'd like to create deep-dive reference material about the inner workings of Bundler. However, while this is part of our overall vision, it is not the focus of our current work. -# Writing Documentation - -## RubyGems Documentation +## Writing RubyGems Documentation ### Contributing to RubyGems guides @@ -74,7 +72,7 @@ To contribute to RubyGems documentation: See the [RubyGems Guides repository](https://github.com/rubygems/guides) for detailed contribution instructions. -## Bundler Documentation +## Writing Bundler Documentation ### Writing docs for man pages From 924038ee93af0e42fe863e2af49c88c88509b693 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA <hsbt@ruby-lang.org> Date: Tue, 6 Jan 2026 20:05:22 +0900 Subject: [PATCH 16/16] Applied Copilot suggestion Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- CONTRIBUTING.md | 8 ++++---- doc/GETTING_STARTED.md | 30 ++++++++++++++++-------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2d26ccf798b6..a5264a6c744d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # How to Contribute -Thank you for your interest in contributing to the ruby/rubygems! Community involvement is essential to both RubyGems and Bundler. We welcome contributions from everyone, and we want to keep it as easy as possible to contribute changes. +Thank you for your interest in contributing to RubyGems and Bundler! Community involvement is essential to both RubyGems and Bundler. We welcome contributions from everyone, and we want to keep it as easy as possible to contribute changes. ## Code of Conduct @@ -41,17 +41,17 @@ For more information on contributing to the RubyGems ecosystem, see [guides.ruby We track [good first issues](https://github.com/ruby/rubygems/issues?q=is%3Aissue+is%3Aopen+label%3Abundler+label%3A%22good+first+issue%22) to help new contributors get started. Here are some great ways to begin: - **Test prerelease versions**: Run `gem install bundler --pre` and report any issues -- **Report bugs or suggest features**: [Open an issue](https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md) (see [new features documentation](bundler/development/NEW_FEATURES.md)) +- **Report bugs or suggest features**: [Open an issue](https://github.com/ruby/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md) (see [new features documentation](doc/NEW_FEATURES.md)) - **Improve documentation**: Contribute to the [Bundler website](https://bundler.io) or [man pages](https://bundler.io/man/bundle.1.html) - **Triage issues**: [Check issue completeness](doc/ISSUE_TRIAGE.md) and help close incomplete reports - **Write tests**: Add failing tests for [reported bugs](https://github.com/ruby/rubygems/issues) or backfill missing test coverage - **Review pull requests**: Provide feedback on [pull requests](https://github.com/ruby/rubygems/pulls) - **Improve code**: No patch is too small—fix typos, improve code clarity, or clean up whitespace -- **Contribute features**: See [adding new features](bundler/development/NEW_FEATURES.md) +- **Contribute features**: See [adding new features](doc/NEW_FEATURES.md) ## Pull Request Guidelines -See [bundler/development/PULL_REQUESTS.md](bundler/development/PULL_REQUESTS.md) for detailed guidelines. +See [doc/PULL_REQUESTS.md](doc/PULL_REQUESTS.md) for detailed guidelines. ## Community and Support diff --git a/doc/GETTING_STARTED.md b/doc/GETTING_STARTED.md index 7bd492166a82..88d994cd7366 100644 --- a/doc/GETTING_STARTED.md +++ b/doc/GETTING_STARTED.md @@ -1,6 +1,6 @@ -## Getting Started +# Getting Started -### Prerequisites and Setup +## Prerequisites and Setup [Fork the ruby/rubygems repo](https://github.com/ruby/rubygems) and clone the fork onto your machine. ([Follow this tutorial](https://help.github.com/articles/fork-a-repo/) for instructions on forking a repo.) @@ -19,23 +19,23 @@ Install development dependencies from the repository root directory: > location with something like `export GEM_HOME=/tmp/rubygems.gems` and try > again. -### Testing Your Local Changes +## Testing Your Local Changes -#### RubyGems Commands +### RubyGems Commands To run RubyGems commands like `gem install` from your local copy: ruby -Ilib exe/gem install -#### Bundler Commands +### Bundler Commands To run Bundler commands like `bundle install` from your local copy: bundler/bin/bundle install -### Running Tests +## Running Tests -#### RubyGems Tests +### RubyGems Tests To run the entire RubyGems test suite: @@ -49,7 +49,7 @@ To run a specific test method named `test_default`: ruby -Ilib:test:bundler/lib test/rubygems/test_deprecate.rb -n /test_default/ -#### Bundler Tests +### Bundler Tests To run the entire Bundler test suite in parallel from the `bundler/` directory: @@ -63,7 +63,7 @@ To run an individual Bundler test file, for example `spec/install/gems/standalon bin/rspec spec/install/gems/standalone_spec.rb -### Developing Bundler and RubyGems Together +## Developing Bundler and RubyGems Together When developing Bundler features or bug fixes that require changes in RubyGems, you can set the `RGV` environment variable to point to the repository root so Bundler's test suite picks up those changes: @@ -75,7 +75,7 @@ You can also test against specific RubyGems versions: It's recommended to set this variable permanently using [direnv](https://direnv.net) for consistent development. -### Code Style and Quality +## Code Style and Quality Check code style compliance: @@ -85,17 +85,19 @@ Optionally configure git hooks to check this before every commit: bin/rake git_hooks -### Shell Aliases (Optional) +## Shell Aliases (Optional) Set up a shell alias to run Bundler from your clone for convenience. -**Bash:** +### Bash + +Add this to your `~/.bashrc` or `~/.bash_profile`: alias dbundle='ruby /[repo root]/bundler/bin/bundle' See [this tutorial](https://www.moncefbelyamani.com/create-aliases-in-bash-profile-to-assign-shortcuts-for-common-terminal-commands/) for adding aliases to your `~/.bashrc` profile. -**Windows (PowerShell):** +### Windows (PowerShell) Add this to your [PowerShell profile](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4) (use `vim $profile` on the command line if you have `vim` installed): @@ -109,7 +111,7 @@ function dbundle For a better command line experience on Windows, consider using [Windows Terminal](https://github.com/microsoft/terminal). -### Git Commits +## Git Commits Please sign your commits. Although not required to contribute, it ensures that code you submit wasn't altered during transfer and proves it came from you.