pw_presubmit: Add repo tool API

Adds `repo::list_all_git_repo()` to return a list of git repos

Change-Id: If86ca1bb71e19c2bfe0f3dd32705b974be8c81cf
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/179230
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
Reviewed-by: Rob Mohr <mohrr@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
Commit-Queue: Alan Rosenthal <alanrosenthal@google.com>
diff --git a/pw_presubmit/py/BUILD.gn b/pw_presubmit/py/BUILD.gn
index b8e9972..79fdfee 100644
--- a/pw_presubmit/py/BUILD.gn
+++ b/pw_presubmit/py/BUILD.gn
@@ -50,6 +50,7 @@
     "pw_presubmit/presubmit.py",
     "pw_presubmit/presubmit_context.py",
     "pw_presubmit/python_checks.py",
+    "pw_presubmit/repo.py",
     "pw_presubmit/rst_format.py",
     "pw_presubmit/shell_checks.py",
     "pw_presubmit/source_in_build.py",
diff --git a/pw_presubmit/py/pw_presubmit/repo.py b/pw_presubmit/py/pw_presubmit/repo.py
new file mode 100644
index 0000000..51e9b74
--- /dev/null
+++ b/pw_presubmit/py/pw_presubmit/repo.py
@@ -0,0 +1,44 @@
+# Copyright 2024 The Pigweed Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+"""
+Helpful commands for working with the repo tool.
+See https://gerrit.googlesource.com/git-repo/ for more info!
+"""
+
+import subprocess
+
+from typing import List
+from pathlib import Path
+from pw_presubmit.tools import log_run
+
+
+def list_all_git_repos() -> List[Path]:
+    """Query repo tool and return a list of git repos in the current project.
+
+    Returns:
+        List of "Path"s which were found.
+    """
+    repos = (
+        log_run(
+            ['repo', 'forall', '-c', 'git', 'rev-parse', '--show-toplevel'],
+            stdout=subprocess.PIPE,
+            stderr=subprocess.DEVNULL,
+            check=True,
+            ignore_dry_run=True,
+        )
+        .stdout.decode()
+        .strip()
+    )
+
+    return [Path(line) for line in repos.splitlines()]