(self)
| 32 | self.cmd += f"{type(self).__name__.lower()} {'--set-upstream ' if self.set_upstream else ''}{self.remote if self.remote else ''} {self.branch if self.branch else ''}" |
| 33 | |
| 34 | def construct(self): |
| 35 | if not settings.stdout and not settings.output_only_path and not settings.quiet: |
| 36 | print(f"{settings.INFO_STRING} {self.cmd}") |
| 37 | |
| 38 | self.show_intro() |
| 39 | |
| 40 | # Configure paths to make local clone to run networked commands in |
| 41 | git_root = self.repo.git.rev_parse("--show-toplevel") |
| 42 | repo_name = os.path.basename(self.repo.working_dir) |
| 43 | new_dir = os.path.join(tempfile.gettempdir(), "git_sim", repo_name) |
| 44 | new_dir2 = os.path.join(tempfile.gettempdir(), "git_sim", repo_name + "2") |
| 45 | |
| 46 | # Save remotes |
| 47 | orig_remotes = self.repo.remotes |
| 48 | |
| 49 | # Create local clone of local repo |
| 50 | self.repo = git.Repo.clone_from(git_root, new_dir, no_hardlinks=True) |
| 51 | if self.remote: |
| 52 | for r in orig_remotes: |
| 53 | if self.remote == r.name: |
| 54 | remote_url = r.url |
| 55 | break |
| 56 | else: |
| 57 | remote_url = orig_remotes[0].url |
| 58 | |
| 59 | # Create local clone of remote repo to simulate push to so we don't touch the real remote |
| 60 | self.remote_repo = git.Repo.clone_from( |
| 61 | remote_url, new_dir2, no_hardlinks=True, bare=True |
| 62 | ) |
| 63 | |
| 64 | # Reset local clone remote to the local clone of remote repo |
| 65 | if self.remote: |
| 66 | for r in self.repo.remotes: |
| 67 | if self.remote == r.name: |
| 68 | r.set_url(new_dir2) |
| 69 | else: |
| 70 | self.repo.remotes[0].set_url(new_dir2) |
| 71 | |
| 72 | # Push the local clone into the local clone of the remote repo |
| 73 | push_result = 0 |
| 74 | self.orig_repo = None |
| 75 | try: |
| 76 | self.repo.git.push(self.remote, self.branch) |
| 77 | # If push fails... |
| 78 | except git.GitCommandError as e: |
| 79 | if "rejected" in e.stderr and ("fetch first" in e.stderr): |
| 80 | push_result = 1 |
| 81 | self.orig_repo = self.repo |
| 82 | self.repo = self.remote_repo |
| 83 | settings.color_by = ColorByOptions.NOTLOCAL1 |
| 84 | elif "rejected" in e.stderr and ("non-fast-forward" in e.stderr): |
| 85 | push_result = 2 |
| 86 | self.orig_repo = self.repo |
| 87 | self.repo = self.remote_repo |
| 88 | settings.color_by = ColorByOptions.NOTLOCAL2 |
| 89 | else: |
| 90 | print(f"git-sim error: git push failed: {e.stderr}") |
| 91 | return |
nothing calls this directly
no test coverage detected