diff options
| author | Mike Frysinger <vapier@google.com> | 2020-05-26 01:02:29 -0400 |
|---|---|---|
| committer | David Pursehouse <dpursehouse@digital.ai> | 2020-05-26 05:15:58 +0000 |
| commit | cebf227026d3ef9e849a7d7d54bef638544d65ad (patch) | |
| tree | 8b175284dd58b3ae0313cdba91083a47458705db | |
| parent | 7ae210a15bcf319744c2f4c3a3ea19f63444f14c (diff) | |
| download | git-repo-cebf227026d3ef9e849a7d7d54bef638544d65ad.tar.gz | |
manifest: normalize name & path when constructing fs paths
If the manifest uses a trailing slash on the name attribute, repo
will construct bad internal filesystem paths which confuses tools
later on.
For example, this manifest entry:
<project name="aosp/platform/system/libhidl/" ...
will cause repo to use paths like:
.repo/project-objects/aosp/platform/system/libhidl/.git/
when it really should be using:
.repo/project-objects/aosp/platform/system/libhidl.git
Apply the normalization when we construct the local filesystem paths
as we cannot guarantee that the remote URL constructed from these
will behave the same. A server might really want:
https://example.com/aosp/platform/system/libhidl/
and would throw an error if we instead tried to fetch:
https://example.com/aosp/platform/system/libhidl
Unfortunately, any existing repo client checkouts that use such a
manifest will hit a one-time sync error as the internal git location
has changed. I'm not sure there's a way to cleanly migrate that.
Bug: https://crbug.com/1086043
Change-Id: I30bea0ffd23e478de89a035f408055e48a102658
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/268742
Tested-by: Mike Frysinger <vapier@google.com>
Reviewed-by: David Pursehouse <dpursehouse@digital.ai>
| -rw-r--r-- | manifest_xml.py | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/manifest_xml.py b/manifest_xml.py index b6aef510..f546045a 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
| @@ -978,6 +978,10 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 978 | return project | 978 | return project |
| 979 | 979 | ||
| 980 | def GetProjectPaths(self, name, path): | 980 | def GetProjectPaths(self, name, path): |
| 981 | # The manifest entries might have trailing slashes. Normalize them to avoid | ||
| 982 | # unexpected filesystem behavior since we do string concatenation below. | ||
| 983 | path = path.rstrip('/') | ||
| 984 | name = name.rstrip('/') | ||
| 981 | use_git_worktrees = False | 985 | use_git_worktrees = False |
| 982 | relpath = path | 986 | relpath = path |
| 983 | if self.IsMirror: | 987 | if self.IsMirror: |
| @@ -1010,6 +1014,10 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 1010 | return os.path.relpath(relpath, parent_relpath) | 1014 | return os.path.relpath(relpath, parent_relpath) |
| 1011 | 1015 | ||
| 1012 | def GetSubprojectPaths(self, parent, name, path): | 1016 | def GetSubprojectPaths(self, parent, name, path): |
| 1017 | # The manifest entries might have trailing slashes. Normalize them to avoid | ||
| 1018 | # unexpected filesystem behavior since we do string concatenation below. | ||
| 1019 | path = path.rstrip('/') | ||
| 1020 | name = name.rstrip('/') | ||
| 1013 | relpath = self._JoinRelpath(parent.relpath, path) | 1021 | relpath = self._JoinRelpath(parent.relpath, path) |
| 1014 | gitdir = os.path.join(parent.gitdir, 'subprojects', '%s.git' % path) | 1022 | gitdir = os.path.join(parent.gitdir, 'subprojects', '%s.git' % path) |
| 1015 | objdir = os.path.join(parent.gitdir, 'subproject-objects', '%s.git' % name) | 1023 | objdir = os.path.join(parent.gitdir, 'subproject-objects', '%s.git' % name) |
