diff options
-rw-r--r-- | project.py | 45 |
1 files changed, 31 insertions, 14 deletions
@@ -642,10 +642,6 @@ class Project: | |||
642 | # project containing repo hooks. | 642 | # project containing repo hooks. |
643 | self.enabled_repo_hooks = [] | 643 | self.enabled_repo_hooks = [] |
644 | 644 | ||
645 | # This will be updated later if the project has submodules and | ||
646 | # if they will be synced. | ||
647 | self.has_subprojects = False | ||
648 | |||
649 | def RelPath(self, local=True): | 645 | def RelPath(self, local=True): |
650 | """Return the path for the project relative to a manifest. | 646 | """Return the path for the project relative to a manifest. |
651 | 647 | ||
@@ -1563,8 +1559,8 @@ class Project: | |||
1563 | # TODO(https://git-scm.com/docs/git-worktree#_bugs): Re-evaluate if | 1559 | # TODO(https://git-scm.com/docs/git-worktree#_bugs): Re-evaluate if |
1564 | # submodules can be init when using worktrees once its support is | 1560 | # submodules can be init when using worktrees once its support is |
1565 | # complete. | 1561 | # complete. |
1566 | if self.has_subprojects and not self.use_git_worktrees: | 1562 | if self.parent and not self.use_git_worktrees: |
1567 | self._InitSubmodules() | 1563 | self._InitSubmodule() |
1568 | all_refs = self.bare_ref.all | 1564 | all_refs = self.bare_ref.all |
1569 | self.CleanPublishedCache(all_refs) | 1565 | self.CleanPublishedCache(all_refs) |
1570 | revid = self.GetRevisionId(all_refs) | 1566 | revid = self.GetRevisionId(all_refs) |
@@ -2359,8 +2355,6 @@ class Project: | |||
2359 | ) | 2355 | ) |
2360 | result.append(subproject) | 2356 | result.append(subproject) |
2361 | result.extend(subproject.GetDerivedSubprojects()) | 2357 | result.extend(subproject.GetDerivedSubprojects()) |
2362 | if result: | ||
2363 | self.has_subprojects = True | ||
2364 | return result | 2358 | return result |
2365 | 2359 | ||
2366 | def EnableRepositoryExtension(self, key, value="true", version=1): | 2360 | def EnableRepositoryExtension(self, key, value="true", version=1): |
@@ -3030,16 +3024,39 @@ class Project: | |||
3030 | project=self.name, | 3024 | project=self.name, |
3031 | ) | 3025 | ) |
3032 | 3026 | ||
3033 | def _InitSubmodules(self, quiet=True): | 3027 | def _InitSubmodule(self, quiet=True): |
3034 | """Initialize the submodules for the project.""" | 3028 | """Initialize the submodule.""" |
3035 | cmd = ["submodule", "init"] | 3029 | cmd = ["submodule", "init"] |
3036 | if quiet: | 3030 | if quiet: |
3037 | cmd.append("-q") | 3031 | cmd.append("-q") |
3038 | if GitCommand(self, cmd).Wait() != 0: | 3032 | cmd.extend(["--", self.worktree]) |
3039 | raise GitError( | 3033 | max_retries = 3 |
3040 | f"{self.name} submodule init", | 3034 | base_delay_secs = 1 |
3041 | project=self.name, | 3035 | jitter_ratio = 1 / 3 |
3036 | for attempt in range(max_retries): | ||
3037 | git_cmd = GitCommand( | ||
3038 | None, | ||
3039 | cmd, | ||
3040 | cwd=self.parent.worktree, | ||
3041 | capture_stdout=True, | ||
3042 | capture_stderr=True, | ||
3042 | ) | 3043 | ) |
3044 | if git_cmd.Wait() == 0: | ||
3045 | return | ||
3046 | error = git_cmd.stderr or git_cmd.stdout | ||
3047 | if "lock" in error: | ||
3048 | delay = base_delay_secs * (2**attempt) | ||
3049 | delay += random.uniform(0, delay * jitter_ratio) | ||
3050 | logger.warning( | ||
3051 | f"Attempt {attempt+1}/{max_retries}: " | ||
3052 | + f"git {' '.join(cmd)} failed." | ||
3053 | + f" Error: {error}." | ||
3054 | + f" Sleeping {delay:.2f}s before retrying." | ||
3055 | ) | ||
3056 | time.sleep(delay) | ||
3057 | else: | ||
3058 | break | ||
3059 | git_cmd.VerifyCommand() | ||
3043 | 3060 | ||
3044 | def _Rebase(self, upstream, onto=None): | 3061 | def _Rebase(self, upstream, onto=None): |
3045 | cmd = ["rebase"] | 3062 | cmd = ["rebase"] |