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>
diff --git a/manifest_xml.py b/manifest_xml.py
index b6aef51..f546045 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -978,6 +978,10 @@
return project
def GetProjectPaths(self, name, path):
+ # The manifest entries might have trailing slashes. Normalize them to avoid
+ # unexpected filesystem behavior since we do string concatenation below.
+ path = path.rstrip('/')
+ name = name.rstrip('/')
use_git_worktrees = False
relpath = path
if self.IsMirror:
@@ -1010,6 +1014,10 @@
return os.path.relpath(relpath, parent_relpath)
def GetSubprojectPaths(self, parent, name, path):
+ # The manifest entries might have trailing slashes. Normalize them to avoid
+ # unexpected filesystem behavior since we do string concatenation below.
+ path = path.rstrip('/')
+ name = name.rstrip('/')
relpath = self._JoinRelpath(parent.relpath, path)
gitdir = os.path.join(parent.gitdir, 'subprojects', '%s.git' % path)
objdir = os.path.join(parent.gitdir, 'subproject-objects', '%s.git' % name)