From f9fe3e14d2b56140c90a8969892e06aa71127305 Mon Sep 17 00:00:00 2001 From: "Mark E. Hamilton" Date: Tue, 23 Feb 2016 18:10:42 -0700 Subject: [PATCH] repo: Repo does not always handle '.' parameter correctly The repo script allows a manifest to specify a '.' as the path the top-level directory, which co-locates the .git and .repo directories, and places files from the git repository at the top-level: Most commands work correctly with this setup. Some commands, however, fail to find the project. For instance, 'repo sync' works, and 'repo sync .' works in a sub-project ('other' in this case) but 'repo sync .' in the top-level directory fails with the error: error: project . not found There are two reasons for this: 1. The self.worktree attribute of the Project object is not normalized, so with a '.' for path its value would be '/my/project/root/.'. This is fine when used as a path, since it's the same path as '/my/project/root', but when used in a string comparison it fails. This commit applies os.path.normpath() to that value before storing it. 2. The _GetProjectByPath method in command.py was not checking the path against manifest.topdir, so even once it was normalized the project was not found. This commit adds a check against manifest.topdir if the loop drops out without finding a project. Change-Id: Ic84d053f1bbb5a357cad566805d5a326ae8246d2 --- command.py | 5 +++++ project.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/command.py b/command.py index bc2f9501..2ff0a344 100644 --- a/command.py +++ b/command.py @@ -119,6 +119,11 @@ class Command(object): except KeyError: oldpath = path path = os.path.dirname(path) + if not project and path == manifest.topdir: + try: + project = self._by_path[path] + except KeyError: + pass else: try: project = self._by_path[path] diff --git a/project.py b/project.py index e0bd9c10..4a601f87 100644 --- a/project.py +++ b/project.py @@ -626,7 +626,7 @@ class Project(object): self.gitdir = gitdir.replace('\\', '/') self.objdir = objdir.replace('\\', '/') if worktree: - self.worktree = worktree.replace('\\', '/') + self.worktree = os.path.normpath(worktree.replace('\\', '/')) else: self.worktree = None self.relpath = relpath