# NNAPI Updating Instructions

## Quick Note

If you're just updating code within `platform2/nnapi`, skip down to
[Uprev the ebuild](#uprev-the-ebuild).

## Background

To fully update the NNAPI dependencies, the following repos need
to be addressed:

* `aosp/platform/frameworks/native`
* `aosp/platform/system/core/libcutils`
* `aosp/platform/system/core/libutils`
* `aosp/platform/system/libbase`
* `aosp/platform/system/libfmq`
* `aosp/platform/system/libhidl`
* `aosp/platform/system/logging`

Most of these can be updated by merging the `upstream` branch of the
repo into the `master` branch. There are however, two cases where this
does not apply.

### The Two Copybara Cases

The NNAPI package depends on some repo's that are copybara'd from another
repo.

Specifically, the following repos:

* `aosp/system/core/libcutils`
* `aosp/system/core/libutils`

Are updated by a copybara process from `aosp/platform/system/core`.

You can see the status of this process on the [Copybara dashboard](https://copybara.corp.google.com/list-jobs?piperConfigPath=%2F%2Fdepot%2Fgoogle3%2Fthird_party%2Fcopybara-gsubtreed%2Faosp%2Fcopy.bara.sky).

In short, whenever the `master` branch of `aosp/platform/system/core` is
updated, the copybara process will (at some point in the future), propagate
those changes into `aosp/system/core/libcutils` and
`aosp/system/core/libutils`.

This means that we can't directly control when the downstream repo
will get updated by the copybara process. It is possible that builds of
NNAPI will start failing if the infrastructure tries to uprev NNAPI to
use updated versions of `libcutils` and `libutils` that are possibly
incompatible.

Due avoid this, and ensure we have explicit control over which version of
these copybara'd directories is built, we have introduced
CROS_WORKON_MANUAL_UPREV to the NNAPI package which means we need to
manually update the commit and tree id's of the non-9999 ebuild.
This decouples the updating of `aosp/platform/system/core` from the NNAPI
package.

## Process

### Update the forked repositories

| Repo | Local Dir | Upstream Branch |
| ---- | --------- | --------------- |
| `aosp/platform/frameworks/native` | `aosp/frameworks/native` | `cros/upstream/master` |
| `aosp/platform/system/libbase`    | `aosp/system/libbase` | `cros/upstream/master` |
| `aosp/platform/system/libfmq`     | `aosp/system/libfmq` | `cros/upstream/master` |
| `aosp/platform/system/libhidl`    | `aosp/system/libhidl` | `cros/upstream/master` |
| `aosp/platform/system/logging`    | `aosp/system/logging` | `cros/upstream/master` |

Steps:

1.  Change into the repo local directory
1.  Create a merge branch from `master`
1.  Do a non-ff git merge from the upstream branch into `master`
1.  `repo upload` to gerrit and process the CL as normal
1.  At this stage you don't need to make any code changes due to
    CROS_WORKON_MANUAL_UPREV. The package won't use this updated
    code yet.

Example:

```bash
cd src/aosp/system/libbase
git checkout -b merge cros/master
# This will ask for an appropriate commit msg
git merge cros/upstream/master --no-ff
# This may give you a scary warning about the number of commits. Say 'y'.
repo upload --cbr . --no-verify
```

### Update the aosp/system/core repo

As described earlier, `aosp/system/core/libcutils` and
`aosp/system/core/libutils` are updated by merging upstream into the master
of `aosp/platform/system/core`. This is a bit more involved than the previous
cases, since this repo isn't mapped into the ChromeOS tree. It's quite
similar though...

Steps:

1.  Check out the core repo.
1.  Create a merge branch from `origin/master`.
1.  Do a non-ff git merge from `origin/upstream`.
1.  Upload to gerrit.
1.  Force submit / 'chump' the change since CQ won't process it.
1.  Within a few minutes, copybara should update `libcutils` and `libutils`.
1.  Check the [Copybara dashboard](https://copybara.corp.google.com/list-jobs?piperConfigPath=%2F%2Fdepot%2Fgoogle3%2Fthird_party%2Fcopybara-gsubtreed%2Faosp%2Fcopy.bara.sky).

```bash
cd /tmp
git clone https://chromium.googlesource.com/aosp/platform/system/core
# Set up the commit hooks
cd core
f=`git rev-parse --git-dir`/hooks/commit-msg
mkdir -p $(dirname $f)
curl -Lo $f https://gerrit-review.googlesource.com/tools/hooks/commit-msg
chmod +x $f
# Done setting up the repo
git checkout -b merge
git merge origin/upstream --no-ff
# This will ask for an appropriate commit msg
git commit
# This will upload to gerrit
git push origin HEAD:refs/for/master
```

### Uprev the ebuild

Once you have any code changes and dependencies submitted via CQ, do a
`repo sync` and you'll be able to uprev the ebuild. This is important, since
you will not be able to get the git commit id's you need until this is done.

There is a script in this directory, `get_git_ids.sh` that will print out the
two lines you need to replace.

Steps:

1.  Run `get_git_ids.sh`.
1.  Rename `nnapi-0.0.2-r<N>.ebuild` to `nnapi-0.0.2-r<N+1>.ebuild`.
1.  Replace CROS_WORKON_COMMIT and CROS_WORKON_TREE in that ebuild with the
    output of the `get_gid_ids.sh` script.
1.  Fix any build issues by creating ebuild patches (see the `files` dir).
1.  Upload to gerrit and review as normal.
