blob: 6156333a6539630187da863085bf6b67ef1d6c44 [file] [log] [blame] [view]
Mike Frysingerb8f7bb02018-10-10 01:05:11 -04001# repo Manifest Format
Shawn O. Pearce3e548192008-11-04 11:19:36 -08002
3A repo manifest describes the structure of a repo client; that is
4the directories that are visible and where they should be obtained
5from with git.
6
7The basic structure of a manifest is a bare Git repository holding
Mike Frysinger3891b752018-10-05 19:26:15 -04008a single `default.xml` XML file in the top level directory.
Shawn O. Pearce3e548192008-11-04 11:19:36 -08009
10Manifests are inherently version controlled, since they are kept
11within a Git repository. Updates to manifests are automatically
12obtained by clients during `repo sync`.
13
Mike Frysinger3891b752018-10-05 19:26:15 -040014[TOC]
15
Shawn O. Pearce3e548192008-11-04 11:19:36 -080016
Mike Frysingerb8f7bb02018-10-10 01:05:11 -040017## XML File Format
Shawn O. Pearce3e548192008-11-04 11:19:36 -080018
Mike Frysinger3891b752018-10-05 19:26:15 -040019A manifest XML file (e.g. `default.xml`) roughly conforms to the
Shawn O. Pearce3e548192008-11-04 11:19:36 -080020following DTD:
21
Mike Frysinger3891b752018-10-05 19:26:15 -040022```xml
23
24
25 remote*,
26 default?,
27 manifest-server?,
28 remove-project*,
29 project*,
30 extend-project*,
31 repo-hooks?,
Raman Tenneti1bb4fb22021-01-07 16:50:45 -080032 superproject?,
Mike Frysinger3891b752018-10-05 19:26:15 -040033 include*)>
Chirayu Desaid5a5b192013-11-21 19:15:30 +053034
Mike Frysinger3891b752018-10-05 19:26:15 -040035
Chirayu Desaid5a5b192013-11-21 19:15:30 +053036
Mike Frysinger3891b752018-10-05 19:26:15 -040037
38
39
40
41
42
43
Chirayu Desaid5a5b192013-11-21 19:15:30 +053044
Mike Frysinger3891b752018-10-05 19:26:15 -040045
46
47
48
49
50
51
52
53
Nico Sallembiena1bfd2c2010-04-06 10:40:01 -070054
Mike Frysinger3891b752018-10-05 19:26:15 -040055
56
Chirayu Desaid5a5b192013-11-21 19:15:30 +053057
Mike Frysinger3891b752018-10-05 19:26:15 -040058
59 project*,
60 copyfile*,
61 linkfile*)>
62
63
64
65
66
67
68
69
Kyunam Jo01019d92019-03-18 13:30:58 +090070
Mike Frysinger3891b752018-10-05 19:26:15 -040071
72
73
James W. Mills24c13082012-04-12 15:04:13 -050074
Mike Frysinger3891b752018-10-05 19:26:15 -040075
76
77
78
Chirayu Desaid5a5b192013-11-21 19:15:30 +053079
Mike Frysinger3891b752018-10-05 19:26:15 -040080
81
82
Ruslan Bilovol54527e72015-09-08 13:11:23 +030083
Mike Frysinger3891b752018-10-05 19:26:15 -040084
85
86
Ruslan Bilovol54527e72015-09-08 13:11:23 +030087
Mike Frysinger3891b752018-10-05 19:26:15 -040088
89
90
91
92
Kyunam Jobd0aae92020-02-04 11:38:53 +090093
Josh Triplett884a3872014-06-12 14:57:29 -070094
Mike Frysinger3891b752018-10-05 19:26:15 -040095
96
Doug Anderson37282b42011-03-04 11:54:18 -080097
Mike Frysinger3891b752018-10-05 19:26:15 -040098
99
100
Brian Harring26448742011-04-28 05:04:41 -0700101
Raman Tenneti1bb4fb22021-01-07 16:50:45 -0800102
103
104
105
Mike Frysinger3891b752018-10-05 19:26:15 -0400106
Fredrik de Groot352c93b2020-10-06 12:55:14 +0200107
108
Mike Frysinger3891b752018-10-05 19:26:15 -0400109]>
110```
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800111
Raman Tenneti48b2d102021-01-11 12:18:47 -0800112For compatibility purposes across repo releases, all unknown elements are
113silently ignored. However, repo reserves all possible names for itself for
114future use. If you want to use custom elements, the `x-*` namespace is
115reserved for that purpose, and repo guarantees to never allocate any
116corresponding names.
117
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800118A description of the elements and their attributes follows.
119
120
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400121### Element manifest
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800122
123The root element of the file.
124
Mike Frysinger51e39d52020-12-04 05:32:06 -0500125### Element notice
126
127Arbitrary text that is displayed to users whenever `repo sync` finishes.
128The content is simply passed through as it exists in the manifest.
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800129
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400130### Element remote
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800131
132One or more remote elements may be specified. Each remote element
133specifies a Git URL shared by one or more projects and (optionally)
134the Gerrit review server those projects upload changes through.
135
136Attribute `name`: A short name unique to this manifest file. The
137name specified here is used as the remote name in each project's
138.git/config, and is therefore automatically available to commands
139like `git fetch`, `git remote`, `git pull` and `git push`.
140
Yestin Sunb292b982012-07-02 07:32:50 -0700141Attribute `alias`: The alias, if specified, is used to override
142`name` to be set as the remote name in each project's .git/config.
143Its value can be duplicated while attribute `name` has to be unique
144in the manifest file. This helps each project to be able to have
145same remote name which actually points to different remote url.
146
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800147Attribute `fetch`: The Git URL prefix for all projects which use
148this remote. Each project's name is appended to this prefix to
149form the actual URL used to clone the project.
150
Steve Raed6480452016-08-10 15:00:00 -0700151Attribute `pushurl`: The Git "push" URL prefix for all projects
152which use this remote. Each project's name is appended to this
153prefix to form the actual URL used to "git push" the project.
154This attribute is optional; if not specified then "git push"
155will use the same URL as the `fetch` attribute.
156
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800157Attribute `review`: Hostname of the Gerrit server where reviews
158are uploaded to by `repo upload`. This attribute is optional;
159if not specified then `repo upload` will not function.
160
Mike Frysinger6e89c962020-11-15 18:42:26 -0500161Attribute `revision`: Name of a Git branch (e.g. `main` or
162`refs/heads/main`). Remotes with their own revision will override
Anthony King36ea2fb2014-05-06 11:54:01 +0100163the default revision.
164
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400165### Element default
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800166
167At most one default element may be specified. Its remote and
168revision attributes are used when a project element does not
169specify its own remote or revision attribute.
170
171Attribute `remote`: Name of a previously defined remote element.
172Project elements lacking a remote attribute of their own will use
173this remote.
174
Mike Frysinger6e89c962020-11-15 18:42:26 -0500175Attribute `revision`: Name of a Git branch (e.g. `main` or
176`refs/heads/main`). Project elements lacking their own
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800177revision attribute will use this revision.
178
Mike Frysinger6e89c962020-11-15 18:42:26 -0500179Attribute `dest-branch`: Name of a Git branch (e.g. `main`).
Bryan Jacobsf609f912013-05-06 13:36:24 -0400180Project elements not setting their own `dest-branch` will inherit
181this value. If this value is not set, projects will use `revision`
182by default instead.
183
Nasser Grainawida403412018-05-04 12:53:29 -0600184Attribute `upstream`: Name of the Git ref in which a sha1
185can be found. Used when syncing a revision locked manifest in
186-c mode to avoid having to sync the entire ref space. Project elements
187not setting their own `upstream` will inherit this value.
188
Mani Chandel7a91d512014-07-24 16:27:08 +0530189Attribute `sync-j`: Number of parallel jobs to use when synching.
David Pursehouse4e465202012-11-27 22:20:10 +0900190
Mani Chandel7a91d512014-07-24 16:27:08 +0530191Attribute `sync-c`: Set to true to only sync the given Git
David Pursehouse4e465202012-11-27 22:20:10 +0900192branch (specified in the `revision` attribute) rather than the
Mani Chandel7a91d512014-07-24 16:27:08 +0530193whole ref space. Project elements lacking a sync-c element of
David Pursehouse4e465202012-11-27 22:20:10 +0900194their own will use this value.
195
Mani Chandel7a91d512014-07-24 16:27:08 +0530196Attribute `sync-s`: Set to true to also sync sub-projects.
David Pursehouse4e465202012-11-27 22:20:10 +0900197
YOUNG HO CHAa32c92c2018-02-14 16:57:31 +0900198Attribute `sync-tags`: Set to false to only sync the given Git
199branch (specified in the `revision` attribute) rather than
200the other ref tags.
201
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800202
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400203### Element manifest-server
Nico Sallembiena1bfd2c2010-04-06 10:40:01 -0700204
205At most one manifest-server may be specified. The url attribute
206is used to specify the URL of a manifest server, which is an
David Pursehouse9a27d012012-08-21 14:23:49 +0900207XML RPC service.
Nico Sallembiena1bfd2c2010-04-06 10:40:01 -0700208
David Pursehouse9a27d012012-08-21 14:23:49 +0900209The manifest server should implement the following RPC methods:
Nico Sallembiena1bfd2c2010-04-06 10:40:01 -0700210
Mike Frysinger3891b752018-10-05 19:26:15 -0400211 GetApprovedManifest(branch, target)
Nico Sallembiena1bfd2c2010-04-06 10:40:01 -0700212
David Pursehouse9a27d012012-08-21 14:23:49 +0900213Return a manifest in which each project is pegged to a known good revision
David Pursehousee8688412016-04-13 17:55:34 +0900214for the current branch and target. This is used by repo sync when the
215--smart-sync option is given.
David Pursehouse9a27d012012-08-21 14:23:49 +0900216
Nico Sallembiena1bfd2c2010-04-06 10:40:01 -0700217The target to use is defined by environment variables TARGET_PRODUCT
218and TARGET_BUILD_VARIANT. These variables are used to create a string
219of the form $TARGET_PRODUCT-$TARGET_BUILD_VARIANT, e.g. passion-userdebug.
220If one of those variables or both are not present, the program will call
David Pursehousedaa851f2012-08-21 13:52:18 +0900221GetApprovedManifest without the target parameter and the manifest server
Nico Sallembiena1bfd2c2010-04-06 10:40:01 -0700222should choose a reasonable default target.
223
Mike Frysinger3891b752018-10-05 19:26:15 -0400224 GetManifest(tag)
David Pursehouse9a27d012012-08-21 14:23:49 +0900225
226Return a manifest in which each project is pegged to the revision at
David Pursehousee8688412016-04-13 17:55:34 +0900227the specified tag. This is used by repo sync when the --smart-tag option
228is given.
David Pursehouse9a27d012012-08-21 14:23:49 +0900229
Nico Sallembiena1bfd2c2010-04-06 10:40:01 -0700230
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400231### Element project
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800232
233One or more project elements may be specified. Each element
234describes a single Git repository to be cloned into the repo
Che-Liang Chioub2bd91c2012-01-11 11:28:42 +0800235client workspace. You may specify Git-submodules by creating a
236nested project. Git-submodules will be automatically
237recognized and inherit their parent's attributes, but those
238may be overridden by an explicitly specified project element.
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800239
240Attribute `name`: A unique name for this project. The project's
241name is appended onto its remote's fetch URL to generate the actual
242URL to configure the Git remote with. The URL gets formed as:
243
Mike Frysinger3891b752018-10-05 19:26:15 -0400244 ${remote_fetch}/${project_name}.git
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800245
246where ${remote_fetch} is the remote's fetch attribute and
247${project_name} is the project's name attribute. The suffix ".git"
David Pursehousedaa851f2012-08-21 13:52:18 +0900248is always appended as repo assumes the upstream is a forest of
Che-Liang Chioub2bd91c2012-01-11 11:28:42 +0800249bare Git repositories. If the project has a parent element, its
250name will be prefixed by the parent's.
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800251
252The project name must match the name Gerrit knows, if Gerrit is
253being used for code reviews.
254
255Attribute `path`: An optional path relative to the top directory
256of the repo client where the Git working directory for this project
257should be placed. If not supplied the project name is used.
Che-Liang Chioub2bd91c2012-01-11 11:28:42 +0800258If the project has a parent element, its path will be prefixed
259by the parent's.
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800260
261Attribute `remote`: Name of a previously defined remote element.
262If not supplied the remote given by the default element is used.
263
264Attribute `revision`: Name of the Git branch the manifest wants
265to track for this project. Names can be relative to refs/heads
Mike Frysinger6e89c962020-11-15 18:42:26 -0500266(e.g. just "main") or absolute (e.g. "refs/heads/main").
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800267Tags and/or explicit SHA-1s should work in theory, but have not
268been extensively tested. If not supplied the revision given by
Anthony King36ea2fb2014-05-06 11:54:01 +0100269the remote element is used if applicable, else the default
270element is used.
Shawn O. Pearce3e548192008-11-04 11:19:36 -0800271
Mike Frysinger6e89c962020-11-15 18:42:26 -0500272Attribute `dest-branch`: Name of a Git branch (e.g. `main`).
Bryan Jacobsf609f912013-05-06 13:36:24 -0400273When using `repo upload`, changes will be submitted for code
274review on this branch. If unspecified both here and in the
275default element, `revision` is used instead.
276
Colin Cross5acde752012-03-28 20:15:45 -0700277Attribute `groups`: List of groups to which this project belongs,
Conley Owens971de8e2012-04-16 10:36:08 -0700278whitespace or comma separated. All projects belong to the group
Conley Owensbb1b5f52012-08-13 13:11:18 -0700279"all", and each project automatically belongs to a group of
280its name:`name` and path:`path`. E.g. for
Jashank Jeremy97477472020-12-12 20:50:22 +1100281``, that project
Brian Harring7da13142012-06-15 02:24:20 -0700282definition is implicitly in the following manifest groups:
Conley Owensbb1b5f52012-08-13 13:11:18 -0700283default, name:monkeys, and path:barrel-of. If you place a project in the
284group "notdefault", it will not be automatically downloaded by repo.
Che-Liang Chioub2bd91c2012-01-11 11:28:42 +0800285If the project has a parent element, the `name` and `path` here
286are the prefixed ones.
Colin Cross5acde752012-03-28 20:15:45 -0700287
Mani Chandel7a91d512014-07-24 16:27:08 +0530288Attribute `sync-c`: Set to true to only sync the given Git
David Pursehouse4e465202012-11-27 22:20:10 +0900289branch (specified in the `revision` attribute) rather than the
290whole ref space.
291
Mani Chandel7a91d512014-07-24 16:27:08 +0530292Attribute `sync-s`: Set to true to also sync sub-projects.
David Pursehouse4e465202012-11-27 22:20:10 +0900293
Nasser Grainawi909d58b2014-09-19 12:13:04 -0600294Attribute `upstream`: Name of the Git ref in which a sha1
David Pursehouse4e465202012-11-27 22:20:10 +0900295can be found. Used when syncing a revision locked manifest in
296-c mode to avoid having to sync the entire ref space.
297
David Pursehouseede7f122012-11-27 22:25:30 +0900298Attribute `clone-depth`: Set the depth to use when fetching this
299project. If specified, this value will override any value given
300to repo init with the --depth option on the command line.
301
Scott Fandb83b1b2013-02-28 09:34:14 +0800302Attribute `force-path`: Set to true to force this project to create the
303local mirror repository according to its `path` attribute (if supplied)
304rather than the `name` attribute. This attribute only applies to the
305local mirrors syncing, it will be ignored when syncing the projects in a
306client working directory.
307
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400308### Element extend-project
Josh Triplett884a3872014-06-12 14:57:29 -0700309
310Modify the attributes of the named project.
311
312This element is mostly useful in a local manifest file, to modify the
313attributes of an existing project without completely replacing the
314existing project definition. This makes the local manifest more robust
315against changes to the original manifest.
316
317Attribute `path`: If specified, limit the change to projects checked out
318at the specified path, rather than all projects with the given name.
319
320Attribute `groups`: List of additional groups to which this project
321belongs. Same syntax as the corresponding element of `project`.
322
Luis Hector Chavez7d525852018-03-15 09:54:08 -0700323Attribute `revision`: If specified, overrides the revision of the original
324project. Same syntax as the corresponding element of `project`.
325
Kyunam Jobd0aae92020-02-04 11:38:53 +0900326Attribute `remote`: If specified, overrides the remote of the original
327project. Same syntax as the corresponding element of `project`.
328
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400329### Element annotation
James W. Mills24c13082012-04-12 15:04:13 -0500330
331Zero or more annotation elements may be specified as children of a
332project element. Each element describes a name-value pair that will be
333exported into each project's environment during a 'forall' command,
334prefixed with REPO__. In addition, there is an optional attribute
335"keep" which accepts the case insensitive values "true" (default) or
336"false". This attribute determines whether or not the annotation will
337be kept when exported with the manifest subcommand.
338
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400339### Element copyfile
Ruslan Bilovol54527e72015-09-08 13:11:23 +0300340
341Zero or more copyfile elements may be specified as children of a
342project element. Each element describes a src-dest pair of files;
Mike Frysinger3891b752018-10-05 19:26:15 -0400343the "src" file will be copied to the "dest" place during `repo sync`
Ruslan Bilovol54527e72015-09-08 13:11:23 +0300344command.
Mike Frysingerc5b172a2019-07-31 17:34:23 -0400345
Ruslan Bilovol54527e72015-09-08 13:11:23 +0300346"src" is project relative, "dest" is relative to the top of the tree.
Mike Frysingerc5b172a2019-07-31 17:34:23 -0400347Copying from paths outside of the project or to paths outside of the repo
348client is not allowed.
349
350"src" and "dest" must be files. Directories or symlinks are not allowed.
351Intermediate paths must not be symlinks either.
Ruslan Bilovol54527e72015-09-08 13:11:23 +0300352
Mike Frysinger50d27632019-08-01 18:57:10 -0400353Parent directories of "dest" will be automatically created if missing.
354
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400355### Element linkfile
Ruslan Bilovol54527e72015-09-08 13:11:23 +0300356
357It's just like copyfile and runs at the same time as copyfile but
358instead of copying it creates a symlink.
359
Mike Frysingerc5b172a2019-07-31 17:34:23 -0400360The symlink is created at "dest" (relative to the top of the tree) and
Mike Frysinger04122b72019-07-31 23:32:58 -0400361points to the path specified by "src" which is a path in the project.
Mike Frysingerc5b172a2019-07-31 17:34:23 -0400362
Mike Frysinger50d27632019-08-01 18:57:10 -0400363Parent directories of "dest" will be automatically created if missing.
364
Mike Frysingerc5b172a2019-07-31 17:34:23 -0400365The symlink target may be a file or directory, but it may not point outside
366of the repo client.
367
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400368### Element remove-project
Shawn O. Pearce03eaf072008-11-20 11:42:22 -0800369
370Deletes the named project from the internal manifest table, possibly
371allowing a subsequent project element in the same manifest file to
372replace the project with a different source.
373
David Pursehouseb1525bf2012-11-14 08:51:38 +0900374This element is mostly useful in a local manifest file, where
Shawn O. Pearce03eaf072008-11-20 11:42:22 -0800375the user can remove a project, and possibly replace it with their
376own definition.
377
Mike Frysinger51e39d52020-12-04 05:32:06 -0500378### Element repo-hooks
379
380NB: See the [practical documentation](./repo-hooks.md) for using repo hooks.
381
382Only one repo-hooks element may be specified at a time.
383Attempting to redefine it will fail to parse.
384
385Attribute `in-project`: The project where the hooks are defined. The value
386must match the `name` attribute (**not** the `path` attribute) of a previously
387defined `project` element.
388
389Attribute `enabled-list`: List of hooks to use, whitespace or comma separated.
390
Raman Tenneti1bb4fb22021-01-07 16:50:45 -0800391### Element superproject
392
393***
394 *Note*: This is currently a WIP.
395***
396
397NB: See the [git superprojects documentation](
398https://en.wikibooks.org/wiki/Git/Submodules_and_Superprojects) for background
399information.
400
401This element is used to specify the URL of the superproject. It has "name" and
402"remote" as atrributes. Only "name" is required while the others have
403reasonable defaults. At most one superproject may be specified.
404Attempting to redefine it will fail to parse.
405
406Attribute `name`: A unique name for the superproject. This attribute has the
407same meaning as project's name attribute. See the
408[element project](#element-project) for more information.
409
410Attribute `remote`: Name of a previously defined remote element.
411If not supplied the remote given by the default element is used.
412
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400413### Element include
Brian Harring26448742011-04-28 05:04:41 -0700414
415This element provides the capability of including another manifest
416file into the originating manifest. Normal rules apply for the
David Pursehouse9f3406e2012-11-14 08:52:25 +0900417target manifest to include - it must be a usable manifest on its own.
Brian Harring26448742011-04-28 05:04:41 -0700418
David Pursehouse9f3406e2012-11-14 08:52:25 +0900419Attribute `name`: the manifest to include, specified relative to
420the manifest repository's root.
Brian Harring26448742011-04-28 05:04:41 -0700421
Fredrik de Groot352c93b2020-10-06 12:55:14 +0200422Attribute `groups`: List of additional groups to which all projects
423in the included manifest belong. This appends and recurses, meaning
424all projects in sub-manifests carry all parent include groups.
425Same syntax as the corresponding element of `project`.
Shawn O. Pearce03eaf072008-11-20 11:42:22 -0800426
Mike Frysingerb8f7bb02018-10-10 01:05:11 -0400427## Local Manifests
Shawn O. Pearce70cd4ab2008-11-06 08:48:44 -0800428
David Pursehouse2d5a0df2012-11-13 02:50:36 +0900429Additional remotes and projects may be added through local manifest
430files stored in `$TOP_DIR/.repo/local_manifests/*.xml`.
Shawn O. Pearce70cd4ab2008-11-06 08:48:44 -0800431
432For example:
433
Mike Frysinger3891b752018-10-05 19:26:15 -0400434 $ ls .repo/local_manifests
435 local_manifest.xml
436 another_local_manifest.xml
David Pursehouse2d5a0df2012-11-13 02:50:36 +0900437
Mike Frysinger3891b752018-10-05 19:26:15 -0400438 $ cat .repo/local_manifests/local_manifest.xml
439
440
441
442 name="tools/manifest" />
443
444 name="platform/manifest" />
445
Shawn O. Pearce70cd4ab2008-11-06 08:48:44 -0800446
David Pursehouse2d5a0df2012-11-13 02:50:36 +0900447Users may add projects to the local manifest(s) prior to a `repo sync`
Shawn O. Pearce70cd4ab2008-11-06 08:48:44 -0800448invocation, instructing repo to automatically download and manage
449these extra projects.
David Pursehouse2d5a0df2012-11-13 02:50:36 +0900450
David Pursehouse52f1e5d2012-11-14 04:53:24 +0900451Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will
452be loaded in alphabetical order.
453
Mike Frysinger4e1fc102020-09-06 14:42:47 -0400454The legacy `$TOP_DIR/.repo/local_manifest.xml` path is no longer supported.