# Contributor Tips

This is an opinionated guide documenting workflows that some members of the team
have found useful. It is focused on meta-tooling, not on IREE code specifically
(you will find the latter in the [Developer Overview](developer_overview.md)) It
is certainly possible to use workflows other than these, but some common tasks,
especially for maintainers will likely be made easier if you use these flows. It
assumes a basic knowledge of `git` and GitHub and suggests some specific ways of
using it.

## Git Structure

We tend to use the "triangular" or "forking" workflow. Develop primarily on a
clone of the repository on your development machine. Any local branches named
the same as persistent branches from the
[main repository](https://github.com/google/iree) (currently `main`, `google`,
and `stable`) are pristine (though potentially stale) copies. You only
fastforward these to match upstream and otherwise do development on other
branches. When sending PRs, you push to a different branch on your public fork
and create the PR from there.

### Setup

1.  Create a fork of the main repository.

2.  Create a local git repository with remotes `upstream` (the main repository)
    and `origin` (your personal fork). To list your current remotes `git remote
    -v`.

    a. If you already cloned from the main repository (e.g. by following the
    getting started guide):

    ```shell
    # From your existing git repo
    git remote rename origin upstream
    git remote add origin git@github.com:<github_username>/iree.git
    ```

    b. If you haven't already cloned:

    ```shell
    # From whatever directory under which you want to nest your repo
    git clone git@github.com:<github_username>/iree.git
    cd iree
    git remote add upstream git@github.com:google/iree.git
    ```

    This is especially important for maintainers who have write access (so can
    push directly to the main repository) and admins who have elevated
    privileges (so can push directly to protected branches). These names are
    just suggestions, but you might find some scripts where the defaults are for
    remotes named like this. For extra safety, you can make it difficult to push
    directly to upstream by setting the push url to something invalid: `git
    remote set-url --push upstream DISABLE`, which requires re-enabling the push
    URL explicitly before pushing.

3.  Use a script like
    [git_update.sh](https://github.com/google/iree/blob/main/scripts/git/git_update.sh)
    to easily synchronize `main` with `upstream`. Submodules make this is a
    little trickier than it should be. You can also add this as a git alias.

    ```shell
    git config alias.update "! /path/to/git-update"
    git config alias.sync "update main"
    ```

## Useful Tools

*   GitHub CLI (https://github.com/cli/cli). A CLI for interacting with GitHub.
    Most importantly, it allows scripting the creation of pull requests.
*   Refined GitHub Chrome and Firefox Extension:
    https://github.com/sindresorhus/refined-github. Nice extension that adds a
    bunch of features to the GitHub UI.
*   Squashed Merge Messages Chrome and Firefox Extension:
    https://github.com/zachwhaley/squashed-merge-message. Simple extension that
    implements the desired pattern for IREE squash-merge and merge-commit
    messages, copying the PR title and body.
*   VSCode: https://code.visualstudio.com/. The most commonly used IDE amongst
    IREE developers.
