summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* color: Treat "true" and "yes" as "auto", not "always"v2.65Brian Gan2026-07-012-20/+106
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Per the git documentation for color.ui [1], setting color.ui to "true" (or "yes") should behave identically to "auto", enabling color only when output is written to a terminal or an active pager. Previously, repo was equating "true" and "yes" with "always", which caused color escape codes to be emitted unconditionally, even when output was piped or redirected. Replace the duplicated string-matching logic in SetDefaultColoring and Coloring.__init__ with a single CONFIG_TO_COLOR_SETTING dict that maps all git color config values to their behavior. This makes the mapping easy to verify against the git docs and impossible to get out of sync between the two call sites. Added tests for SetDefaultColoring and Coloring.__init__ covering all color mode values (auto, true, yes, always, never, no, false), case insensitivity, TTY vs pipe behavior, active pager detection, and unrecognised input. [1] https://git-scm.com/docs/git-config#Documentation/git-config.txt-colorui Bug: 295841573 Change-Id: I8a04b9c7e4154de37ed7518c010233039e0afdc9 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/602981 Tested-by: Brian Gan <brgan@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Brian Gan <brgan@google.com>
* agents: run review agents manuallyGavin Mak2026-07-011-2/+2
| | | | | | | | | | | | The review agents are broken right now, so don't run them automatically. They should still be runnable on demand. Change-Id: I22e5ff46f917a49d0c267a0b1e8c63ae2165347d Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/603461 Reviewed-by: Brian Gan <brgan@google.com> Commit-Queue: Brian Gan <brgan@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Tested-by: Brian Gan <brgan@google.com>
* tests: Fix test compatibility with Python 3.14 forkserverBrian Gan2026-06-301-8/+9
| | | | | | | | | | | | | | | | | | | | | | Python 3.14 changed the default multiprocessing start method on Linux from "fork" to "forkserver". The test_forall_all_projects_called_once test uses mock.patch.object on Project.GetRevisionId, but class-level mock patches do not survive into forkserver worker processes because they start from a clean Python interpreter rather than inheriting the parent's memory. Replace the mock with setting revisionId directly on each Project instance so GetRevisionId() short-circuits without touching git. This works with any multiprocessing start method since the string attribute is part of the Project objects stored in _parallel_context, which is properly serialized to workers via initargs. Bug: 425319437 Change-Id: Icd3bbd010921d7652bb2425fad85974df9198367 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/602941 Tested-by: Brian Gan <brgan@google.com> Commit-Queue: Brian Gan <brgan@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* sync: Implement fetchcmd for standard Git layoutsGavin Mak2026-06-303-31/+311
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Introduce support for `repo.fetchcmd` configuration, allowing users to specify a custom command to fetch project data instead of `_RemoteFetch`. When `repo.fetchcmd` is specified, `repo` will execute it instead of `_RemoteFetch` during the network half of sync. Note that `repo.fetchcmd` requires `repo.uselocalgitdirs` to be enabled. The command is executed in a subshell with project-context environment variables, including the new `REPO_TREV` (target revision resolved to a commit hash) and `REPO_PROJECT_FETCH_URL`. After execution, `repo` verifies that the target commit is available and that the tracking ref and FETCH_HEAD are correctly updated. Tested with: ``` > ~/git-repo/repo init -u https://android-review.googlesource.com/platform/manifest \ --repo-url file:///usr/local/google/home/gavinmak/git-repo \ --groups developers \ --no-repo-verify \ --use-local-gitdirs ... > git config --file .repo/manifests.git/config repo.fetchcmd 'mkdir -p $REPO_PATH && cd $REPO_PATH && if [ ! -d .git ]; then git init && git remote add aosp $REPO_PROJECT_FETCH_URL; fi && git fetch aosp $REPO_TREV && git reset --hard $REPO_TREV && mkdir -p .git/refs/remotes/aosp && echo $REPO_TREV > .git/refs/remotes/aosp/main && echo $REPO_TREV > .git/FETCH_HEAD' > ~/git-repo/repo sync -j32 warning: repo is not tracking a remote branch, so it will not receive updates; run `repo init --repo-rev=stable` to fix. You are currently enrolled in Git submodules experiment (go/android-submodules-quickstart). Use --no-use-superproject to override. Syncing: 100% (4/4), done in 1m15.686s Finalizing sync state... repo sync has finished successfully. ``` Bug: 513329573 Change-Id: I754d3f3c78e86fdeee1a72115297a75b571bc497 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/583883 Reviewed-by: Becky Siegel <beckysiegel@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* status: Show ahead/behind info for local branchesBrian Gan2026-06-304-3/+272
| | | | | | | | | | | | | | | | | When viewing `repo status`, it is difficult to distinguish between branches that have active unpushed changes and stale branches that are fully synced. Previously, developers had to run commands like `repo forall -c "git status"` to see their ahead/behind counts. This change updates Project.PrintWorkTreeStatus to automatically calculate and display the number of commits a branch is ahead and/or behind its upstream tracking branch. We use `git rev-list --left-right --count` to fetch this information natively and efficiently. If the branch is completely synced with upstream, no extra text is shown. Added tests for ahead-only, behind-only, diverged, no-tracking, and fully-synced branch states. Bug: 319412954 Change-Id: I23879b2d472c7a7e11d01b565428a84b1b4f09c1 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/602423 Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Brian Gan <brgan@google.com> Commit-Queue: Brian Gan <brgan@google.com>
* info: Parallelize project data gathering for JSON outputGavin Mak2026-06-302-2/+54
| | | | | | | | | | | | | | | | | | | | https://gerrit-review.googlesource.com/c/git-repo/+/581921 parallelized `repo info` for text output. This commit does the same for JSON output format. Benchmarked `repo info --format=json` on an Android workspace with ~3k projects (N=3): - Before (sequential): 1m 30s average - After (parallelized): 46s average (~2x speedup) Verified that the JSON output is identical before and after. Bug: 526685287 Change-Id: If573223aba584f8b932f87d29e34ed565c5c930a Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/601861 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Brian Gan <brgan@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* git_trace2_event_log: Fix index out of range on empty config valuesRahul Yadav2026-06-302-2/+9
| | | | | | | | | | | | | | | | | | | | | | In git_trace2_event_log_base.py's GetDataEventName method, it parses value to identify if it represents a JSON list. When a config key has an empty string value, GetDataEventName evaluates value[0], which raises IndexError: string index out of range. This change fixes the crash by checking if the value is a string and using startswith/endswith to check for JSON lists instead of direct indexing. Test: PYTHONPATH=. pytest tests/test_git_trace2_event_log.py Bug: 512518342 TAG=agy CONV=ff5d70d7-e5b3-42b3-8f16-23b9e3070754 Change-Id: Ic40a8c6a22df57d0e97f268f6e1bc8a14a5024a4 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/602201 Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Rahul Yadav <yadavrah@google.com> Commit-Queue: Rahul Yadav <yadavrah@google.com>
* repo: Normalize GNUPGHOME path for MSYS GPG on WindowsGavin Mak2026-06-291-1/+23
| | | | | | | | | | | | Convert GNUPGHOME to a POSIX path using cygpath on Windows so MSYS GPG can read it correctly. Bug: 510840000 Change-Id: I7d25564dd6521f6e887ff45548f42984e709ef5e Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/601121 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Brian Gan <brgan@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* info: Report actual checked-out HEAD revisionGavin Mak2026-06-294-2/+61
| | | | | | | | | | | | | | | | When `repo info` runs, the reported "Current revision" is resolved using the manifest's target branch tracking ref (e.g. refs/remotes/goog/main). Introduce Project.GetHeadRevisionId(), which gets the checked-out HEAD commit in the worktree, and use it in `repo info` with a fallback to the old behavior if the project is not checked out. Bug: 526685287 Change-Id: I72280ce27daa210cada27d722a94e365644f06e0 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/599481 Reviewed-by: Brian Gan <brgan@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* git_config: Support SHA-256 object IDsGavin Mak2026-06-263-4/+28
| | | | | | | | | | | | | Update ID_RE to match both 40-char (SHA-1) and 64-char (SHA-256) IDs as part of Git 3.0 support. Bug: 483758905 Change-Id: Ie5d9a2a5df4c6e7adda7f1d89f1bfb7724846057 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/600341 Reviewed-by: Brian Gan <brgan@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* man: disable line wrappingBrian Gan2026-06-2523-175/+96
| | | | | | | | | | | | | | | | | | When help2man runs the repo script to generate man pages, the argparse module relies on the COLUMNS environment variable to wrap help text. This wrapping can cause URLs and descriptions to be awkwardly broken across lines. Setting COLUMNS="10000" prevents argparse from wrapping the output, keeping URLs intact in the generated man pages. Additionally, this fixes a broken git documentation URL fragment for --partial-clone in the repo script. Bug: 295374161 Change-Id: I0c79f37fbfe2bebe71ff90585f2e5e1f88ea33cb Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/601482 Tested-by: Brian Gan <brgan@google.com> Commit-Queue: Brian Gan <brgan@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* project: fix sync of shallow projects sharing objdirSainath Varanasi2026-06-252-4/+169
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Repo sync fails when the following conditions are met: * There are several checkouts of the same project in different paths. * The checkouts are using git hashes as revisions (not branches). * There is a clone-depth set on these projects. * sync-c="true" is set in the manifest. * The revision specified in the manifest has moved forward since the first repo init. The sync fails because only the first gitdir gets the "shallow" file, and subsequent dirs can't be synced. Do not optimize away the fetch when the conditions above happen. Simplified the boolean check in Sync_NetworkHalf and _RemoteFetch using has_shallow, renamed loop variable to avoid shadowing. Test: create a manifest matching conditions above, repo init, forward the hash, and repo sync. Test: added tests in test_project.py Bug: 505072873 Originally-by: Elvira Khabirova <elvira.khabirova@volvocars.com> Change-Id: I37c533c382e34fc5ddab489c5593b9e5d3875be2 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/601441 Tested-by: Sainath Varanasi <varanasisai@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Sainath Varanasi <varanasisai@google.com>
* agents: Add CRAG-generated review agents and skillsGavin Mak2026-06-244-0/+7248
| | | | | | | | | | | | With cl/930783235, this change sets up two AI review agents that run automatically on new changes. Bug: 522929179 Change-Id: I315a7ec327dd30af842ec890818cf697756fd55c Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/596721 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* gitignore: Add AI agent filesNasser Grainawi2026-06-221-0/+5
| | | | | | | | | | | | | | | | Allow contributors to use local AI agent files without polluting the repository with brand-specific files. Further AI agent improvements will be done roughly following the same framework being used for Chromium [1]. [1] https://chromium.googlesource.com/chromium/src/+/HEAD/agents Change-Id: I791f318b4f9cad1705f94e05522089809097cc96 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/573601 Tested-by: Nasser Grainawi <nasser.grainawi@oss.qualcomm.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Mike Frysinger <vapier@google.com>
* sync: Support pluggable remote helpers for smart sync manifest server.Rahul Yadav2026-06-186-31/+430
| | | | | | | | | | | | | | Introduce support for pluggable remote helpers (declared via the optional 'helper' attribute in <manifest-server>) to dynamically resolve proxy addresses. Route the XML-RPC manifest server connection through the resolved proxy. Bug: b/517477903 Change-Id: I3b6b8ea2640bb077521df4b4a9e8a34a8c6ecdad Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/591642 Tested-by: Rahul Yadav <yadavrah@google.com> Commit-Queue: Rahul Yadav <yadavrah@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* project: Add REPO_PROJECT_FETCH_URL environment variableGavin Mak2026-06-164-0/+8
| | | | | | | | | | | | | Add REPO_PROJECT_FETCH_URL to Project.GetEnvVars(), which resolves to the remote fetch URL of the project. This is useful for exposing the URL to custom fetch commands or other external scripts. Bug: 513329573 Change-Id: Ic2b0a83493934d16bb1152366ee4e1a2c35ea2dc Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/596121 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* sync: do not init sibling submodules in parallelJosef Malmström2026-06-162-11/+87
| | | | | | | | | | | | | | | | | | | Initializing a submodule requires locking <parent>/.git/config. As the implementation was currently doing this in parallel for sibling submodules, it lead to a race condition causing intermittent errors like: error: could not lock config file .git/config: File exists This commit enforces that sibling submodules are initialized sequentially, eliminating the race condition. Change-Id: I5ffb3de90276ba43e262d0e279a3d34324220b63 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/591241 Tested-by: Josef Malmstrom <Josef.Malmstrom@arm.com> Commit-Queue: Josef Malmstrom <Josef.Malmstrom@arm.com> Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* repo: Bump launcher version to 2.65Gavin Mak2026-06-111-1/+1
| | | | | | | | | | | | | | https://gerrit-review.git.corp.google.com/c/git-repo/+/569001 didn't update the repo launcher script version for the newly added `--use-local-gitdirs` flag. Bug: 513329573 Bug: 508146070 Change-Id: I07ad939a40466ed50e439c815608797689fd505f Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/587381 Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* project: handle corrupted projects in DeleteWorktreeGavin Mak2026-06-052-32/+89
| | | | | | | | | | | | Catch GitError from IsDirty() during DeleteWorktree so corrupted projects can be cleanly wiped instead of crashing. Bug: 515415221 Change-Id: Ic03ae77c30a722f9aa06f2220747251e0aea4ab7 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/591001 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* project: Extract project envvar generation to GetEnvVarsGavin Mak2026-05-273-21/+133
| | | | | | | | | | | | Move project environment variable setup from subcmds/forall.py to a reusable Project.GetEnvVars() helper method. Bug: 513329573 Change-Id: I3b4b113aa5a086e5fa5eaf4461c7ce517d928610 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/583881 Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* sync: Skip copyfile/linkfile for unavailable projectsXin Li2026-05-271-0/+2
| | | | | | | | | | | | | | | | | | | | | | | Commit 5534f16 made UpdateCopyLinkfileList to retry _CopyAndLinkFiles for all projects in the manifest to handle directory-to-symlink transistions. However, for partial sync's (e.g. repo sync <project>), projects not included in the sync may not have their local directories populated, attempts to perform the operation on unavailable projects would result in dangling symlinks, or errors like: error: Cannot copy file <source> to <destination> Fix this by adding a check inside _CopyAndLinkFiles in project.py to so these operations happen only when the project's worktree exists and is a directory. TAG=agy CONV=90f5fca7-2199-4017-8f62-a010b0ab1dbf Change-Id: I9ae1e8d62d8fd129cb4535e574c38339c87af441 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/587501 Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Xin Li <delphij@google.com>
* tests: Deduplicate test setup in test_project.pyGavin Mak2026-05-261-45/+54
| | | | | | | | | Bug: 513329573 Change-Id: Id729c590a69d2e81d4bce2942c65bd0b3ce3a11a Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/583882 Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Dan Willemsen <dwillemsen@google.com>
* init: Add --use-local-gitdirs for standard Git layoutsGavin Mak2026-05-267-10/+144
| | | | | | | | | | | | | Introduce --use-local-gitdirs to bypass repo's symlink-based layouts in favor of standard local .git directories. Bug: 513329573 Bug: 508146070 Change-Id: I53d1602e61be0b86964529bcbea3dc801471f9c9 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/569001 Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Dan Willemsen <dwillemsen@google.com>
* sync: Add --superproject-rev flag to sync to specific revisionv2.64Gavin Mak2026-05-205-10/+271
| | | | | | | | | | | | | | | | | Allow syncing the outer manifest to a state defined by a specific superproject revision. It updates the superproject, reads the manifest commit from .supermanifest, and checks out the outer manifest project to that commit. Submanifests are then processed normally, allowing them to be updated to the revisions specified in the new outer manifest state. Bug: 416589884 Change-Id: I304c37a2b8794f9b74cb7e5e209a8a93762bdb52 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/576321 Commit-Queue: Gavin Mak <gavinmak@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* Fix submodules not synced for repeated repoJosef Malmström2026-05-202-1/+90
| | | | | | | | | | | | | | | | | | | If I check out e.g. multiple branches of the same repo in one manifest, only the submodules of one checkout are synced. Fix this by adding the relative path of the checkout as a key to the mapping of derived projects, preventing overwrite. The fix was originally proposed here: https://issues.gerritcodereview.com/issues/40013218 Bug: 40013218 Change-Id: Ia86518ccf2c0af7bd7e4daf8d703a55b7e10ba52 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/581062 Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Josef Malmstrom <Josef.Malmstrom@arm.com> Tested-by: Josef Malmstrom <Josef.Malmstrom@arm.com>
* Automated: Migrate gerrit/git-repo from gsutil to gcloud storagegurusai-voleti2026-05-142-10/+11
| | | | | | | | | Bug: 486536908 Change-Id: I248b093e189a3784b8959e837a5d66857f1ce0fc Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/577201 Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Guru sai rama subbarao Voleti (xWF) <gvoleti@google.com> Commit-Queue: Guru sai rama subbarao Voleti (xWF) <gvoleti@google.com>
* abandon/start/info: Make them respect smart sync overrideGavin Mak2026-05-143-0/+4
| | | | | | | | | | | | | | | | Call TryOverrideManifestWithSmartSync in start, abandon, and info commands. This ensures they pick up the pinned revisions from the smart sync override manifest if it exists, rather than falling back to ToT from the default manifest. Bug: 279204331 Change-Id: I637f054a77773805daf0bf9cf5a712d82a5959b4 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/582503 Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* command: Move smart sync override logic to Command base classGavin Mak2026-05-143-10/+18
| | | | | | | | | | | | | Deduplicate the logic for loading `smart_sync_override.xml` by moving it from `forall.py` to the `Command` base class. This allows other commands to reuse it to respect smart tags. Bug: 279204331 Change-Id: I6f2f03995266c2a68c3225cacb92b2f580a89178 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/582502 Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* docs: drop period in headersMike Frysinger2026-05-142-3/+3
| | | | | | | | | | We don't do this in most places, so standardize the outliers. Change-Id: I80c1ef16c5fa7355dcb7797bc8e56852b22c24d5 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/583641 Tested-by: Mike Frysinger <vapier@google.com> Commit-Queue: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* run_tests: help2man: update to latest releaseMike Frysinger2026-05-143-10/+10
| | | | | | | | Change-Id: I30e4a6452ac5504b782fe545a59ca1f58ac70385 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/583621 Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Mike Frysinger <vapier@google.com>
* Fix missing `None` check in Remote.SaveJosef Malmström2026-05-132-1/+22
| | | | | | | | | | | | | | | | | | | | | | | | This code was causing an exception in cases where `pushUrl` was set but `projectname` was not. This can happen when `pushUrl` is set for the manifest repo which does not have a `projectname`. For example: repo init --manifest-url ssh://url.to/my/manifest cd .repo/manifests git config remote.origin.pushurl ssh://url.to/my/manifest repo init --manifest-url ssh://url.to/my/manifest --repo-rev main The last `repo init` invocation causes an error. Change-Id: Ibb68c8446880cfbac22feee595d1fd1b678c7ade Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/579162 Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Josef Malmstrom <Josef.Malmstrom@arm.com> Tested-by: Josef Malmstrom <Josef.Malmstrom@arm.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* Add support for self referencing submodulesJosef Malmström2026-05-132-1/+83
| | | | | | | | | | | | | | | | | | | | | | | | | | | | When working with relative submodule paths, The "./" needs special handling similar to "../". See information on: https://git-scm.com/docs/git-submodule Which currently states: "<repository> is the URL of the new submodule’s origin repository. This may be either an absolute URL, or (if it begins with ./ or ../), the location relative to the superproject’s default remote repository (Please note that to specify a repository foo.git which is located right next to a superproject bar.git, you’ll have to use ../foo.git instead of ./foo.git - as one might expect when following the rules for relative URLs - because the evaluation of relative URLs in Git is identical to that of relative directories)." The implementation also was not handling file/directory names starting with "." or "..". Explicitly look for "./" and "../" instead. Change-Id: I8ae68d61fb0cbb1624183b175236e98a36e4afdb Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/579182 Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Josef Malmstrom <Josef.Malmstrom@arm.com> Tested-by: Josef Malmstrom <Josef.Malmstrom@arm.com>
* release: update-manpages: revert color filteringMike Frysinger2026-05-122-26/+1
| | | | | | | | | | | We pull a pinned help2man from cipd now, so we should get stable behavior between developers. That means the color filtering should not be necessary anymore, and we can drop the logic & unittest. Change-Id: Ib53e1ce7f8d610d7f624c9a019c79dc5f438ac0d Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/582402 Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* linkfile: Handle directory-to-symlink transitions safelyCarlos Fernandez2026-05-126-9/+320
| | | | | | | | | | | | | | | | | | | | | | | | | | When a manifest changes from individual linkfiles inside a directory (e.g. dest=".llms/rules", dest=".llms/skills") to a single linkfile for the whole directory (e.g. dest=".llms", src="dot-llms"), two things need to happen: 1. __linkIt must replace a real directory with a symlink. Use os.rmdir() instead of platform_utils.remove() for real directories. rmdir only removes empty directories, so user-created content is never deleted. 2. UpdateCopyLinkfileList must handle the cleanup correctly: - Use os.rmdir() for directories (safe for non-empty) - Remove empty parent directories after cleaning old dests - Retry _CopyAndLinkFiles for all projects, since in interleaved sync mode _CopyAndLinkFiles runs before cleanup and may have failed because the directory was not yet empty Change-Id: I0437b80beab98bce064cea81c11c47d699be91aa Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/569243 Tested-by: Carlos Fernandez <carlosfsanz@meta.com> Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Carlos Fernandez <carlosfsanz@meta.com>
* run_tests: leverage cipd when available for help2manMike Frysinger2026-05-126-10/+76
| | | | | | | | | | | | | This tool isn't installed on CI bot images so we've been skipping it, but this is causing people to not run tests locally, and ignore errors. Use cipd to pull the tool in when available. Then revert a recent man change that the tool rejects. Change-Id: I1030d0070fd5a624656eba7434ae6ec99b2e3f2d Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/582401 Reviewed-by: Greg Edelston <gredelston@google.com> Tested-by: Mike Frysinger <vapier@google.com>
* sync: Re-raise KeyboardInterrupt in main processGavin Mak2026-05-123-0/+63
| | | | | | | | | | | | | | | | When running sync -j1, worker functions run directly in the main process. Swallowing KeyboardInterrupt causes the loop to continue to the next project instead of aborting. Re-raise KeyboardInterrupt if running in the MainProcess, while maintaining the suppression of stack traces in worker processes. Bug: 468170157 Change-Id: I156d66bc209a265f7fa25eea0eb88737d1b51a34 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/581342 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* git_config: fix error message command outputMike Frysinger2026-05-121-1/+1
| | | | | | | | | | | | | | | | | | str() inside an f-string is redundant. Actually join the array together as a string to show a proper error message, and include the full command line, not the extra options passed in. Before: error.GitError: git config ('--null', '--list'): fatal: unable to read config file 'xxx': No such file or directory After: error.GitError: git config --system --includes --null --list: fatal: unable to read config file 'xxx': No such file or directory Change-Id: I8983389aa2e0de7808991e73e636b77810f04c4b Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/582341 Commit-Queue: Mike Frysinger <vapier@google.com> Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* info: Parallelize repo info to improve performanceGreg Edelston2026-05-123-95/+183
| | | | | | | | | | | | | | | | | | | | | For a large checkout like chromiumos or android, `repo info` takes a really long time! On my machine it took ~6 minutes. On a randomly selected ChromiumOS cq-orchestrator build it took 4.1 minutes: https://ci.chromium.org/b/8682060180498819729. This adds up to a lot of wasted runtime for both humans and bots. The problem is that `repo info` was single-threaded, which causes poor performance when the checkout has 1000+ projects. We already have a pattern for parallelization; let's use it. BUG=None TEST=Manually run, ensure no diff Change-Id: I6b82b9495eb2a0e602a142dd3a16f09217871e1b Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/581921 Tested-by: Greg Edelston <gredelston@google.com> Commit-Queue: Greg Edelston <gredelston@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* sync: Exclude stateless sync pruned projects from bloat checkGavin Mak2026-05-112-1/+21
| | | | | | | | | | | | If a project has been pruned for stateless sync, it has already undergone aggressive garbage collection. There should be no bloat to check for. Change-Id: I9233a4611e05b7a0b7c097827d6f408144f7380d Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/581841 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Becky Siegel <beckysiegel@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* completion: document installation and usage in READMEGavin Mak2026-05-081-0/+37
| | | | | | | | | | | Add a "Shell Completion" section to README.md to document how to install and use `completion.bash` and `completion.zsh`. Change-Id: Ibf6c81043af6c24d45ea2dc6a6caa26d98ab7374 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/581261 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* sync: Suggest "git repack -a -d" in bloat warningGavin Mak2026-05-081-2/+2
| | | | | | | | | | | | | | | | | | The warning suggests running "repo sync --auto-gc" which runs "git gc --auto". Git may decide not to repack if its internal thresholds are not met, leaving the warning active even after running the suggested command. "git repack -a -d" forces all reachable objects into a single pack and deletes redundant packs, reducing the pack count to 1. This guarantees that the warning (which triggers when pack count exceeds 10) goes away. Bug: 505755299 Change-Id: I10163ef8efb7f3b7c5055378ad95051974d11b88 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/580821 Reviewed-by: Becky Siegel <beckysiegel@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* Add zsh completionKamal Sacranie2026-05-081-0/+449
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This PR adds `completion.zsh` to allow for relatively intelligent completion of `repo` command-line arguments for all commands of the `repo` CLI. The `completion.zsh` can be added to your zsh completions by copying (and renaming) the completion script to a directory that you have added to your zsh completion path. ``` cp completion.zsh $ZSH_COMPLETION_DIRECTORY/_repo ``` You must name the file `_repo` for it to register as completion for `repo`. You can add a directory to your zsh completion by updating your `fpath` variable before calling `compinit` as follows: ``` fpath=( /path/to/zsh-completions/dir $fpath ) ``` Future work: Generate this file using the subcommand classes and python reflection. Change-Id: I6a4e785c1efcf9076bd693976ac03578836b691b Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/579561 Commit-Queue: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Kamal Sacranie <sacranie@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* forall: Document REPO_UPSTREAM and REPO_DEST_BRANCH envvarsGavin Mak2026-05-072-1/+12
| | | | | | | Change-Id: I74365295152f8828587c6b4ed93029efc6000881 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/580761 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* info: add --format and --include-summary/--include-projects optionsCarlos Fernandez2026-05-073-21/+349
| | | | | | | | | | | | | | | | | | | Add --format={text,json} to produce machine-readable output, and boolean options to control which sections are displayed: --include-summary / --no-include-summary (default: on) --include-projects / --no-include-projects (default: on) The JSON output respects the include flags, so callers can request only the fields they need (e.g. `repo info --format=json --no-include-projects` for manifest metadata only). Change-Id: I9641bc4023b630d9c61c5170eb86e5f3b787236f Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/569203 Commit-Queue: Carlos Fernandez <carlosfsanz@meta.com> Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Carlos Fernandez <carlosfsanz@meta.com> Tested-by: Carlos Fernandez <carlosfsanz@meta.com>
* sync: Fix force_checkout propagationJosef Malmström2026-05-062-1/+31
| | | | | | | | | | | | | | | | | The force_checkout parameter was not propagated in all calls to Checkout in Sync_LocalHalf. Without this, repo sync --force-checkout can still fail for projects currently on a local branch with no upstream/tracking configuration, because the detach-to-manifest checkout was executed without -f, leaving local modifications or untracked files able to block sync. Change-Id: I58551388e2f906c4db96e220707a369057a71c24 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/579181 Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Josef Malmstrom <Josef.Malmstrom@arm.com> Tested-by: Josef Malmstrom <Josef.Malmstrom@arm.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* git_superproject: Remove redundant _branch variableGavin Mak2026-04-282-6/+7
| | | | | | | | | | | Both variables were initialized to the same value and never modified. Bug: 416589884 Change-Id: Iaa1ffffb4543d4cd9391ac679d9234fe01678861 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/576921 Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* tests: Add tests for repo status outputNasser Grainawi2026-04-231-0/+220
| | | | | | | | | | | | | | | | | | Build out status subcommand unit coverage using a minimal fake repo checkout wired through XmlManifest. The new tests verify: - clean status output prints the expected project header - modified tracked files appear with the expected status marker - `-o` output includes the orphan section and orphan entries - branch names shown in status reflect a started non-default branch Change-Id: Ia7c22593d0bbdc4aed81faeb168b846f3e4016ab Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/558501 Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Nasser Grainawi <nasser.grainawi@oss.qualcomm.com> Commit-Queue: Nasser Grainawi <nasser.grainawi@oss.qualcomm.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* color: type SetDefaultColoring and drop bool statesNasser Grainawi2026-04-222-3/+15
| | | | | | | | | | | | | | Also add a test fixture to always disable coloring so that we get reproducible test behavior. The few tests that want to check color behavior (e.g. test_color.py) can still reset/change color values as needed. Change-Id: I1808139a63e0862c29bf81d7097e885ca8561040 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/573621 Reviewed-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Commit-Queue: Nasser Grainawi <nasser.grainawi@oss.qualcomm.com> Tested-by: Nasser Grainawi <nasser.grainawi@oss.qualcomm.com>
* Add timing keyword argument for hooksRam Peri2026-04-214-5/+58
| | | | | | | | | | | | | | | | | | | | | Measure the duration of the sync operation in the Execute method of the Sync command and pass it to post-sync hooks as a standard keyword argument (`sync_duration_seconds`). Updates based on code review: - Update _API_ARGS in hooks.py to allow sync_duration_seconds for post-sync hooks. - Do not cast sync_duration_seconds to int for better granularity. - Update docs/repo-hooks.md to document sync_duration_seconds. - Add unit test for argument validation in test_hooks.py. Test: Ran run_tests using venv python, all 554 tests passed. Bug: TBD Change-Id: Ie29e002a5d283460d993ad96c224dbf4b6d7985c Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/575021 Tested-by: Arif Kasim <arifkasim@google.com> Commit-Queue: Ram Peri <ramperi@google.com> Reviewed-by: Arif Kasim <arifkasim@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* sync: Refactor to use _RunOneGC and fix config leakagev2.63Gavin Mak2026-04-202-26/+42
| | | | | | | | | | | | | | | | Extract _RunOneGC to handle GC on a single project. This refactoring makes it easier to invoke GC from parallel worker tasks. Also, avoid modifying the passed-in config dictionary in _RunOneGC by creating a local copy, preventing unintended side effects on other commands sharing the same config. Bug: 498290329 Change-Id: I7b77ed6629b14b5ee3322870b9c6c8ce2bfd6ea2 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/574923 Reviewed-by: Becky Siegel <beckysiegel@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>