SUMMARY
=======

The SuperManifest plugin is for projects that use the 'repo' tool to piece
together a tree of git repositories. The repo tool reads an XML file that
describes the layout of the tree.

The file is usually called `default.xml`, and the repository is usually called
`manifest`.

Notable projects that use 'repo' include the Android Open Source Project.

The plugin will update a superproject to contain the submodules defined in the
manifest XML file whenever the manifest repo is changed.


CONFIGURATION
=============

It should be configured by adding `supermanifest.config` to the
`All-Projects` project. The format for configuration is as follows:


```
[superproject "submodules:refs/heads/nyc"]
   srcRepo = platforms/manifest
   srcRef = refs/heads/nyc
   srcPath = manifest.xml
   toolType = repo
```

this configures a repository called `submodules` to have a branch
`nyc`, for which the contents corresponds to the manifest file
`manifest.xml` on branch `refs/heads/nyc` in project `platforms/manifest`.

valid value(s) for `toolType` right now is `repo`. It can be left blank to
default to `repo`.

The plugin supports the following options:

*  `groups` (defaults to `default`). Sets the groups setting for JGit's
   RepoCommand

*  `recordSubmoduleLabels` (defaults to false). Sets recordSubmoduleLabels
   setting for JGit's RepoCommand

*  `ignoreRemoteFailures = true` (defaults to false). Sets ignoreRemoteFailures.
   Setting it true will cause repos that are not accessible to be ignored.


For the destination branch, you may also specify `refs/heads/*` to copy all
branches in the manifest repository. In this case the `srcRef` field is not
required (it will be ignored if present).

Branches that match the srcRef can still be skipped with the `exclude`
option. Its value is a comma-separated list of refs or ref patterns. Both of
them fully qualified (i.e. with the `refs/heads/` prefix). Note that git ref
patterns allow only one '*'.

```
[superproject "submodules:refs/heads/*"]
   srcRepo = platforms/manifest
   srcPath = manifest.xml
   exclude = refs/heads/ignoreme, refs/heads/*-release, refs/heads/auto-*
```

This plugin bypasses visibility restrictions, so edits to the manifest repo can
be used to reveal existence of hidden repositories or branches.


MANUAL TRIGGER
==============

Users that have the `administrateServer` permission may simulate an update to
the manifest repository. This is useful for debugging, and provides diagnostics
that are otherwise written into the server logs. To do so, issue the following
call

```sh
curl -X POST
  http://HOST/a/projects/platform%2Fmanifest/branches/master/update_manifest
```


JIRI
====

There is also support for the Jiri manifest file used in the Fuchsia OS.

```
[superproject "submodules:refs/heads/master"]
   srcRepo = platforms/manifest
   srcRef = refs/heads/master
   srcPath = manifest.xml
   toolType = jiri
```

TODO(anmittal): provide more documentation.
