1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
|
.. _github-reviews:
======================
LLVM GitHub User Guide
======================
Introduction
============
The LLVM Project uses `GitHub <https://github.com/>`_ for
`Source Code <https://github.com/llvm/llvm-project>`_,
`Releases <https://github.com/llvm/llvm-project/releases>`_,
`Issue Tracking <https://github.com/llvm/llvm-project/issues>`_., and
`Code Reviews <https://github.com/llvm/llvm-project/pulls>`_.
This page describes how the LLVM Project users and developers can
participate in the project using GitHub.
Branches
========
It is possible to create branches that starts with `users/<username>/`, however this is
intended to be able to support "stacked" pull-request. Do not create any branches in the
llvm/llvm-project repository otherwise, please use a fork (see below). User branches that
aren't associated with a pull-request **will be deleted**.
Using Graphite for stacked Pull Requests
========================================
`Graphite <https://app.graphite.dev/>`_ is a stacked pull request tool supported
by the LLVM repo (the other being `reviewable.io <https://reviewable.io>`_).
Graphite will want to create branches under ``llvm/llvm-project`` rather than your
private fork, so the guidance above, about branch naming, is critical, otherwise
``gt submit`` (i.e. publish your PRs for review) will fail.
Use ``gt config`` then ``Branch naming settings`` and ``Set a prefix for branch names``.
Include the last ``/``.
If you didn't do the above and Graphite created non-prefixed branches, a simple way to
unblock is to rename (``git -m <old name> <new name>``), and then checkout the branch
and ``gt track``.
Pull Requests
=============
The LLVM project is using GitHub Pull Requests for Code Reviews. This document
describes the typical workflow of creating a Pull Request and getting it reviewed
and accepted. This is meant as an overview of the GitHub workflow, for complete
documentation refer to `GitHub's documentation <https://docs.github.com/pull-requests>`_.
.. note::
If you are using a Pull Request for purposes other than review
(eg: precommit CI results, convenient web-based reverts, etc)
add the `skip-precommit-approval <https://github.com/llvm/llvm-project/labels?q=skip-precommit-approval>`_
label to the PR.
GitHub Tools
------------
You can interact with GitHub in several ways: via git command line tools,
the web browser, `GitHub Desktop <https://desktop.github.com/>`_, or the
`GitHub CLI <https://cli.github.com>`_. This guide will cover the git command line
tools and the GitHub CLI. The GitHub CLI (`gh`) will be most like the `arc` workflow and
recommended.
Creating Pull Requests
----------------------
Keep in mind that when creating a pull request, it should generally only contain one
self-contained commit initially.
This makes it easier for reviewers to understand the introduced changes and
provide feedback. It also helps maintain a clear and organized commit history
for the project. If you have multiple changes you want to introduce, it's
recommended to create separate pull requests for each change.
Create a local branch per commit you want to submit and then push that branch
to your `fork <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks>`_
of the llvm-project and
`create a pull request from the fork <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork>`_.
As GitHub uses the first line of the commit message truncated to 72 characters
as the pull request title, you may have to edit to reword or to undo this
truncation.
Creating Pull Requests with GitHub CLI
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
With the CLI it's enough to create the branch locally and then run:
::
gh pr create
When prompted select to create and use your own fork and follow
the instructions to add more information needed.
.. note::
When you let the GitHub CLI create a fork of llvm-project to
your user, it will change the git "remotes" so that "origin" points
to your fork and "upstream" points to the main llvm-project repository.
Updating Pull Requests
----------------------
In order to update your pull request, the only thing you need to do is to push
your new commits to the branch in your fork. That will automatically update
the pull request.
When updating a pull request, you should push additional "fix up" commits to
your branch instead of force pushing. This makes it easier for GitHub to
track the context of previous review comments. Consider using the
`built-in support for fixups <https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupamendrewordltcommitgt>`_
in git.
If you do this, you must squash and merge before landing the PR and
you must use the pull request title and description as the commit message.
You can do this manually with an interactive git rebase or with GitHub's
built-in tool. See the section about landing your fix below.
When pushing to your branch, make sure you push to the correct fork. Check your
remotes with:
::
git remote -v
And make sure you push to the remote that's pointing to your fork.
Rebasing Pull Requests and Force Pushes
---------------------------------------
In general, you should avoid rebasing a Pull Request and force pushing to the
branch that's the root of the Pull Request during the review. This action will
make the context of the old changes and comments harder to find and read.
Sometimes, a rebase might be needed to update your branch with a fix for a test
or in some dependent code.
After your PR is reviewed and accepted, you want to rebase your branch to ensure
you won't encounter merge conflicts when landing the PR.
.. note::
This guide assumes that the PR branch only has 1 author. If you are
collaborating with others on a single branch, be careful how and when you push
changes. ``--force-with-lease`` may be useful in this situation.
Approvals
---------
Before merging a PR you must have the required approvals. See
:ref:`lgtm_how_a_patch_is_accepted` for more details.
Landing your change
-------------------
When your PR has been approved you can merge your changes.
If you do not have write permissions for the repository, the merge button in
GitHub's web interface will be disabled. If this is the case, continue following
the steps here but ask one of your reviewers to click the merge button on your
behalf.
If the PR is a single commit, all you need to do is click the merge button in
GitHub's web interface.
If your PR contains multiple commits, you need to consolidate those commits into
one commit. There are three different ways to do this, shown here with the most
commonly used first:
* Use the button `Squash and merge` in GitHub's web interface, if you do this
remember to review the commit message when prompted.
Afterwards you can select the option `Delete branch` to delete the branch
from your fork.
* `Interactive rebase <https://git-scm.com/docs/git-rebase#_interactive_mode>`_
with fixups. This is the recommended method since you can control the final
commit message and check that the final commit looks as you expect. When
your local state is correct, remember to force-push to your branch and press
the merge button in GitHub's web interface afterwards.
* Merge using the GitHub command line interface. Switch to your branch locally
and run:
::
gh pr merge --squash --delete-branch
If you observe an error message from the above informing you that your pull
request is not mergeable, then that is likely because upstream has been
modified since your pull request was authored in a way that now results in a
merge conflict. You must first resolve this merge conflict in order to merge
your pull request. In order to do that:
::
git fetch upstream
git rebase upstream/main
Then fix the source files causing merge conflicts and make sure to rebuild and
retest the result. Then:
::
git add <files with resolved merge conflicts>
git rebase --continue
Finally, you'll need to force push to your branch one more time before you can
merge:
::
git push --force
gh pr merge --squash --delete-branch
This force push may ask if you intend to push hundreds, or potentially
thousands of patches (depending on how long it's been since your pull request
was initially authored vs. when you intended to merge it). Since you're pushing
to a branch in your fork, this is ok and expected. Github's UI for the pull
request will understand that you're rebasing just your patches, and display
this result correctly with a note that a force push did occur.
Pre-merge Continuous Integration (CI)
-------------------------------------
Multiple checks will be applied on a pull-request, either for linting/formatting
or some build and tests. None of these are perfect and you will encounter
false positive, infrastructure failures (unstable or unavailable worker), or
you will be unlucky and based your change on a broken revision of the main branch.
None of the checks are strictly mandatory: these are tools to help us build a
better codebase and be more productive (by avoiding issues found post-merge and
possible reverts). As a developer you're empowered to exercise your judgement
about bypassing any of the checks when merging code.
The infrastructure can print messages that make it seem like these are mandatory,
but this is just an artifact of GitHub infrastructure and not a policy of the
project.
However, please make sure you do not force-merge any changes that have clear
test failures directly linked to your changes. Our policy is still to keep the
``main`` branch in a good condition, and introducing failures to be fixed later
violates that policy.
Problems After Landing Your Change
==================================
Even though your PR passed the pre-commit checks and is approved by reviewers, it
may cause problems for some configurations after it lands. You will be notified
if this happens and the community is ready to help you fix the problems.
This process is described in detail
:ref:`here <MyFirstTypoFix Issues After Landing Your PR>`.
Checking out another PR locally
-------------------------------
Sometimes you want to review another person's PR on your local machine to run
tests or inspect code in your preferred editor. This is easily done with the
CLI:
::
gh pr checkout <PR Number>
This is also possible with the web interface and the normal git command line
tools, but the process is a bit more complicated. See GitHub's
`documentation <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/checking-out-pull-requests-locally?platform=linux&tool=webui#modifying-an-inactive-pull-request-locally>`_
on the topic.
Example Pull Request with GitHub CLI
====================================
Here is an example for creating a Pull Request with the GitHub CLI:
::
# Clone the repo
gh repo clone llvm/llvm-project
# Switch to the repo and create a new branch
cd llvm-project
git switch -c my_change
# Create your changes
$EDITOR file.cpp
# Don't forget clang-format
git clang-format
# and don't forget running your tests
ninja check-llvm
# Commit, use a good commit message
git commit file.cpp
# Create the PR, select to use your own fork when prompted.
# If you don't have a fork, gh will create one for you.
gh pr create
# If you get any review comments, come back to the branch and
# adjust them.
git switch my_change
$EDITOR file.cpp
# Commit your changes
git commit file.cpp -m "Code Review adjustments"
# Format changes
git clang-format HEAD~
# Recommit if any formatting changes
git commit -a --amend
# Push your changes to your fork branch, be mindful of
# your remotes here, if you don't remember what points to your
# fork, use git remote -v to see. Usually origin points to your
# fork and upstream to llvm/llvm-project
git push origin my_change
Before merging the PR, it is recommended that you rebase locally and re-run test
checks:
::
# Add upstream as a remote (if you don't have it already)
git remote add upstream https://github.com/llvm/llvm-project.git
# Make sure you have all the latest changes
git fetch upstream && git rebase -i upstream/main
# Make sure tests pass with latest changes and your change
ninja check
# Push the rebased changes to your fork.
git push origin my_change --force
# Now merge it
gh pr merge --squash --delete-branch
See more in-depth information about how to contribute in the following documentation:
* :doc:`Contributing`
* :doc:`MyFirstTypoFix`
Example Pull Request with git
====================================
Instead of using the GitHub CLI to create a PR, you can push your code to a
remote branch on your fork and create the PR to upstream using the GitHub web
interface.
Here is an example of making a PR using git and the GitHub web interface:
First follow the instructions to [fork the repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo?tool=webui#forking-a-repository).
Next follow the instructions to [clone your forked repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo?tool=webui#cloning-your-forked-repository).
Once you've cloned your forked repository,
::
# Switch to the forked repo
cd llvm-project
# Create a new branch
git switch -c my_change
# Create your changes
$EDITOR file.cpp
# Don't forget clang-format
git clang-format
# and don't forget running your tests
ninja check-llvm
# Commit, use a good commit message
git commit file.cpp
# Push your changes to your fork branch, be mindful of
# your remotes here, if you don't remember what points to your
# fork, use git remote -v to see. Usually origin points to your
# fork and upstream to llvm/llvm-project
git push origin my_change
Navigate to the URL printed to the console from the git push command in the last step.
Create a pull request from your branch to llvm::main.
::
# If you get any review comments, come back to the branch and
# adjust them.
git switch my_change
$EDITOR file.cpp
# Commit your changes
git commit file.cpp -m "Code Review adjustments"
# Format changes
git clang-format HEAD~
# Recommit if any formatting changes
git commit -a --amend
# Re-run tests and make sure nothing broke.
ninja check
# Push your changes to your fork branch, be mindful of
# your remotes here, if you don't remember what points to your
# fork, use git remote -v to see. Usually origin points to your
# fork and upstream to llvm/llvm-project
git push origin my_change
Before merging the PR, it is recommended that you rebase locally and re-run test
checks:
::
# Add upstream as a remote (if you don't have it already)
git remote add upstream https://github.com/llvm/llvm-project.git
# Make sure you have all the latest changes
git fetch upstream && git rebase -i upstream/main
# Make sure tests pass with latest changes and your change
ninja check
# Push the rebased changes to your fork.
git push origin my_change --force
Once your PR is approved, rebased, and tests are passing, click `Squash and
Merge` on your PR in the GitHub web interface.
See more in-depth information about how to contribute in the following documentation:
* :doc:`Contributing`
* :doc:`MyFirstTypoFix`
Releases
========
Backporting Fixes to the Release Branches
-----------------------------------------
You can use special comments on issues or pull requests to make backport
requests for the release branches. This is done by making a comment containing
the following command on any issue or pull request that has been added to one
of the "X.Y.Z Release" milestones.
::
/cherry-pick <commit> <commit> <...>
This command takes one or more git commit hashes as arguments and will attempt
to cherry-pick the commit(s) to the release branch. If the commit(s) fail to
apply cleanly, then a comment with a link to the failing job will be added to
the issue/pull request. If the commit(s) do apply cleanly, then a pull request
will be created with the specified commits.
If a commit you want to backport does not apply cleanly, you may resolve
the conflicts locally and then create a pull request against the release
branch. Just make sure to add the release milestone to the pull request.
Getting admin access to CI infrastructure
=========================================
Any individual who is responsible for setting up and/or maintaining CI infrastructure for a LLVM project can
request to be granted the CI/CD role to the LLVM organization admins. The request can be made by creating
`a Github issue <https://github.com/llvm/llvm-project/issues/new>`_ and using the ``infrastructure`` label.
Applicants must include a justification for why the role is being requested. Applications are reviewed on a
case-by-case basis by the LLVM admins and the role can be revoked at any point as the LLVM admins see fit.
|