summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2020-05-26 01:02:29 -0400
committerDavid Pursehouse <dpursehouse@digital.ai>2020-05-26 05:15:58 +0000
commitcebf227026d3ef9e849a7d7d54bef638544d65ad (patch)
tree8b175284dd58b3ae0313cdba91083a47458705db
parent7ae210a15bcf319744c2f4c3a3ea19f63444f14c (diff)
downloadgit-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.py8
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)