diff --git a/presubmit_canned_checks.py b/presubmit_canned_checks.py index d41ae5955..66ab4fcf0 100644 --- a/presubmit_canned_checks.py +++ b/presubmit_canned_checks.py @@ -2081,13 +2081,12 @@ def CheckForCommitObjects(input_api, output_api): url = dep if isinstance(dep, str) else dep['url'] commit_hash = url.split('@')[-1] - # Two exceptions were in made in two projects prior to this check - # enforcement. We need to address those exceptions, but in the meantime - # we can't fail this global presubmit check - # https://chromium.googlesource.com/infra/infra/+/refs/heads/main/DEPS#45 - if dep_path == 'recipes-py' and commit_hash == 'refs/heads/main': - continue + # One exception is made prior to this check enforcement. + # + # We need to address this exception, but in the meantime we can't fail + # this global presubmit check. + # # https://chromium.googlesource.com/angle/angle/+/refs/heads/main/DEPS#412 if dep_path == 'third_party/dummy_chromium': continue @@ -2168,7 +2167,32 @@ def CheckForRecursedeps(input_api, output_api): # No recursedeps entry, carry on! return [] - existing_deps = deps.get('deps', {}) + existing_deps: set[str] = set() + # If git_dependencies is SYNC or SUBMODULES, prefer the submodule data. + if deps.get('git_dependencies', 'DEPS') == 'DEPS': + existing_deps = set(deps.get('deps', {})) + else: + existing_deps = input_api.change.AllLocalSubmodules() + # existing_deps is 'local paths' i.e. repo-relative. However, if deps is + # NOT use_relative_paths, then we need to adjust these to be + # client-root-relative. + # + # Sadly, as of 25Q1, the default is still False. + if deps.get('use_relative_paths', False): + # Find the relative path between the gclient root and the repo root. + relpath = input_api.os_path.relpath( + input_api.change.RepositoryRoot(), + start = input_api.gclient_paths.FindGclientRoot( + input_api.change.RepositoryRoot())) + # All submodules are relative to the repo root, so join + # + # gclient-to-repo ++ repo-to-submodule + # + # To get path strings which should appear in recursedeps. + existing_deps = set( + input_api.os_path.join(relpath, p) + for p in existing_deps + ) errors = [] for check_dep in deps['recursedeps']: @@ -2178,6 +2202,7 @@ def CheckForRecursedeps(input_api, output_api): f'Found recuredep entry {check_dep} but it is not found ' 'in\n deps itself. Remove it from recurcedeps or add ' 'deps entry.')) + return errors diff --git a/presubmit_support.py b/presubmit_support.py index b5d10704e..c7cf8d683 100755 --- a/presubmit_support.py +++ b/presubmit_support.py @@ -1435,6 +1435,10 @@ class Change(object): """Returns local paths for affected submodules.""" return [af.LocalPath() for af in self.AffectedSubmodules()] + def AllLocalSubmodules(self) -> set[str]: + """Returns local paths for all submodules.""" + return set(self._repo_submodules()) + def AbsoluteLocalPaths(self): """Convenience function.""" return [af.AbsoluteLocalPath() for af in self.AffectedFiles()]