From a269b1cb9dc21dfd598bfea3766206b606ad4589 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 21 Feb 2020 00:49:41 -0500 Subject: [PATCH] manifest_xml: change .repo/manifest.xml to a plain file Changing this to a file instead of using a symlink serves two purposes: * We can insert some comments & doc links to help users learn what this is for, discover relevant documentation, and to discourage them from modifying things. * Windows requires Administrator access to use symlinks. With this last change, Windows users can get repo client checkouts with the new --worktree option and not need symlinks anywhere at all. Which means they no longer need to be an Administrator in order to `repo sync`. Change-Id: I9bc46824fd8d4b0f446ba84bd764994ca1e597e2 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/256313 Tested-by: Mike Frysinger Reviewed-by: David Pursehouse --- docs/internal-fs-layout.md | 13 ++++++++++--- manifest_xml.py | 27 +++++++++++++++++++++------ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/docs/internal-fs-layout.md b/docs/internal-fs-layout.md index 0b6c4709..8050e4f0 100644 --- a/docs/internal-fs-layout.md +++ b/docs/internal-fs-layout.md @@ -68,13 +68,20 @@ support, see the [manifest-format.md] file. If you want to switch the tracking settings, re-run `repo init` with the new settings. +* `manifest.xml`: The manifest that repo uses. It is generated at `repo init` + and uses the `--manifest-name` to determine what manifest file to load next + out of `manifests/`. + + Do not try to modify this to load other manifests as it will confuse repo. + If you want to switch manifest files, re-run `repo init` with the new + setting. + + Older versions of repo managed this with symlinks. + * `manifest.xml -> manifests/.xml`: A symlink to the manifest that the user wishes to sync. It is specified at `repo init` time via `--manifest-name`. - Do not try to repoint this symlink to other files as it will confuse repo. - If you want to switch manifest files, re-run `repo init` with the new - setting. * `manifests.git/.repo_config.json`: JSON cache of the `manifests.git/config` file for repo to read/process quickly. diff --git a/manifest_xml.py b/manifest_xml.py index fe0735a8..a3effd11 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -191,12 +191,27 @@ class XmlManifest(object): """ self.Override(name) - try: - if os.path.lexists(self.manifestFile): - platform_utils.remove(self.manifestFile) - platform_utils.symlink(os.path.join('manifests', name), self.manifestFile) - except OSError as e: - raise ManifestParseError('cannot link manifest %s: %s' % (name, str(e))) + # Old versions of repo would generate symlinks we need to clean up. + if os.path.lexists(self.manifestFile): + platform_utils.remove(self.manifestFile) + # This file is interpreted as if it existed inside the manifest repo. + # That allows us to use with the relative file name. + with open(self.manifestFile, 'w') as fp: + fp.write(""" + + + + +""" % (name,)) def _RemoteToXml(self, r, doc, root): e = doc.createElement('remote')