blob: d54dd656b04df7cc0967464eba4498b4af184ce4 [file] [log] [blame] [view]
# Using repo and Gerrit for the NDK
Android uses [repo](https://source.android.com/setup/develop#repo) for managing
the collections of individual git repositories needed by each "tree". See that
page for more information, including install instructions. You'll need to
install repo before you can work with Android repositories.
## Downloading the source
AOSP's [Downloading the source] explains how to initialize a new tree (similar
to `git clone`, but for a whole repo tree). For the NDK the main difference is
that you need to specify the master-ndk branch by adding `-b master-ndk`. See
[Building.md](Building.md) for more specific instructions.
Warning: Unlike `git clone`, `repo init` will **not** check out the source into
a new directory. If you run `repo init && repo sync` in your home directory you
will have a lot to clean up. If you run `repo init` in a tree that already has a
different repo tree in it, you'll reinitialize that tree with a different branch
and the next sync may delete existing projects.
`repo init` only prepares the tree, you'll still need to run `repo sync` to
fetch the source.
[Downloading the source]: https://source.android.com/setup/build/downloading
## Pulling updates
The `repo` equivalent of `git pull` is `repo sync`. It's recommended that you
run `repo sync -c -j $THREADS`. `-c` ensures that only the branches that are
needed are fetched to avoid consuming too much disk space, and `-j $THREADS`
allows repo to use multiple threads when updating.
## Making changes
`repo` trees place git projects in a detached HEAD state by default. To create a
local branch that can be sent for review, use `repo start $BRANCH_NAME .`. This
is similar to `git checkout -b` or `git switch -c`, but will configure the new
branch so that it can be uploaded for review.
Any time you start new work, use `repo start $BRANCH_NAME .`. Each local branch
is its own review chain, so you'll want separate branches for distinct changes.
## Committing changes
When you're ready to upload your changes, commit them to your local branch.
Gerrit will create one review per commit and will associate commits that are in
the same branch together in a series. If you made many commits while working on
the change, squash them (`repo rebase -i --autosquash .` will start an
interactive rebase that you can use to re-order and combine commits) so that
each commit is complete but minimal. Splitting large changes into multiple
commits improves reviewability, but each commit should be able to build and pass
tests on its own so it can be submitted individually.
In most cases you'll only need one commit in a branch.
## Uploading changes for review
To get changes reviewed, run `repo upload --cbr .`. This will upload the commits
in the current branch and directory. To upload changes in other directories,
pass those paths instead of `.`. Multiple paths can be given to upload multiple
projects with the same command.`--cbr` is "current branch". Without `--cbr` an
interactive mode will open in your editor that you can use to upload branches
other than the one that is currently checked out.
You can also add reviewers when uploading your changes with the
`--re=$USER1,$USER2,...` argument. If your reviewers are Googlers, Gerrit can
*usually* work out that `name` means `[email protected]`. In other cases you'll
need to spell out the full email address of the reviewer.
Once the change is uploaded, you can open it in Gerrit and enable autosubmit if
you want the change to be submitted once it has been reviewed and passed
presubmit testing. Don't worry, if anyone has review comments those will prevent
the change from being submitted before you can see them.
To minimize the amount of time you spend waiting on machines, it's best to vote
Presubmit Ready+1 on your change when you upload it to get treehugger running
ASAP. By default treehugger won't start testing a change until it has either
been +2'd or has autosubmit set.
If you have changes that span multiple git projects that need to be submitted
together (are mutually dependent), give them the same topic name in Gerrit. If
you used the same branch name when running `repo start` in each project, you can
pass `-t` to `repo upload` to automatically assign the branch name as the topic
name in Gerrit.
## Responding to review comments
To update your commit to address review comments, make the change and amend the
commit. If you have a stack of commits and need to amend something other than
the top commit, you can use the `--fixup` argument to `git commit` and then
rebase with `--autosquash`, or use the `edit` option on a commit after starting
an interactive rebase (`repo rebase -i --autosquash .`).
After amending your changes, run `repo upload` again as you did before. This
will create a new "patch set" (PS) for the existing review in Gerrit. This is a
new "version" of the commit. You do not need to specify reviewers again when
uploading new patch sets.
## Submitting
Once you have approval (Code Review +2) and either a +1 or a +2 from someone in
the OWNERS file (or are in the OWNERS file yourself), all review comments have
been addressed and marked as "Done", and presubmit (AKA "treehugger") has
responded with Presubmit Verified +1, your change can be submitted. If you
enabled autosubmit this will happen automatically. Otherwise use the "Submit"
button in the UI.
## Cheat sheet for GitHub users
The repo/Gerrit process has some differences compared to the GitHub Pull Request
workflow. If you're familiar with using pull requests you should read everything
above for the details, but here's a quick cheat sheet mapping similar processes:
GitHub | Gerrit
--- | ---
`git clone $X` | `mkdir $X && cd $X && repo init $X && repo sync`
`git pull` | `repo sync`
`git checkout -b`/`git switch -c` | `repo start .`
`git push` and other pull request steps | `repo upload`