summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* sync: Add heuristic warning for bloated shallow repositoriesv2.60Gavin Mak2025-12-101-0/+104
| | | | | | | | | | | | | | | | | For clone-depth="1" repositories that are dirty or have local commits, add a check at the end of sync to detect excessive git object accumulation. This prevents silent performance degradation and disk exhaustion in large prebuilts repos where automatic GC is typically disabled from https://gerrit.googlesource.com/git-repo/+/7f87c54043ce9a35a5bb60a09ee846f9d7070352 Bug: 379111283 Change-Id: I376f38e1555cc6e906d852f6e63dc1c8f6331b4f Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/534701 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* project: disable auto-gc on fetch for projects with clone-depth=1Gavin Mak2025-12-081-0/+10
| | | | | | | | | | | | This prevents GC hangs on repos with large binaries by skipping implicit GC during network fetch, using clone-depth=1 as a heuristic. Bug: 379111283 Change-Id: I977bf8cd521b11e37eba7ebc9f62120f2bbaf760 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/533802 Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* Prevent leftover bare gitdirs after failed sync attemptsKaushik Lingarkar2025-12-051-17/+53
| | | | | | | | | | | | | | | | | | The gitdir for a project may be left in a state with bare=true due to a previous failed sync. In this state, during a subsequent sync attempt, repo will skip initializing the gitdir (since the directory already exists) and directly attempt to checkout the worktree, which will fail because the project is bare. To reduce the chance of this happening, initialize the gitdir in a temp directory and move it once it is ready. Bug: 457478027 Change-Id: I4767494a3a54e7734174eae3a0d939fa9d174288 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/524203 Tested-by: Kaushik Lingarkar <kaushikl@qti.qualcomm.com> Commit-Queue: Kaushik Lingarkar <kaushikl@qti.qualcomm.com> Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* project: Make the error message more logical when a linkfile failPeter Kjellerstedt2025-12-031-3/+1
| | | | | | | | | | | | Due to the odd naming of the arguments to symlink(), the error when it failed to create a symbolic link was misleading. Change-Id: I1d0f30ade5970d80186f13e01c426b066cd1062f Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/532541 Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* info: Print a newline after printing the superproject's revisionPeter Kjellerstedt2025-12-031-0/+1
| | | | | | | | | Change-Id: Ib20233dad4e1f1fd54dbf5ca0324be22fe0e4db1 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/528463 Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* Rename XmlManifest.GetGroupsStr() to XmlManifest.GetManifestGroupsStr()Peter Kjellerstedt2025-12-035-6/+7
| | | | | | | | | | | This makes it more clear what kind of groups it refers to. Change-Id: I47369050d1436efcc77f3a69d5b7c99a536b23bc Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/528462 Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* manifest_xml, git_superproject: Rename an argument for XmlManifest.ToXml()Peter Kjellerstedt2025-12-022-10/+10
| | | | | | | | | | | | Rename the groups argument to filter_groups to make it more clear what kind of groups it refers to. Change-Id: I90e6e9aa74a7e3e697705dd4bf8676226055878b Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/528461 Reviewed-by: Mike Frysinger <vapier@google.com> Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* docs: manifest-format: reformat spec to align the CDATA partsMike Frysinger2025-12-022-29/+41
| | | | | | | | | | | Most of the file was doing this, but we've been inconsistent when adding new entries. Realign all of them. Change-Id: I99ddb3a1e859235b249b6f08731bdadad8086d4e Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/532461 Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Mike Frysinger <vapier@google.com> Tested-by: Mike Frysinger <vapier@google.com>
* manifest: Propagate revision attribute through multiple levels of includePeter Kjellerstedt2025-11-264-10/+40
| | | | | | | | | | | | Make sure a revision attribute for an include element is propagated through multiple levels of manifest includes. Change-Id: If37d65b0cd47da673719976598175d0eb6b7cbbe Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/525341 Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* manifest, project: Store project groups as setsPeter Kjellerstedt2025-11-265-60/+62
| | | | | | | | | | | | This helps a lot when including common manifests with groups and they use extend-project. Change-Id: Ic574e7d6696139d0eb90d9915e8c7048d5e89c07 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/525323 Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Mike Frysinger <vapier@google.com> Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
* project: Use dicts to keep track of copyfiles and linkfilesPeter Kjellerstedt2025-11-264-40/+131
| | | | | | | | | | | | | | | | | | | | | | This avoids copying/linking the same file/link multiple times if a copyfile/linkfile element with the same values has been specifed multiple times. This can happen when including a common manifest that uses an extend-project element that has a copyfile/linkfile element. This uses dicts rather than sets to store the copyfiles and linkfiles to make sure the order they are specified in the manifest is maintained. For Python 3.7+, maintaining the order that keys are added to dicts is guaranteed, and for Python 3.6 it happened to be true. The _CopyFile class and the _LinkFile class are changed to inherit from NamedTuple to be able to store them in dicts. Change-Id: I9f5a80298b875251a81c5fe7d353e262d104fae4 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/525322 Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
* manifest: Make include groups propagate to extend-project elementsPeter Kjellerstedt2025-11-264-2/+42
| | | | | | | | | | | | Any groups specified to an include element should propagate to any extend-project elements and then on to the projects. Change-Id: I62b95689cc13660858564ae569cbfd095961ecc7 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/525321 Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
* wipe: Add new `repo wipe` subcommandGavin Mak2025-11-214-1/+512
| | | | | | | | | | | | | | | | This new command allows users to delete projects from the worktree and from the `.repo` directory. It is a destructive operation. It handles shared projects by refusing to wipe them unless the `--force` flag is used. It also checks for uncommitted changes before wiping. Bug: 393383056 Change-Id: Ia30d8ffdc781a3f179af56310ce31c9dae331bbe Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/490801 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* tests: manifest_xml: convert most path usage to pathlibMike Frysinger2025-11-111-57/+49
| | | | | | | | | | | Should be functionally the same, but with pathlib APIs that we've been slowly adopting in other places, especially unittests. Change-Id: I81364117f8eaeaf138097cdfc484d4848b7ea5bd Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/525881 Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Mike Frysinger <vapier@google.com>
* man: Regenerate after manifest updatePeter Kjellerstedt2025-11-061-11/+16
| | | | | | | | | Change-Id: I0e7ef5d4189eaaf6878be709b437ecfb57570e3f Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/524921 Commit-Queue: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
* manifest: Make extend-project support copyfile, linkfile and annotationPeter Kjellerstedt2025-10-273-12/+101
| | | | | | | | | | This allows an existing project to be extended by these elements. Change-Id: I6826e518f39ca86485301491639101943b7e2ae0 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/519781 Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* sync: fix saving of fetch times and local statev2.59Gavin Mak2025-10-202-147/+167
| | | | | | | | | | | | | | | | | Interleaved sync didn't save _fetch_times and _local_sync_state to disk. Phased sync saved them, but incorrectly applied moving average smoothing repeatedly when fetching submodules, and discarded historical data during partial syncs. Move .Save() calls to the end of main sync loops to ensure they run once. Update _FetchTimes.Save() to merge new data with existing history, preventing data loss. Change-Id: I174f98a62ac86859f1eeea1daba65eb35c227852 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/519821 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* run_tests: log each command runMike Frysinger2025-10-151-5/+23
| | | | | | | | | | This should make it clear to devs what commands are run and which fail in the CI. Change-Id: Ie863540cba6de7da933b4f32947ad09edee4aa45 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/519361 Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* sync: Use 'git rebase' during 'repo sync --rebase'Jeroen Dhollander2025-10-151-12/+20
| | | | | | | | | | | | | | | | | | | | | | | | | 'repo sync --rebase' should do a rebase if it encounters local commits during a 'repo sync'. This was broken by https://gerrit-review.git.corp.google.com/c/git-repo/+/437421, which caused this to execute the '_doff' hook (which stands for 'do fast forward'), which is implemented using 'git merge --no-stat'. This caused *multiple* actual editor windows to pop up (*) during 'repo sync --rebase', asking the user to enter a commit message for the merge. In this CL I explicitly make that code path do a 'git rebase'. (*) and if you use a terminal editor like 'vim', this means you have 2+ concurrent vim windows rendered in the same terminal, while 'repo sync' keeps on printing other output lines, again in the same terminal. The result is .... not pretty to say the least :( Bug: b:434565811 Test: Used it myself for over a week. Change-Id: I0bf3ff181f15b9d5b2e3f85f7f84e302139fdab7 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/518602 Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Jeroen Dhollander <jeroendh@google.com> Commit-Queue: Jeroen Dhollander <jeroendh@google.com>
* Fix submodule initialization in interleaved sync modeKaushik Lingarkar2025-10-141-14/+31
| | | | | | | | | | | | | | | | | | | | | | | With the introduction of interleaved sync mode, the submodule activation logic broke because the 'has_submodules' attribute was no longer being populated when needed. With this change, each submodule is initialized when it enters the Sync_LocalHalf stage, whereas previously all submodules were initialized at once when the parent repository entered the Sync_LocalHalf stage. The init is now retried if it fails, as submodules may concurrently modify the parent’s git config, potentially causing contention when attempting to obtain a lock on it. This change makes the submodule activation logic more robust and less prone to breakage. Bug: 444366154 Change-Id: I25eca4ea2a6868219045cfa088988eb01ded47d2 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/509041 Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Kaushik Lingarkar <kaushikl@qti.qualcomm.com> Reviewed-by: Nasser Grainawi <nasser.grainawi@oss.qualcomm.com> Commit-Queue: Kaushik Lingarkar <kaushikl@qti.qualcomm.com> Reviewed-by: Scott Lee <ddoman@google.com>
* Follow up "Fix shallow clones when upstream attribute is present"Kaushik Lingarkar2025-09-221-2/+6
| | | | | | | | | | | | | | | | | | This reverts commit 38d2fe11b9df521727fcca23c9dac086ce8378d3. Reason for revert: The issue described in I00acd4c61 remains unresolved. The previous fix incorrectly accessed use_superproject from the Project class, though it was only defined in ManifestProject. This change uses it from the manifest attr available in the Project class. Bug: b/427093249 Change-Id: Ife6d46cd85840f2989f60c2ca4d5a7dcf5d7477a Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/508821 Reviewed-by: Xin Li <delphij@google.com> Reviewed-by: Krzysztof Wesolowski <krzysztof.wesolowski@volvocars.com> Commit-Queue: Kaushik Lingarkar <kaushikl@qti.qualcomm.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Kaushik Lingarkar <kaushikl@qti.qualcomm.com>
* forall: fix crash with no commandMike Frysinger2025-09-172-2/+8
| | | | | | | | | | | | | | When callback= is used, optparse does not automatically initialize The destination when a dest= is not specified. Refine the test to allow dest= options when callback= is used even when it seems like it is otherwise redundant. Bug: b/436611422 Change-Id: I5185f95cb857ca6d37357cac77fb117a83db9c0c Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/509861 Tested-by: Mike Frysinger <vapier@google.com> Commit-Queue: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* run_tests: add file header checker for licensing blocksMike Frysinger2025-08-213-4/+167
| | | | | | | | Change-Id: Ic0bfa3b03e2ba46d565a5bc2c1b7a7463b7dca2c Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/500103 Commit-Queue: Mike Frysinger <vapier@google.com> Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Scott Lee <ddoman@google.com>
* man: regen after sync updatesMike Frysinger2025-08-212-10/+34
| | | | | | | | Change-Id: I20937c365b3f0be76e278d17c05b76a0d5e59deb Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/500101 Tested-by: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Mike Frysinger <vapier@google.com>
* standardize file header wrt licensingMike Frysinger2025-08-2117-17/+30
| | | | | | | | | | | We've been slightly inconsistent in the license header in files. Standardize them so we can automate checking. Change-Id: I3cdf85c9485d33cac2bb05c8080dfada3e5a5e8d Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/500102 Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Mike Frysinger <vapier@google.com> Commit-Queue: Mike Frysinger <vapier@google.com>
* CONTRIBUTING: rename doc per Google OSS policiesMike Frysinger2025-08-203-2/+2
| | | | | | | | | | Google OSS policies say to name this "CONTRIBUTING.md". Change-Id: I037f52a443caacc89868b7c14af91dd3d1b681a9 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/499761 Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Mike Frysinger <vapier@google.com> Commit-Queue: Mike Frysinger <vapier@google.com>
* Revert "Fix shallow clones when upstream attribute is present"v2.58Gavin Mak2025-08-141-6/+2
| | | | | | | | | | | | | This reverts commit d9cc0a15265299b6dcfc1d65f192fd14cfb17b02. Reason for revert: AttributeError: 'Project' object has no attribute 'use_superproject' Bug: b/427093249 Change-Id: I57b285ab21f58b040e68ec14b85425f43f0abcca Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/498641 Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* git_superproject: fix AttributeError in Superproject loggingGavin Mak2025-08-141-1/+2
| | | | | | | | | | | | | Ensure _git_event_log is initialized before use in _LogMessage. This avoids crashes when _git_event_log is accessed before it's set, such as during repo info. Bug: 435317391 Change-Id: I3adc32d6a9377558e852bbb43f9cf82041fcf1bc Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/498521 Commit-Queue: Gavin Mak <gavinmak@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com>
* sync: Fix missing error details in interleaved summaryGavin Mak2025-08-142-29/+27
| | | | | | | | | | | | | | When checkout errors occurred in interleaved sync, they were wrapped in a SyncError with no message, causing blank lines in the final summary. Refactor _SyncResult to hold a list of exceptions, ensuring the original error messages are propagated correctly. Bug: 438178765 Change-Id: Ic25e515068959829cb6290cfd9e4c2d3963bbbea Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/498342 Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* sync: Record and propagate errors from deferred actionsGavin Mak2025-08-133-16/+25
| | | | | | | | | | | | | Failures in deferred sync actions were not recorded because `_Later.Run` discarded the `GitError` exception. Record the specific error using `syncbuf.fail()` and propagate it for proper error aggregation and reporting. Bug: 438178765 Change-Id: Iad59e389f9677bd6b8d873ee1ea2aa6ce44c86fa Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/498141 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com>
* progress: Fix race condition causing fileno crashGavin Mak2025-08-131-7/+10
| | | | | | | | | A race condition occurs when sync redirects sys.stderr to capture worker output, while a background progress thread simultaneously calls fileno() on it. This causes an io.UnsupportedOperation error. Fix by caching the original sys.stderr for all progress bar IO. Change-Id: Idb1f45d707596d31238a19fd373cac3bf669c405 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/498121 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com>
* sync: Avoid duplicate projects in error textGavin Mak2025-08-131-13/+7
| | | | | | | | | | | | | Keep track of finished projects, not just successful ones, when deciding which projects still need to be synced. Also project errors are already reported by sync workers so stall detection doesn't need to add failed projects to the error list. Bug: 438178765 Change-Id: Ibf15aad009ba7295e70c8df2ff158215085e9732 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/498062 Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* sync: always show sync result stderr_text on errorGavin Mak2025-08-131-1/+2
| | | | | | | | | | | _ProcessSyncInterleavedResults currently only shows stderr_text if verbose. Show it if a sync worker fails, regardless of verbosity. Bug: 438178765 Change-Id: If24dcb10fb5d6857386782d371e3f9c6844dece9 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/498061 Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* Fix shallow clones when upstream attribute is presentKrzysztof Wesolowski2025-08-051-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The _CheckForImmutableRevision method was modified in commit 0e776a58 to include upstream branch validation for superproject scenarios. However, this change inadvertently broke shallow clones when both clone-depth and upstream attributes are specified in regular (non-superproject) manifests. Issue: When upstream is present, _CheckForImmutableRevision performs two additional checks: 1. git rev-list on the upstream reference 2. git merge-base --is-ancestor between revision and upstream In shallow clones, the upstream branch history may not be available locally, causing these checks to fail. This triggers the retry mechanism that removes depth limitations, effectively converting shallow clones to full clones, resulting in excessive disk usage. Fix: Make upstream validation conditional on superproject usage. This preserves the original superproject fix while restoring the method's original behavior for regular scenarios - checking only if the immutable revision (SHA1/tag) exists locally. Note: The SetRevisionId method from the same commit 0e776a58 is left unchanged as it only stores upstream information (no git operations), which is beneficial for preserving branch context for commands like 'repo start' without causing fetch-related issues. The fix ensures that manifests with both clone-depth and upstream work correctly in non-superproject scenarios, maintaining shallow clone efficiency and reducing disk usage. Bug: b/427093249 Change-Id: I00acd4c61b179cd2abf796c2fecb7a2f38016a18 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/493883 Tested-by: Krzysztof Wesolowski <krzysztof.wesolowski@volvocars.com> Commit-Queue: Krzysztof Wesolowski <krzysztof.wesolowski@volvocars.com> Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Kamaljeet Maini <kamaljeet@google.com> Reviewed-by: Xin Li <delphij@google.com>
* project: fallback to reading HEAD when rev-parse failsv2.57.3Gavin Mak2025-08-041-1/+22
| | | | | | | | | | | | | git rev-parse fails on invalid HEAD, e.g. after incomplete sync, causing NoManifestException. Fall back to v2.56's direct file reading when rev-parse fails. Bug: 435045466 Change-Id: Ia14560335110c00d80408b2a93595a84446f8a57 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/495181 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* hooks: verify hooks project has worktree before runningv2.57.2Gavin Mak2025-07-281-3/+3
| | | | | | | | | | | Skip hook if its project is not present on disk. Bug: 434232630 Change-Id: I09a8b412d078af7a068d533f7be320d5b02327be Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/494441 Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* sync: fix connection error on macOS for interleaved syncKuang-che Wu2025-07-281-0/+1
| | | | | | | | | | Bug: 377538810 Test: on macos, repo sync -j64 Change-Id: I6af4d4e6669dc882f165cbb9142ad4db9b346b73 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/494241 Reviewed-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Kuang-che Wu <kcwu@google.com> Tested-by: Kuang-che Wu <kcwu@google.com>
* project: Fix GetHead to handle detached HEADsGavin Mak2025-07-251-1/+5
| | | | | | | | | | | | | The switch to git rev-parse caused GetHead() to return the literal string 'HEAD' when in a detached state. This broke repo prune, which expects a commit SHA. Bug: 434077990 Change-Id: I80b7d5965749096b59e854f61e913aa74c857b99 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/494401 Reviewed-by: Scott Lee <ddoman@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* sync: Don't checkout if no worktreev2.57.1Gavin Mak2025-07-232-43/+69
| | | | | | | | | | Interleaved sync should not try checkout out a project if it's a mirror. Change-Id: I2549faab197a3202d79a10e44b449b68d53e3fe7 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/492942 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* sync: Default to interleaved modev2.57Gavin Mak2025-07-211-5/+14
| | | | | | | | | | | | | The previous default, "phased" sync (separate network and checkout phases), can now be selected with `--no-interleaved`. Bug: 421935613 Bug: 432082000 Change-Id: Ia8624daa609a28ea2f87f8ea4b42138d8b3e9269 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/489681 Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* project: Use git rev-parse to read HEADGavin Mak2025-07-211-11/+3
| | | | | | | | | | | Don't directly read `.git/HEAD`, git already has a command for this. Bug: 432200791 Change-Id: Iba030650224143eb07c44da1fa56341d9deb4288 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/492941 Reviewed-by: Scott Lee <ddoman@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* sync: Improve UI and error reporting for interleaved modeGavin Mak2025-07-172-2/+19
| | | | | | | | | | | | | This fixes two issues: 1. the progress bar could show a count greater than the total if new projects were discovered mid-sync. Update the progress bar total dynamically 2. Make "Stall detected" error message more actionable Bug: 432206932 Change-Id: Ie2a4ada5b1770cae0302fb06590641c522cbb7e7 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/491941 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* project: Use plumbing commands to manage HEADGavin Mak2025-07-171-10/+3
| | | | | | | | | | | | Don't directly manipulate `.git/HEAD` since it bypasses Git's internal state management. Bug: 432200791 Change-Id: I1c9264bcf107d34574a82b60a22ea2c83792951b Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/491841 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* progress: Make end() idempotentGavin Mak2025-07-021-0/+5
| | | | | | | | | | | This fixes the double "done" text on successful interleaved sync. Bug: 421935613 Change-Id: I4f01418cb0340129a8f0a2a5835f7e3fa6a6b119 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/487081 Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* sync: support post-sync hook in <repo-hooks>Kenny Cheng2025-07-013-0/+58
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add support for a new hook type "post-sync" declared in the manifest using <repo-hooks>. This allows executing a script automatically after a successful `repo sync`. This is useful for initializing developer environments, installing project-wide Git hooks, generating configs, and other post-sync automation tasks. Example manifest usage: <project name="myorg/repo-hooks" path="hooks" revision="main" /> <repo-hooks in-project="myorg/repo-hooks" enabled-list="post-sync"> <hook name="post-sync" /> </repo-hooks> The hook script must be named `post-sync.py` and located at the root of the hook project. The post-sync hook does not block `repo sync`; if the script fails, the sync still completes successfully with a warning. Test: Added `post-sync.py` in hook project and verified it runs after `repo sync` Bug: b/421694721 Change-Id: I69f3158f0fc319d73a85028d6e90fea02c1dc8c8 Signed-off-by: Kenny Cheng <chao.shun.cheng.tw@gmail.com> Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/480581 Reviewed-by: Scott Lee <ddoman@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
* init: Add environment variable for git-lfsMatt Moeller2025-06-301-0/+1
| | | | | | | | | | | | | | | | | | | | Convenient way to always enable or disable git-lfs without having to remember to put on the command line. Useful if you want to ALWAYS have git-lfs enabled on your system when you 'init' a new project. Also useful if you are using the Jenkins repo plugin as it doesn't provide an option for enabling git-lfs in its UI. Change-Id: Ieb1bbe83de9c21523ab69b30fc5047c257d02731 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/437661 Commit-Queue: Scott Lee <ddoman@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Fatahillah Wk <fatahillahwkwk@gmail.com> Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Matt Moeller <moeller.matt@gmail.com> Reviewed-by: Yingchun Li <sword.l.dragon@gmail.com>
* sync: Share final error handling logic between sync modesv2.56Gavin Mak2025-06-231-27/+72
| | | | | | | | | | | | | | | Dedupe error reporting logic for phased and interleaved sync modes by extracting it into _ReportErrors. Error reporting will now distinguish between network and local failures and lists the specific repos that failed in each phase. Bug: 421935613 Change-Id: I4604a83943dbbd71d979158d7a1c4b8c243347d2 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/484541 Tested-by: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com>
* sync: Share manifest list update logic between sync modesGavin Mak2025-06-231-30/+55
| | | | | | | | | | | | Extract the manifest update loop from _SyncPhased into a new _UpdateManifestLists method and use it in both sync types. Bug: 421935613 Change-Id: If499a3ce4a0bbb3c4641dba52ca5c1c82b11f16f Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/484341 Reviewed-by: Scott Lee <ddoman@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* sync: Share self-update logic between sync modesGavin Mak2025-06-232-10/+160
| | | | | | | | | | | | | | | | The logic for checking for repo self-updates lives in _FetchMain, which is part of the "phased" sync path. Extract this logic into a new _UpdateRepoProject helper method. Call this common helper from _ExecuteHelper before either sync mode begins, so the repo self-update check is always performed. Bug: 421935613 Change-Id: I9a804f43fbf6239c4146be446040be531f12fc8a Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/484041 Reviewed-by: Scott Lee <ddoman@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
* sync: clarify job flags when using interleavedGavin Mak2025-06-183-6/+9
| | | | | | | | | | | --jobs-network and --jobs-checkout are ignored with --interleaved. Bug: 421935613 Change-Id: Ib69413993c4f970b385bd09318972716e5ac3324 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/485021 Tested-by: Gavin Mak <gavinmak@google.com> Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com>