# external_updater

external updater is a tool to automatically update libraries in external/.

## Usage

Check updates for a library or verify METADATA is valid:

```shell
tools/external_updater/updater.sh check ${LIBNAME}
```

Update a library, commit, and upload the change to Gerrit:

```shell
tools/external_updater/updater.sh update ${LIBNAME}
```

Update a library without committing and uploading to Gerrit:

```shell
tools/external_updater/updater.sh update --no-upload ${LIBNAME}
```

Update a library on top of the local changes in the current branch, commit, and upload the change to Gerrit:

```shell
tools/external_updater/updater.sh update --keep-local-changes ${LIBNAME}
```

Update a library without building:

```shell
tools/external_updater/updater.sh update --no-build ${LIBNAME}
```

LIBNAME can be the path to a library under external/, e.g. kotlinc, or
python/cpython3.

## Configure

To use this tool, a METADATA file must present at the root of the 
repository. The full definition can be found
[here](https://android.googlesource.com/platform/tools/external_updater/+/refs/heads/master/metadata.proto).
Or see example [here](https://android.googlesource.com/platform/external/ImageMagick/+/refs/heads/master/METADATA)

The most important part in the file is a list of urls.
`external_updater` will go through all urls and uses the first
supported url.

### Git upstream

If type of a URL is set to GIT, the URL must be a git upstream
(the one you can use with `git clone`). And the version field must
be either a version tag, or SHA. The tool will find the latest
version tag or sha based on it.

When upgrade, the tool will simply run `git merge tag/sha`.

IMPORTANT: It is suggested to set up a `upstream-master` branch to
replicate upstream. Because most users don't have the privilege to
upload changes not authored by themselves. This can be done by
filing a bug to componentid:99104.

#### SHA

If the version is a SHA, the tool will always try to upgrade to the
top of upstream. As long as there is any new change upstream, local
library will be treated as stale.

#### Version tag

If the version is not a SHA, the tool will try to parse the version
to get a numbered version. Currently the supported version format is:

```markdown
<prefix><version_number><suffix>
```

version_number part can be numbers separated by `.` or `-` or `_`.

If you have project where this isn't working, file a bug so we can take a look.

#### Local changes

It is suggested to verify all local changes when upgrading. This can
be done easily in Gerrit, by comparing parent2 and the patchset.


### GitHub archive

If the url type is ARCHIVE, and the url is from GitHub, `external_updater`
can upgrade a library based on GitHub releases.

If you have the choice between archives and git tags, choose tags.
Because that makes it easier to manage local changes.

The tool will query GitHub to get the latest release from:

```url
https://github.com/user/proj/releases/latest
```

If the tag of latest release is not equal to version in METADATA file, a
new version is found. The tool will download the tarball and overwrite the
library with it.

If there are multiple archives in one GitHub release, the one most
[similar](https://en.wikipedia.org/wiki/Edit_distance) to previous
(from METADATA) will be used.

After upgrade, files not present in the new tarball will be removed. But we
explicitly keep files famous in Android tree.
See [here](https://android.googlesource.com/platform/tools/external_updater/+/refs/heads/master/update_package.sh).

If more files need to be reserved, a post_update.sh can be created to copy
these files over.
See [example](https://android.googlesource.com/platform/external/kotlinc/+/refs/heads/master/post_update.sh).

#### Local patches

Local patches can be kept as patches/*.diff. They will be applied after
upgrade. [example](https://cs.android.com/android/platform/superproject/+/master:external/jsmn/patches/header.diff)

## Email notification

There is some support to automatically check updates for all external 
libraries every hour, send email and change. Currently this is done by 
running the following script on a desktop machine.

```shell
#!/bin/bash

cd /src/aosp
while true
do
        repo abandon tmp_auto_upgrade
        repo forall -c git checkout .
        repo forall -c git clean -xdf
        repo sync -c
        source build/envsetup.sh
        lunch aosp_arm-eng
        mmma tools/external_updater

        out/soong/host/linux-x86/bin/external_updater_notifier \
                --history ~/updater/history \
                --recipients=android_external_lib_updates@google.com \
                --generate_change \
                --all
        date
        echo "Sleeping..."
        sleep 3600
done
```
