summaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/internal-fs-layout.md263
-rw-r--r--docs/manifest-format.md161
-rw-r--r--docs/python-support.md4
-rw-r--r--docs/release-process.md194
-rw-r--r--docs/repo-hooks.md2
-rw-r--r--docs/windows.md33
6 files changed, 615 insertions, 42 deletions
diff --git a/docs/internal-fs-layout.md b/docs/internal-fs-layout.md
new file mode 100644
index 00000000..af6a4523
--- /dev/null
+++ b/docs/internal-fs-layout.md
@@ -0,0 +1,263 @@
1# Repo internal filesystem layout
2
3A reference to the `.repo/` tree in repo client checkouts.
4Hopefully it's complete & up-to-date, but who knows!
5
6*** note
7**Warning**:
8This is meant for developers of the repo project itself as a quick reference.
9**Nothing** in here must be construed as ABI, or that repo itself will never
10change its internals in backwards incompatible ways.
11***
12
13[TOC]
14
15## .repo/ layout
16
17All content under `.repo/` is managed by `repo` itself with few exceptions.
18
19In general, you should not make manual changes in here.
20If a setting was initialized using an option to `repo init`, you should use that
21command to change the setting later on.
22It is always safe to re-run `repo init` in existing repo client checkouts.
23For example, if you want to change the manifest branch, you can simply run
24`repo init --manifest-branch=<new name>` and repo will take care of the rest.
25
26* `config`: Per-repo client checkout settings using [git-config] file format.
27* `.repo_config.json`: JSON cache of the `config` file for repo to
28 read/process quickly.
29
30### repo/ state
31
32* `repo/`: A git checkout of the repo project. This is how `repo` re-execs
33 itself to get the latest released version.
34
35 It tracks the git repository at `REPO_URL` using the `REPO_REV` branch.
36 Those are specified at `repo init` time using the `--repo-url=<REPO_URL>`
37 and `--repo-rev=<REPO_REV>` options.
38
39 Any changes made to this directory will usually be automatically discarded
40 by repo itself when it checks for updates. If you want to update to the
41 latest version of repo, use `repo selfupdate` instead. If you want to
42 change the git URL/branch that this tracks, re-run `repo init` with the new
43 settings.
44
45* `.repo_fetchtimes.json`: Used by `repo sync` to record stats when syncing
46 the various projects.
47
48### Manifests
49
50For more documentation on the manifest format, including the local_manifests
51support, see the [manifest-format.md] file.
52
53* `manifests/`: A git checkout of the manifest project. Its `.git/` state
54 points to the `manifest.git` bare checkout (see below). It tracks the git
55 branch specified at `repo init` time via `--manifest-branch`.
56
57 The local branch name is always `default` regardless of the remote tracking
58 branch. Do not get confused if the remote branch is not `default`, or if
59 there is a remote `default` that is completely different!
60
61 No manual changes should be made in here as it will just confuse repo and
62 it won't automatically recover causing no new changes to be picked up.
63
64* `manifests.git/`: A bare checkout of the manifest project. It tracks the
65 git repository specified at `repo init` time via `--manifest-url`.
66
67 No manual changes should be made in here as it will just confuse repo.
68 If you want to switch the tracking settings, re-run `repo init` with the
69 new settings.
70
71* `manifest.xml`: The manifest that repo uses. It is generated at `repo init`
72 and uses the `--manifest-name` to determine what manifest file to load next
73 out of `manifests/`.
74
75 Do not try to modify this to load other manifests as it will confuse repo.
76 If you want to switch manifest files, re-run `repo init` with the new
77 setting.
78
79 Older versions of repo managed this with symlinks.
80
81* `manifest.xml -> manifests/<manifest-name>.xml`: A symlink to the manifest
82 that the user wishes to sync. It is specified at `repo init` time via
83 `--manifest-name`.
84
85
86* `manifests.git/.repo_config.json`: JSON cache of the `manifests.git/config`
87 file for repo to read/process quickly.
88
89* `local_manifest.xml` (*Deprecated*): User-authored tweaks to the manifest
90 used to sync. See [local manifests] for more details.
91* `local_manifests/`: Directory of user-authored manifest fragments to tweak
92 the manifest used to sync. See [local manifests] for more details.
93
94### Project objects
95
96*** note
97**Warning**: Please do not use repo's approach to projects/ & project-objects/
98layouts as a model for other tools to implement similar approaches.
99It has a number of known downsides like:
100* [Symlinks do not work well under Windows](./windows.md).
101* Git sometimes replaces symlinks under .git/ with real files (under unknown
102 circumstances), and then the internal state gets out of sync, and data loss
103 may ensue.
104* When sharing project-objects between multiple project checkouts, Git might
105 automatically run `gc` or `prune` which may lead to data loss or corruption
106 (since those operate on leaf projects and miss refs in other leaves). See
107 https://gerrit-review.googlesource.com/c/git-repo/+/254392 for more details.
108
109Instead, you should use standard Git workflows like [git worktree] or
110[gitsubmodules] with [superprojects].
111***
112
113* `copy-link-files.json`: Tracking file used by `repo sync` to determine when
114 copyfile or linkfile are added or removed and need corresponding updates.
115* `project.list`: Tracking file used by `repo sync` to determine when projects
116 are added or removed and need corresponding updates in the checkout.
117* `projects/`: Bare checkouts of every project synced by the manifest. The
118 filesystem layout matches the `<project path=...` setting in the manifest
119 (i.e. where it's checked out in the repo client source tree). Those
120 checkouts will symlink their `.git/` state to paths under here.
121
122 Some git state is further split out under `project-objects/`.
123* `project-objects/`: Git objects that are safe to share across multiple
124 git checkouts. The filesystem layout matches the `<project name=...`
125 setting in the manifest (i.e. the path on the remote server) with a `.git`
126 suffix. This allows for multiple checkouts of the same remote git repo to
127 share their objects. For example, you could have different branches of
128 `foo/bar.git` checked out to `foo/bar-main`, `foo/bar-release`, etc...
129 There will be multiple trees under `projects/` for each one, but only one
130 under `project-objects/`.
131
132 This layout is designed to allow people to sync against different remotes
133 (e.g. a local mirror & a public review server) while avoiding duplicating
134 the content. However, this can run into problems if different remotes use
135 the same path on their respective servers. Best to avoid that.
136* `subprojects/`: Like `projects/`, but for git submodules.
137* `subproject-objects/`: Like `project-objects/`, but for git submodules.
138* `worktrees/`: Bare checkouts of every project synced by the manifest. The
139 filesystem layout matches the `<project name=...` setting in the manifest
140 (i.e. the path on the remote server) with a `.git` suffix. This has the
141 same advantages as the `project-objects/` layout above.
142
143 This is used when [git worktree]'s are enabled.
144
145### Global settings
146
147The `.repo/manifests.git/config` file is used to track settings for the entire
148repo client checkout.
149
150Most settings use the `[repo]` section to avoid conflicts with git.
151
152Everything under `[repo.syncstate.*]` is used to keep track of sync details for logging
153purposes.
154
155User controlled settings are initialized when running `repo init`.
156
157| Setting | `repo init` Option | Use/Meaning |
158|------------------- |---------------------------|-------------|
159| manifest.groups | `--groups` & `--platform` | The manifest groups to sync |
160| manifest.standalone | `--standalone-manifest` | Download manifest as static file instead of creating checkout |
161| repo.archive | `--archive` | Use `git archive` for checkouts |
162| repo.clonebundle | `--clone-bundle` | Whether the initial sync used clone.bundle explicitly |
163| repo.clonefilter | `--clone-filter` | Filter setting when using [partial git clones] |
164| repo.depth | `--depth` | Create shallow checkouts when cloning |
165| repo.dissociate | `--dissociate` | Dissociate from any reference/mirrors after initial clone |
166| repo.mirror | `--mirror` | Checkout is a repo mirror |
167| repo.partialclone | `--partial-clone` | Create [partial git clones] |
168| repo.partialcloneexclude | `--partial-clone-exclude` | Comma-delimited list of project names (not paths) to exclude while using [partial git clones] |
169| repo.reference | `--reference` | Reference repo client checkout |
170| repo.submodules | `--submodules` | Sync git submodules |
171| repo.superproject | `--use-superproject` | Sync [superproject] |
172| repo.worktree | `--worktree` | Use [git worktree] for checkouts |
173| user.email | `--config-name` | User's e-mail address; Copied into `.git/config` when checking out a new project |
174| user.name | `--config-name` | User's name; Copied into `.git/config` when checking out a new project |
175
176[partial git clones]: https://git-scm.com/docs/gitrepository-layout#_code_partialclone_code
177[superproject]: https://en.wikibooks.org/wiki/Git/Submodules_and_Superprojects
178
179### Repo hooks settings
180
181For more details on this feature, see the [repo-hooks docs](./repo-hooks.md).
182We'll just discuss the internal configuration settings.
183These are stored in the registered `<repo-hooks>` project itself, so if the
184manifest switches to a different project, the settings will not be copied.
185
186| Setting | Use/Meaning |
187|--------------------------------------|-------------|
188| repo.hooks.\<hook\>.approvedmanifest | User approval for secure manifest sources (e.g. https://) |
189| repo.hooks.\<hook\>.approvedhash | User approval for insecure manifest sources (e.g. http://) |
190
191
192For example, if our manifest had the following entries, we would store settings
193under `.repo/projects/src/repohooks.git/config` (which would be reachable via
194`git --git-dir=src/repohooks/.git config`).
195```xml
196 <project path="src/repohooks" name="chromiumos/repohooks" ... />
197 <repo-hooks in-project="chromiumos/repohooks" ... />
198```
199
200If `<hook>` is `pre-upload`, the `.git/config` setting might be:
201```ini
202[repo "hooks.pre-upload"]
203 approvedmanifest = https://chromium.googlesource.com/chromiumos/manifest
204```
205
206## Per-project settings
207
208These settings are somewhat meant to be tweaked by the user on a per-project
209basis (e.g. `git config` in a checked out source repo).
210
211Where possible, we re-use standard git settings to avoid confusion, and we
212refrain from documenting those, so see [git-config] documentation instead.
213
214See `repo help upload` for documentation on `[review]` settings.
215
216The `[remote]` settings are automatically populated/updated from the manifest.
217
218The `[branch]` settings are updated by `repo start` and `git branch`.
219
220| Setting | Subcommands | Use/Meaning |
221|-------------------------------|---------------|-------------|
222| review.\<url\>.autocopy | upload | Automatically add to `--cc=<value>` |
223| review.\<url\>.autoreviewer | upload | Automatically add to `--reviewers=<value>` |
224| review.\<url\>.autoupload | upload | Automatically answer "yes" or "no" to all prompts |
225| review.\<url\>.uploadhashtags | upload | Automatically add to `--hashtag=<value>` |
226| review.\<url\>.uploadlabels | upload | Automatically add to `--label=<value>` |
227| review.\<url\>.uploadnotify | upload | [Notify setting][upload-notify] to use |
228| review.\<url\>.uploadtopic | upload | Default [topic] to use |
229| review.\<url\>.username | upload | Override username with `ssh://` review URIs |
230| remote.\<remote\>.fetch | sync | Set of refs to fetch |
231| remote.\<remote\>.projectname | \<network\> | The name of the project as it exists in Gerrit review |
232| remote.\<remote\>.pushurl | upload | The base URI for pushing CLs |
233| remote.\<remote\>.review | upload | The URI of the Gerrit review server |
234| remote.\<remote\>.url | sync & upload | The URI of the git project to fetch |
235| branch.\<branch\>.merge | sync & upload | The branch to merge & upload & track |
236| branch.\<branch\>.remote | sync & upload | The remote to track |
237
238## ~/ dotconfig layout
239
240Repo will create & maintain a few files in the user's home directory.
241
242* `.repoconfig/`: Repo's per-user directory for all random config files/state.
243* `.repoconfig/config`: Per-user settings using [git-config] file format.
244* `.repoconfig/keyring-version`: Cache file for checking if the gnupg subdir
245 has all the same keys as the repo launcher. Used to avoid running gpg
246 constantly as that can be quite slow.
247* `.repoconfig/gnupg/`: GnuPG's internal state directory used when repo needs
248 to run `gpg`. This provides isolation from the user's normal `~/.gnupg/`.
249
250* `.repoconfig/.repo_config.json`: JSON cache of the `.repoconfig/config`
251 file for repo to read/process quickly.
252* `.repo_.gitconfig.json`: JSON cache of the `.gitconfig` file for repo to
253 read/process quickly.
254
255
256[git-config]: https://git-scm.com/docs/git-config
257[git worktree]: https://git-scm.com/docs/git-worktree
258[gitsubmodules]: https://git-scm.com/docs/gitsubmodules
259[manifest-format.md]: ./manifest-format.md
260[local manifests]: ./manifest-format.md#Local-Manifests
261[superprojects]: https://en.wikibooks.org/wiki/Git/Submodules_and_Superprojects
262[topic]: https://gerrit-review.googlesource.com/Documentation/intro-user.html#topics
263[upload-notify]: https://gerrit-review.googlesource.com/Documentation/user-upload.html#notify
diff --git a/docs/manifest-format.md b/docs/manifest-format.md
index 93d9b960..8e0049b3 100644
--- a/docs/manifest-format.md
+++ b/docs/manifest-format.md
@@ -21,6 +21,7 @@ following DTD:
21 21
22```xml 22```xml
23<!DOCTYPE manifest [ 23<!DOCTYPE manifest [
24
24 <!ELEMENT manifest (notice?, 25 <!ELEMENT manifest (notice?,
25 remote*, 26 remote*,
26 default?, 27 default?,
@@ -29,11 +30,13 @@ following DTD:
29 project*, 30 project*,
30 extend-project*, 31 extend-project*,
31 repo-hooks?, 32 repo-hooks?,
33 superproject?,
34 contactinfo?,
32 include*)> 35 include*)>
33 36
34 <!ELEMENT notice (#PCDATA)> 37 <!ELEMENT notice (#PCDATA)>
35 38
36 <!ELEMENT remote EMPTY> 39 <!ELEMENT remote (annotation*)>
37 <!ATTLIST remote name ID #REQUIRED> 40 <!ATTLIST remote name ID #REQUIRED>
38 <!ATTLIST remote alias CDATA #IMPLIED> 41 <!ATTLIST remote alias CDATA #IMPLIED>
39 <!ATTLIST remote fetch CDATA #REQUIRED> 42 <!ATTLIST remote fetch CDATA #REQUIRED>
@@ -87,21 +90,39 @@ following DTD:
87 <!ELEMENT extend-project EMPTY> 90 <!ELEMENT extend-project EMPTY>
88 <!ATTLIST extend-project name CDATA #REQUIRED> 91 <!ATTLIST extend-project name CDATA #REQUIRED>
89 <!ATTLIST extend-project path CDATA #IMPLIED> 92 <!ATTLIST extend-project path CDATA #IMPLIED>
93 <!ATTLIST extend-project dest-path CDATA #IMPLIED>
90 <!ATTLIST extend-project groups CDATA #IMPLIED> 94 <!ATTLIST extend-project groups CDATA #IMPLIED>
91 <!ATTLIST extend-project revision CDATA #IMPLIED> 95 <!ATTLIST extend-project revision CDATA #IMPLIED>
96 <!ATTLIST extend-project remote CDATA #IMPLIED>
92 97
93 <!ELEMENT remove-project EMPTY> 98 <!ELEMENT remove-project EMPTY>
94 <!ATTLIST remove-project name CDATA #REQUIRED> 99 <!ATTLIST remove-project name CDATA #REQUIRED>
100 <!ATTLIST remove-project optional CDATA #IMPLIED>
95 101
96 <!ELEMENT repo-hooks EMPTY> 102 <!ELEMENT repo-hooks EMPTY>
97 <!ATTLIST repo-hooks in-project CDATA #REQUIRED> 103 <!ATTLIST repo-hooks in-project CDATA #REQUIRED>
98 <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED> 104 <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED>
99 105
106 <!ELEMENT superproject EMPTY>
107 <!ATTLIST superproject name CDATA #REQUIRED>
108 <!ATTLIST superproject remote IDREF #IMPLIED>
109 <!ATTLIST superproject revision CDATA #IMPLIED>
110
111 <!ELEMENT contactinfo EMPTY>
112 <!ATTLIST contactinfo bugurl CDATA #REQUIRED>
113
100 <!ELEMENT include EMPTY> 114 <!ELEMENT include EMPTY>
101 <!ATTLIST include name CDATA #REQUIRED> 115 <!ATTLIST include name CDATA #REQUIRED>
116 <!ATTLIST include groups CDATA #IMPLIED>
102]> 117]>
103``` 118```
104 119
120For compatibility purposes across repo releases, all unknown elements are
121silently ignored. However, repo reserves all possible names for itself for
122future use. If you want to use custom elements, the `x-*` namespace is
123reserved for that purpose, and repo guarantees to never allocate any
124corresponding names.
125
105A description of the elements and their attributes follows. 126A description of the elements and their attributes follows.
106 127
107 128
@@ -109,6 +130,10 @@ A description of the elements and their attributes follows.
109 130
110The root element of the file. 131The root element of the file.
111 132
133### Element notice
134
135Arbitrary text that is displayed to users whenever `repo sync` finishes.
136The content is simply passed through as it exists in the manifest.
112 137
113### Element remote 138### Element remote
114 139
@@ -141,8 +166,8 @@ Attribute `review`: Hostname of the Gerrit server where reviews
141are uploaded to by `repo upload`. This attribute is optional; 166are uploaded to by `repo upload`. This attribute is optional;
142if not specified then `repo upload` will not function. 167if not specified then `repo upload` will not function.
143 168
144Attribute `revision`: Name of a Git branch (e.g. `master` or 169Attribute `revision`: Name of a Git branch (e.g. `main` or
145`refs/heads/master`). Remotes with their own revision will override 170`refs/heads/main`). Remotes with their own revision will override
146the default revision. 171the default revision.
147 172
148### Element default 173### Element default
@@ -155,11 +180,11 @@ Attribute `remote`: Name of a previously defined remote element.
155Project elements lacking a remote attribute of their own will use 180Project elements lacking a remote attribute of their own will use
156this remote. 181this remote.
157 182
158Attribute `revision`: Name of a Git branch (e.g. `master` or 183Attribute `revision`: Name of a Git branch (e.g. `main` or
159`refs/heads/master`). Project elements lacking their own 184`refs/heads/main`). Project elements lacking their own
160revision attribute will use this revision. 185revision attribute will use this revision.
161 186
162Attribute `dest-branch`: Name of a Git branch (e.g. `master`). 187Attribute `dest-branch`: Name of a Git branch (e.g. `main`).
163Project elements not setting their own `dest-branch` will inherit 188Project elements not setting their own `dest-branch` will inherit
164this value. If this value is not set, projects will use `revision` 189this value. If this value is not set, projects will use `revision`
165by default instead. 190by default instead.
@@ -235,24 +260,37 @@ name will be prefixed by the parent's.
235The project name must match the name Gerrit knows, if Gerrit is 260The project name must match the name Gerrit knows, if Gerrit is
236being used for code reviews. 261being used for code reviews.
237 262
263"name" must not be empty, and may not be an absolute path or use "." or ".."
264path components. It is always interpreted relative to the remote's fetch
265settings, so if a different base path is needed, declare a different remote
266with the new settings needed.
267These restrictions are not enforced for [Local Manifests].
268
238Attribute `path`: An optional path relative to the top directory 269Attribute `path`: An optional path relative to the top directory
239of the repo client where the Git working directory for this project 270of the repo client where the Git working directory for this project
240should be placed. If not supplied the project name is used. 271should be placed. If not supplied the project "name" is used.
241If the project has a parent element, its path will be prefixed 272If the project has a parent element, its path will be prefixed
242by the parent's. 273by the parent's.
243 274
275"path" may not be an absolute path or use "." or ".." path components.
276These restrictions are not enforced for [Local Manifests].
277
278If you want to place files into the root of the checkout (e.g. a README or
279Makefile or another build script), use the [copyfile] or [linkfile] elements
280instead.
281
244Attribute `remote`: Name of a previously defined remote element. 282Attribute `remote`: Name of a previously defined remote element.
245If not supplied the remote given by the default element is used. 283If not supplied the remote given by the default element is used.
246 284
247Attribute `revision`: Name of the Git branch the manifest wants 285Attribute `revision`: Name of the Git branch the manifest wants
248to track for this project. Names can be relative to refs/heads 286to track for this project. Names can be relative to refs/heads
249(e.g. just "master") or absolute (e.g. "refs/heads/master"). 287(e.g. just "main") or absolute (e.g. "refs/heads/main").
250Tags and/or explicit SHA-1s should work in theory, but have not 288Tags and/or explicit SHA-1s should work in theory, but have not
251been extensively tested. If not supplied the revision given by 289been extensively tested. If not supplied the revision given by
252the remote element is used if applicable, else the default 290the remote element is used if applicable, else the default
253element is used. 291element is used.
254 292
255Attribute `dest-branch`: Name of a Git branch (e.g. `master`). 293Attribute `dest-branch`: Name of a Git branch (e.g. `main`).
256When using `repo upload`, changes will be submitted for code 294When using `repo upload`, changes will be submitted for code
257review on this branch. If unspecified both here and in the 295review on this branch. If unspecified both here and in the
258default element, `revision` is used instead. 296default element, `revision` is used instead.
@@ -261,7 +299,7 @@ Attribute `groups`: List of groups to which this project belongs,
261whitespace or comma separated. All projects belong to the group 299whitespace or comma separated. All projects belong to the group
262"all", and each project automatically belongs to a group of 300"all", and each project automatically belongs to a group of
263its name:`name` and path:`path`. E.g. for 301its name:`name` and path:`path`. E.g. for
264<project name="monkeys" path="barrel-of"/>, that project 302`<project name="monkeys" path="barrel-of"/>`, that project
265definition is implicitly in the following manifest groups: 303definition is implicitly in the following manifest groups:
266default, name:monkeys, and path:barrel-of. If you place a project in the 304default, name:monkeys, and path:barrel-of. If you place a project in the
267group "notdefault", it will not be automatically downloaded by repo. 305group "notdefault", it will not be automatically downloaded by repo.
@@ -300,21 +338,29 @@ against changes to the original manifest.
300Attribute `path`: If specified, limit the change to projects checked out 338Attribute `path`: If specified, limit the change to projects checked out
301at the specified path, rather than all projects with the given name. 339at the specified path, rather than all projects with the given name.
302 340
341Attribute `dest-path`: If specified, a path relative to the top directory
342of the repo client where the Git working directory for this project
343should be placed. This is used to move a project in the checkout by
344overriding the existing `path` setting.
345
303Attribute `groups`: List of additional groups to which this project 346Attribute `groups`: List of additional groups to which this project
304belongs. Same syntax as the corresponding element of `project`. 347belongs. Same syntax as the corresponding element of `project`.
305 348
306Attribute `revision`: If specified, overrides the revision of the original 349Attribute `revision`: If specified, overrides the revision of the original
307project. Same syntax as the corresponding element of `project`. 350project. Same syntax as the corresponding element of `project`.
308 351
352Attribute `remote`: If specified, overrides the remote of the original
353project. Same syntax as the corresponding element of `project`.
354
309### Element annotation 355### Element annotation
310 356
311Zero or more annotation elements may be specified as children of a 357Zero or more annotation elements may be specified as children of a
312project element. Each element describes a name-value pair that will be 358project or remote element. Each element describes a name-value pair.
313exported into each project's environment during a 'forall' command, 359For projects, this name-value pair will be exported into each project's
314prefixed with REPO__. In addition, there is an optional attribute 360environment during a 'forall' command, prefixed with `REPO__`. In addition,
315"keep" which accepts the case insensitive values "true" (default) or 361there is an optional attribute "keep" which accepts the case insensitive values
316"false". This attribute determines whether or not the annotation will 362"true" (default) or "false". This attribute determines whether or not the
317be kept when exported with the manifest subcommand. 363annotation will be kept when exported with the manifest subcommand.
318 364
319### Element copyfile 365### Element copyfile
320 366
@@ -338,7 +384,7 @@ It's just like copyfile and runs at the same time as copyfile but
338instead of copying it creates a symlink. 384instead of copying it creates a symlink.
339 385
340The symlink is created at "dest" (relative to the top of the tree) and 386The symlink is created at "dest" (relative to the top of the tree) and
341points to the path specified by "src". 387points to the path specified by "src" which is a path in the project.
342 388
343Parent directories of "dest" will be automatically created if missing. 389Parent directories of "dest" will be automatically created if missing.
344 390
@@ -355,6 +401,62 @@ This element is mostly useful in a local manifest file, where
355the user can remove a project, and possibly replace it with their 401the user can remove a project, and possibly replace it with their
356own definition. 402own definition.
357 403
404Attribute `optional`: Set to true to ignore remove-project elements with no
405matching `project` element.
406
407### Element repo-hooks
408
409NB: See the [practical documentation](./repo-hooks.md) for using repo hooks.
410
411Only one repo-hooks element may be specified at a time.
412Attempting to redefine it will fail to parse.
413
414Attribute `in-project`: The project where the hooks are defined. The value
415must match the `name` attribute (**not** the `path` attribute) of a previously
416defined `project` element.
417
418Attribute `enabled-list`: List of hooks to use, whitespace or comma separated.
419
420### Element superproject
421
422***
423*Note*: This is currently a WIP.
424***
425
426NB: See the [git superprojects documentation](
427https://en.wikibooks.org/wiki/Git/Submodules_and_Superprojects) for background
428information.
429
430This element is used to specify the URL of the superproject. It has "name" and
431"remote" as atrributes. Only "name" is required while the others have
432reasonable defaults. At most one superproject may be specified.
433Attempting to redefine it will fail to parse.
434
435Attribute `name`: A unique name for the superproject. This attribute has the
436same meaning as project's name attribute. See the
437[element project](#element-project) for more information.
438
439Attribute `remote`: Name of a previously defined remote element.
440If not supplied the remote given by the default element is used.
441
442Attribute `revision`: Name of the Git branch the manifest wants
443to track for this superproject. If not supplied the revision given
444by the remote element is used if applicable, else the default
445element is used.
446
447### Element contactinfo
448
449***
450*Note*: This is currently a WIP.
451***
452
453This element is used to let manifest authors self-register contact info.
454It has "bugurl" as a required atrribute. This element can be repeated,
455and any later entries will clobber earlier ones. This would allow manifest
456authors who extend manifests to specify their own contact info.
457
458Attribute `bugurl`: The URL to file a bug against the manifest owner.
459
358### Element include 460### Element include
359 461
360This element provides the capability of including another manifest 462This element provides the capability of including another manifest
@@ -364,8 +466,15 @@ target manifest to include - it must be a usable manifest on its own.
364Attribute `name`: the manifest to include, specified relative to 466Attribute `name`: the manifest to include, specified relative to
365the manifest repository's root. 467the manifest repository's root.
366 468
469"name" may not be an absolute path or use "." or ".." path components.
470These restrictions are not enforced for [Local Manifests].
471
472Attribute `groups`: List of additional groups to which all projects
473in the included manifest belong. This appends and recurses, meaning
474all projects in sub-manifests carry all parent include groups.
475Same syntax as the corresponding element of `project`.
367 476
368## Local Manifests 477## Local Manifests {#local-manifests}
369 478
370Additional remotes and projects may be added through local manifest 479Additional remotes and projects may be added through local manifest
371files stored in `$TOP_DIR/.repo/local_manifests/*.xml`. 480files stored in `$TOP_DIR/.repo/local_manifests/*.xml`.
@@ -392,10 +501,12 @@ these extra projects.
392Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will 501Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will
393be loaded in alphabetical order. 502be loaded in alphabetical order.
394 503
395Additional remotes and projects may also be added through a local 504Projects from local manifest files are added into
396manifest, stored in `$TOP_DIR/.repo/local_manifest.xml`. This method 505local::<local manifest filename> group.
397is deprecated in favor of using multiple manifest files as mentioned 506
398above. 507The legacy `$TOP_DIR/.repo/local_manifest.xml` path is no longer supported.
508
399 509
400If `$TOP_DIR/.repo/local_manifest.xml` exists, it will be loaded before 510[copyfile]: #Element-copyfile
401any manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml`. 511[linkfile]: #Element-linkfile
512[Local Manifests]: #local-manifests
diff --git a/docs/python-support.md b/docs/python-support.md
index a5c490a8..3eaaba33 100644
--- a/docs/python-support.md
+++ b/docs/python-support.md
@@ -18,13 +18,13 @@ Bugfixes may be added on a best-effort basis or from the community, but largely
18no new features will be added, nor is support guaranteed. 18no new features will be added, nor is support guaranteed.
19 19
20Users can select this during `repo init` time via the [repo launcher]. 20Users can select this during `repo init` time via the [repo launcher].
21Otherwise the default branches (e.g. stable & master) will be used which will 21Otherwise the default branches (e.g. stable & main) will be used which will
22require Python 3. 22require Python 3.
23 23
24This means the [repo launcher] needs to support both Python 2 & Python 3, but 24This means the [repo launcher] needs to support both Python 2 & Python 3, but
25since it doesn't import any other repo code, this shouldn't be too problematic. 25since it doesn't import any other repo code, this shouldn't be too problematic.
26 26
27The master branch will require Python 3.6 at a minimum. 27The main branch will require Python 3.6 at a minimum.
28If the system has an older version of Python 3, then users will have to select 28If the system has an older version of Python 3, then users will have to select
29the legacy Python 2 branch instead. 29the legacy Python 2 branch instead.
30 30
diff --git a/docs/release-process.md b/docs/release-process.md
index 22c2fd19..f71a4110 100644
--- a/docs/release-process.md
+++ b/docs/release-process.md
@@ -5,6 +5,37 @@ related topics and flows.
5 5
6[TOC] 6[TOC]
7 7
8## Schedule
9
10There is no specific schedule for when releases are made.
11Usually it's more along the lines of "enough minor changes have been merged",
12or "there's a known issue the maintainers know should get fixed".
13If you find a fix has been merged for an issue important to you, but hasn't been
14released after a week or so, feel free to [contact] us to request a new release.
15
16### Release Freezes {#freeze}
17
18We try to observe a regular schedule for when **not** to release.
19If something goes wrong, staff need to be active in order to respond quickly &
20effectively.
21We also don't want to disrupt non-Google organizations if possible.
22
23We generally follow the rules:
24
25* Release during Mon - Thu, 9:00 - 14:00 [US PT]
26* Avoid holidays
27 * All regular [US holidays]
28 * Large international ones if possible
29 * All the various [New Years]
30 * Jan 1 in Gregorian calendar is the most obvious
31 * Check for large Lunar New Years too
32* Follow the normal [Google production freeze schedule]
33
34[US holidays]: https://en.wikipedia.org/wiki/Federal_holidays_in_the_United_States
35[US PT]: https://en.wikipedia.org/wiki/Pacific_Time_Zone
36[New Years]: https://en.wikipedia.org/wiki/New_Year
37[Google production freeze schedule]: http://goto.google.com/prod-freeze
38
8## Launcher script 39## Launcher script
9 40
10The main repo script serves as a standalone program and is often referred to as 41The main repo script serves as a standalone program and is often referred to as
@@ -49,11 +80,12 @@ control how repo finds updates:
49 80
50* `--repo-url`: This tells repo where to clone the full repo project itself. 81* `--repo-url`: This tells repo where to clone the full repo project itself.
51 It defaults to the official project (`REPO_URL` in the launcher script). 82 It defaults to the official project (`REPO_URL` in the launcher script).
52* `--repo-branch`: This tells repo which branch to use for the full project. 83* `--repo-rev`: This tells repo which branch to use for the full project.
53 It defaults to the `stable` branch (`REPO_REV` in the launcher script). 84 It defaults to the `stable` branch (`REPO_REV` in the launcher script).
54 85
55Whenever `repo sync` is run, repo will check to see if an update is available. 86Whenever `repo sync` is run, repo will, once every 24 hours, see if an update
56It fetches the latest repo-branch from the repo-url. 87is available.
88It fetches the latest repo-rev from the repo-url.
57Then it verifies that the latest commit in the branch has a valid signed tag 89Then it verifies that the latest commit in the branch has a valid signed tag
58using `git tag -v` (which uses gpg). 90using `git tag -v` (which uses gpg).
59If the tag is valid, then repo will update its internal checkout to it. 91If the tag is valid, then repo will update its internal checkout to it.
@@ -64,9 +96,14 @@ If that tag is valid, then repo will warn and use that commit instead.
64 96
65If that tag cannot be verified, it gives up and forces the user to resolve. 97If that tag cannot be verified, it gives up and forces the user to resolve.
66 98
99### Force an update
100
101The `repo selfupdate` command can be used to force an immediate update.
102It is not subject to the 24 hour limitation.
103
67## Branch management 104## Branch management
68 105
69All development happens on the `master` branch and should generally be stable. 106All development happens on the `main` branch and should generally be stable.
70 107
71Since the repo launcher defaults to tracking the `stable` branch, it is not 108Since the repo launcher defaults to tracking the `stable` branch, it is not
72normally updated until a new release is available. 109normally updated until a new release is available.
@@ -81,7 +118,7 @@ For example, when `stable` moves from `v1.10.x` to `v1.11.x`, then the `maint`
81branch will be updated from `v1.9.x` to `v1.10.x`. 118branch will be updated from `v1.9.x` to `v1.10.x`.
82 119
83We don't have parallel release branches/series. 120We don't have parallel release branches/series.
84Typically all tags are made against the `master` branch and then pushed to the 121Typically all tags are made against the `main` branch and then pushed to the
85`stable` branch to make it available to the rest of the world. 122`stable` branch to make it available to the rest of the world.
86Since repo doesn't typically see a lot of changes, this tends to be OK. 123Since repo doesn't typically see a lot of changes, this tends to be OK.
87 124
@@ -89,10 +126,10 @@ Since repo doesn't typically see a lot of changes, this tends to be OK.
89 126
90When you want to create a new release, you'll need to select a good version and 127When you want to create a new release, you'll need to select a good version and
91create a signed tag using a key registered in repo itself. 128create a signed tag using a key registered in repo itself.
92Typically we just tag the latest version of the `master` branch. 129Typically we just tag the latest version of the `main` branch.
93The tag could be pushed now, but it won't be used by clients normally (since the 130The tag could be pushed now, but it won't be used by clients normally (since the
94default `repo-branch` setting is `stable`). 131default `repo-rev` setting is `stable`).
95This would allow some early testing on systems who explicitly select `master`. 132This would allow some early testing on systems who explicitly select `main`.
96 133
97### Creating a signed tag 134### Creating a signed tag
98 135
@@ -113,7 +150,7 @@ $ export GNUPGHOME=~/.gnupg/repo/
113$ gpg -K 150$ gpg -K
114 151
115# Pick whatever branch or commit you want to tag. 152# Pick whatever branch or commit you want to tag.
116$ r=master 153$ r=main
117 154
118# Pick the new version. 155# Pick the new version.
119$ t=1.12.10 156$ t=1.12.10
@@ -161,7 +198,144 @@ You can create a short changelog using the command:
161$ git log --format="%h (%aN) %s" --no-merges origin/stable..$r 198$ git log --format="%h (%aN) %s" --no-merges origin/stable..$r
162``` 199```
163 200
164 201## Project References
202
203Here's a table showing the relationship of major tools, their EOL dates, and
204their status in Ubuntu & Debian.
205Those distros tend to be good indicators of how long we need to support things.
206
207Things in bold indicate stuff to take note of, but does not guarantee that we
208still support them.
209Things in italics are things we used to care about but probably don't anymore.
210
211| Date | EOL | [Git][rel-g] | [Python][rel-p] | [SSH][rel-o] | [Ubuntu][rel-u] / [Debian][rel-d] | Git | Python | SSH |
212|:--------:|:------------:|:------------:|:---------------:|:------------:|-----------------------------------|-----|--------|-----|
213| Apr 2008 | | | | 5.0 |
214| Jun 2008 | | | | 5.1 |
215| Oct 2008 | *Oct 2013* | | 2.6.0 | | *10.04 Lucid* - 10.10 Maverick / *Squeeze* |
216| Dec 2008 | *Feb 2009* | | 3.0.0 |
217| Feb 2009 | | | | 5.2 |
218| Feb 2009 | *Mar 2012* | | | | Debian 5 Lenny | 1.5.6.5 | 2.5.2 |
219| Jun 2009 | *Jun 2016* | | 3.1.0 | | *10.04 Lucid* - 10.10 Maverick / *Squeeze* |
220| Sep 2009 | | | | 5.3 | *10.04 Lucid* |
221| Feb 2010 | *Oct 2012* | 1.7.0 | | | *10.04 Lucid* - *12.04 Precise* - 12.10 Quantal |
222| Mar 2010 | | | | 5.4 |
223| Apr 2010 | | | | 5.5 | 10.10 Maverick |
224| Apr 2010 | *Apr 2015* | | | | *10.04 Lucid* | 1.7.0.4 | 2.6.5 3.1.2 | 5.3 |
225| Jul 2010 | *Dec 2019* | | *2.7.0* | | 11.04 Natty - *<current>* |
226| Aug 2010 | | | | 5.6 |
227| Oct 2010 | | | | | 10.10 Maverick | 1.7.1 | 2.6.6 3.1.3 | 5.5 |
228| Jan 2011 | | | | 5.7 |
229| Feb 2011 | | | | 5.8 | 11.04 Natty |
230| Feb 2011 | *Feb 2016* | | | | Debian 6 Squeeze | 1.7.2.5 | 2.6.6 3.1.3 |
231| Apr 2011 | | | | | 11.04 Natty | 1.7.4 | 2.7.1 3.2.0 | 5.8 |
232| Sep 2011 | | | | 5.9 | *12.04 Precise* |
233| Oct 2011 | *Feb 2016* | | 3.2.0 | | 11.04 Natty - 12.10 Quantal |
234| Oct 2011 | | | | | 11.10 Ocelot | 1.7.5.4 | 2.7.2 3.2.2 | 5.8 |
235| Apr 2012 | | | | 6.0 | 12.10 Quantal |
236| Apr 2012 | *Apr 2019* | | | | *12.04 Precise* | 1.7.9.5 | 2.7.3 3.2.3 | 5.9 |
237| Aug 2012 | | | | 6.1 | 13.04 Raring |
238| Sep 2012 | *Sep 2017* | | 3.3.0 | | 13.04 Raring - 13.10 Saucy |
239| Oct 2012 | *Dec 2014* | 1.8.0 | | | 13.04 Raring - 13.10 Saucy |
240| Oct 2012 | | | | | 12.10 Quantal | 1.7.10.4 | 2.7.3 3.2.3 | 6.0 |
241| Mar 2013 | | | | 6.2 | 13.10 Saucy |
242| Apr 2013 | | | | | 13.04 Raring | 1.8.1.2 | 2.7.4 3.3.1 | 6.1 |
243| May 2013 | *May 2018* | | | | Debian 7 Wheezy | 1.7.10.4 | 2.7.3 3.2.3 |
244| Sep 2013 | | | | 6.3 |
245| Oct 2013 | | | | | 13.10 Saucy | 1.8.3.2 | 2.7.5 3.3.2 | 6.2 |
246| Nov 2013 | | | | 6.4 |
247| Jan 2014 | | | | 6.5 |
248| Feb 2014 | *Dec 2014* | **1.9.0** | | | *14.04 Trusty* |
249| Mar 2014 | *Mar 2019* | | *3.4.0* | | *14.04 Trusty* - 15.10 Wily / *Jessie* |
250| Mar 2014 | | | | 6.6 | *14.04 Trusty* - 14.10 Utopic |
251| Apr 2014 | *Apr 2022* | | | | *14.04 Trusty* | 1.9.1 | 2.7.5 3.4.0 | 6.6 |
252| May 2014 | *Dec 2014* | 2.0.0 |
253| Aug 2014 | *Dec 2014* | *2.1.0* | | | 14.10 Utopic - 15.04 Vivid / *Jessie* |
254| Oct 2014 | | | | 6.7 | 15.04 Vivid |
255| Oct 2014 | | | | | 14.10 Utopic | 2.1.0 | 2.7.8 3.4.2 | 6.6 |
256| Nov 2014 | *Sep 2015* | 2.2.0 |
257| Feb 2015 | *Sep 2015* | 2.3.0 |
258| Mar 2015 | | | | 6.8 |
259| Apr 2015 | *May 2017* | 2.4.0 |
260| Apr 2015 | *Jun 2020* | | | | *Debian 8 Jessie* | 2.1.4 | 2.7.9 3.4.2 |
261| Apr 2015 | | | | | 15.04 Vivid | 2.1.4 | 2.7.9 3.4.3 | 6.7 |
262| Jul 2015 | *May 2017* | 2.5.0 | | | 15.10 Wily |
263| Jul 2015 | | | | 6.9 | 15.10 Wily |
264| Aug 2015 | | | | 7.0 |
265| Aug 2015 | | | | 7.1 |
266| Sep 2015 | *May 2017* | 2.6.0 |
267| Sep 2015 | *Sep 2020* | | *3.5.0* | | *16.04 Xenial* - 17.04 Zesty / *Stretch* |
268| Oct 2015 | | | | | 15.10 Wily | 2.5.0 | 2.7.9 3.4.3 | 6.9 |
269| Jan 2016 | *Jul 2017* | *2.7.0* | | | *16.04 Xenial* |
270| Feb 2016 | | | | 7.2 | *16.04 Xenial* |
271| Mar 2016 | *Jul 2017* | 2.8.0 |
272| Apr 2016 | *Apr 2024* | | | | *16.04 Xenial* | 2.7.4 | 2.7.11 3.5.1 | 7.2 |
273| Jun 2016 | *Jul 2017* | 2.9.0 | | | 16.10 Yakkety |
274| Jul 2016 | | | | 7.3 | 16.10 Yakkety |
275| Sep 2016 | *Sep 2017* | 2.10.0 |
276| Oct 2016 | | | | | 16.10 Yakkety | 2.9.3 | 2.7.11 3.5.1 | 7.3 |
277| Nov 2016 | *Sep 2017* | *2.11.0* | | | 17.04 Zesty / *Stretch* |
278| Dec 2016 | **Dec 2021** | | **3.6.0** | | 17.10 Artful - **18.04 Bionic** - 18.10 Cosmic |
279| Dec 2016 | | | | 7.4 | 17.04 Zesty / *Debian 9 Stretch* |
280| Feb 2017 | *Sep 2017* | 2.12.0 |
281| Mar 2017 | | | | 7.5 | 17.10 Artful |
282| Apr 2017 | | | | | 17.04 Zesty | 2.11.0 | 2.7.13 3.5.3 | 7.4 |
283| May 2017 | *May 2018* | 2.13.0 |
284| Jun 2017 | *Jun 2022* | | | | *Debian 9 Stretch* | 2.11.0 | 2.7.13 3.5.3 | 7.4 |
285| Aug 2017 | *Dec 2019* | 2.14.0 | | | 17.10 Artful |
286| Oct 2017 | *Dec 2019* | 2.15.0 |
287| Oct 2017 | | | | 7.6 | **18.04 Bionic** |
288| Oct 2017 | | | | | 17.10 Artful | 2.14.1 | 2.7.14 3.6.3 | 7.5 |
289| Jan 2018 | *Dec 2019* | 2.16.0 |
290| Apr 2018 | *Mar 2021* | **2.17.0** | | | **18.04 Bionic** |
291| Apr 2018 | | | | 7.7 | 18.10 Cosmic |
292| Apr 2018 | **Apr 2028** | | | | **18.04 Bionic** | 2.17.0 | 2.7.15 3.6.5 | 7.6 |
293| Jun 2018 | *Mar 2021* | 2.18.0 |
294| Jun 2018 | **Jun 2023** | | 3.7.0 | | 19.04 Disco - **20.04 Focal** / **Buster** |
295| Aug 2018 | | | | 7.8 |
296| Sep 2018 | *Mar 2021* | 2.19.0 | | | 18.10 Cosmic |
297| Oct 2018 | | | | 7.9 | 19.04 Disco / **Buster** |
298| Oct 2018 | | | | | 18.10 Cosmic | 2.19.1 | 2.7.15 3.6.6 | 7.7 |
299| Dec 2018 | *Mar 2021* | **2.20.0** | | | 19.04 Disco - 19.10 Eoan / **Buster** |
300| Feb 2019 | *Mar 2021* | 2.21.0 |
301| Apr 2019 | | | | 8.0 | 19.10 Eoan |
302| Apr 2019 | | | | | 19.04 Disco | 2.20.1 | 2.7.16 3.7.3 | 7.9 |
303| Jun 2019 | | 2.22.0 |
304| Jul 2019 | **Jul 2024** | | | | **Debian 10 Buster** | 2.20.1 | 2.7.16 3.7.3 | 7.9 |
305| Aug 2019 | *Mar 2021* | 2.23.0 |
306| Oct 2019 | **Oct 2024** | | 3.8.0 | | **20.04 Focal** - 20.10 Groovy |
307| Oct 2019 | | | | 8.1 |
308| Oct 2019 | | | | | 19.10 Eoan | 2.20.1 | 2.7.17 3.7.5 | 8.0 |
309| Nov 2019 | *Mar 2021* | 2.24.0 |
310| Jan 2020 | *Mar 2021* | 2.25.0 | | | **20.04 Focal** |
311| Feb 2020 | | | | 8.2 | **20.04 Focal** |
312| Mar 2020 | *Mar 2021* | 2.26.0 |
313| Apr 2020 | **Apr 2030** | | | | **20.04 Focal** | 2.25.1 | 2.7.17 3.8.2 | 8.2 |
314| May 2020 | *Mar 2021* | 2.27.0 | | | 20.10 Groovy |
315| May 2020 | | | | 8.3 |
316| Jul 2020 | *Mar 2021* | 2.28.0 |
317| Sep 2020 | | | | 8.4 | 21.04 Hirsute / **Bullseye** |
318| Oct 2020 | *Mar 2021* | 2.29.0 |
319| Oct 2020 | | | | | 20.10 Groovy | 2.27.0 | 2.7.18 3.8.6 | 8.3 |
320| Oct 2020 | **Oct 2025** | | 3.9.0 | | 21.04 Hirsute / **Bullseye** |
321| Dec 2020 | *Mar 2021* | 2.30.0 | | | 21.04 Hirsute / **Bullseye** |
322| Mar 2021 | | 2.31.0 |
323| Mar 2021 | | | | 8.5 |
324| Apr 2021 | | | | 8.6 |
325| Apr 2021 | *Jan 2022* | | | | 21.04 Hirsute | 2.30.2 | 2.7.18 3.9.4 | 8.4 |
326| Jun 2021 | | 2.32.0 |
327| Aug 2021 | | 2.33.0 |
328| Aug 2021 | | | | 8.7 |
329| Aug 2021 | **Aug 2026** | | | | **Debian 11 Bullseye** | 2.30.2 | 2.7.18 3.9.2 | 8.4 |
330| **Date** | **EOL** | **[Git][rel-g]** | **[Python][rel-p]** | **[SSH][rel-o]** | **[Ubuntu][rel-u] / [Debian][rel-d]** | **Git** | **Python** | **SSH** |
331
332
333[contact]: ../README.md#contact
334[rel-d]: https://en.wikipedia.org/wiki/Debian_version_history
335[rel-g]: https://en.wikipedia.org/wiki/Git#Releases
336[rel-o]: https://www.openssh.com/releasenotes.html
337[rel-p]: https://en.wikipedia.org/wiki/History_of_Python#Table_of_versions
338[rel-u]: https://en.wikipedia.org/wiki/Ubuntu_version_history#Table_of_versions
165[example announcement]: https://groups.google.com/d/topic/repo-discuss/UGBNismWo1M/discussion 339[example announcement]: https://groups.google.com/d/topic/repo-discuss/UGBNismWo1M/discussion
166[repo-discuss@googlegroups.com]: https://groups.google.com/forum/#!forum/repo-discuss 340[repo-discuss@googlegroups.com]: https://groups.google.com/forum/#!forum/repo-discuss
167[go/repo-release]: https://goto.google.com/repo-release 341[go/repo-release]: https://goto.google.com/repo-release
diff --git a/docs/repo-hooks.md b/docs/repo-hooks.md
index 7c37c30e..cbb1aac7 100644
--- a/docs/repo-hooks.md
+++ b/docs/repo-hooks.md
@@ -27,7 +27,7 @@ repohooks project is updated and a hook is triggered.
27For the full syntax, see the [repo manifest format](./manifest-format.md). 27For the full syntax, see the [repo manifest format](./manifest-format.md).
28 28
29Here's a short example from 29Here's a short example from
30[Android](https://android.googlesource.com/platform/manifest/+/master/default.xml). 30[Android](https://android.googlesource.com/platform/manifest/+/HEAD/default.xml).
31The `<project>` line checks out the repohooks git repo to the local 31The `<project>` line checks out the repohooks git repo to the local
32`tools/repohooks/` path. The `<repo-hooks>` line says to look in the project 32`tools/repohooks/` path. The `<repo-hooks>` line says to look in the project
33with the name `platform/tools/repohooks` for hooks to run during the 33with the name `platform/tools/repohooks` for hooks to run during the
diff --git a/docs/windows.md b/docs/windows.md
index 80912964..4282bebf 100644
--- a/docs/windows.md
+++ b/docs/windows.md
@@ -19,7 +19,33 @@ also due to most developers not using Windows.
19We will never add code specific to older versions of Windows. 19We will never add code specific to older versions of Windows.
20It might work, but it most likely won't, so please don't bother asking. 20It might work, but it most likely won't, so please don't bother asking.
21 21
22## Symlinks 22## Git worktrees
23
24*** note
25**Warning**: Repo's support for Git worktrees is new & experimental.
26Please report any bugs and be sure to maintain backups!
27***
28
29The Repo 2.4 release introduced support for [Git worktrees][git-worktree].
30You don't have to worry about or understand this particular feature, so don't
31worry if this section of the Git manual is particularly impenetrable.
32
33The salient point is that Git worktrees allow Repo to create repo client
34checkouts that do not require symlinks at all under Windows.
35This means users no longer need Administrator access to sync code.
36
37Simply use `--worktree` when running `repo init` to opt in.
38
39This does not effect specific Git repositories that use symlinks themselves.
40
41[git-worktree]: https://git-scm.com/docs/git-worktree
42
43## Symlinks by default
44
45*** note
46**NB**: This section applies to the default Repo behavior which does not use
47Git worktrees (see the previous section for more info).
48***
23 49
24Repo will use symlinks heavily internally. 50Repo will use symlinks heavily internally.
25On *NIX platforms, this isn't an issue, but Windows makes it a bit difficult. 51On *NIX platforms, this isn't an issue, but Windows makes it a bit difficult.
@@ -62,9 +88,8 @@ This also helps `tar` unpack symlinks, so that's nice.
62 88
63## Python 89## Python
64 90
65You should make sure to be running Python 3.6 or newer under Windows. 91Python 3.6 or newer is required.
66Python 2 might work, but due to already limited platform testing, you should 92Python 2 is known to be broken when running under Windows.
67only run newer Python versions.
68See our [Python Support](./python-support.md) document for more details. 93See our [Python Support](./python-support.md) document for more details.
69 94
70You can grab the latest Windows installer here:<br> 95You can grab the latest Windows installer here:<br>