| @@ -14,9 +14,10 @@ from git.util import RemoteProgress | |||||
| __all__ = ["update_bookmarks", "update_directories"] | __all__ = ["update_bookmarks", "update_directories"] | ||||
| BOLD = Style.BRIGHT | BOLD = Style.BRIGHT | ||||
| RED = Fore.RED + BOLD | |||||
| GREEN = Fore.GREEN + BOLD | |||||
| BLUE = Fore.BLUE + BOLD | BLUE = Fore.BLUE + BOLD | ||||
| GREEN = Fore.GREEN + BOLD | |||||
| RED = Fore.RED + BOLD | |||||
| YELLOW = Fore.YELLOW + BOLD | |||||
| RESET = Style.RESET_ALL | RESET = Style.RESET_ALL | ||||
| INDENT1 = " " * 3 | INDENT1 = " " * 3 | ||||
| @@ -103,57 +104,57 @@ def _is_up_to_date(repo, branch, upstream): | |||||
| def _rebase(repo, name): | def _rebase(repo, name): | ||||
| """Rebase the current HEAD of *repo* onto the branch *name*.""" | """Rebase the current HEAD of *repo* onto the branch *name*.""" | ||||
| print(" rebasing...", end="") | |||||
| print(GREEN + "rebasing...", end="") | |||||
| try: | try: | ||||
| res = repo.git.rebase(name) | res = repo.git.rebase(name) | ||||
| except exc.GitCommandError as err: | except exc.GitCommandError as err: | ||||
| msg = err.stderr.replace("\n", " ").strip() | msg = err.stderr.replace("\n", " ").strip() | ||||
| if "unstaged changes" in msg: | if "unstaged changes" in msg: | ||||
| print(" error:", "unstaged changes.") | |||||
| print(RED, "error:" + RESET, "unstaged changes", end=")") | |||||
| elif "uncommitted changes" in msg: | elif "uncommitted changes" in msg: | ||||
| print(" error:", "uncommitted changes.") | |||||
| print(RED, "error:" + RESET, "uncommitted changes", end=")") | |||||
| else: | else: | ||||
| try: | try: | ||||
| repo.git.rebase("--abort") | repo.git.rebase("--abort") | ||||
| except exc.GitCommandError: | except exc.GitCommandError: | ||||
| pass | pass | ||||
| print(" error:", msg if msg else "rebase conflict") | |||||
| print(RED, "error:" + RESET, msg if msg else "conflict", end=")") | |||||
| else: | else: | ||||
| print(" done.") | |||||
| print("\b" * 6 + " " * 6 + "\b" * 6 + GREEN + "ed", end=")") | |||||
| def _merge(repo, name): | def _merge(repo, name): | ||||
| """Merge the branch *name* into the current HEAD of *repo*.""" | """Merge the branch *name* into the current HEAD of *repo*.""" | ||||
| print(" merging...", end="") | |||||
| print(GREEN + "merging...", end="") | |||||
| try: | try: | ||||
| repo.git.merge(name) | repo.git.merge(name) | ||||
| except exc.GitCommandError as err: | except exc.GitCommandError as err: | ||||
| msg = err.stderr.replace("\n", " ").strip() | msg = err.stderr.replace("\n", " ").strip() | ||||
| if "local changes" in msg and "would be overwritten" in msg: | if "local changes" in msg and "would be overwritten" in msg: | ||||
| print(" error:", "uncommitted changes.") | |||||
| print(RED, "error:" + RESET, "uncommitted changes", end=")") | |||||
| else: | else: | ||||
| try: | try: | ||||
| repo.git.merge("--abort") | repo.git.merge("--abort") | ||||
| except exc.GitCommandError: | except exc.GitCommandError: | ||||
| pass | pass | ||||
| print(" error:", msg if msg else "merge conflict") | |||||
| print(RED, "error:" + RESET, msg if msg else "conflict", end=")") | |||||
| else: | else: | ||||
| print(" done.") | |||||
| print("\b" * 6 + " " * 6 + "\b" * 6 + GREEN + "ed", end=")") | |||||
| def _update_branch(repo, branch, merge, rebase, stasher=None): | def _update_branch(repo, branch, merge, rebase, stasher=None): | ||||
| """Update a single branch.""" | """Update a single branch.""" | ||||
| print(INDENT2, "Updating", branch, end="...") | |||||
| print(BOLD + branch.name, end=" (") | |||||
| upstream = branch.tracking_branch() | upstream = branch.tracking_branch() | ||||
| if not upstream: | if not upstream: | ||||
| print(" skipped: no upstream is tracked.") | |||||
| print(YELLOW + "skipped:" + RESET, "no upstream is tracked", end=")") | |||||
| return | return | ||||
| try: | try: | ||||
| branch.commit, upstream.commit | branch.commit, upstream.commit | ||||
| except ValueError: | except ValueError: | ||||
| print(" skipped: branch contains no revisions.") | |||||
| print(YELLOW + "skipped:" + RESET, "branch has no revisions", end=")") | |||||
| return | return | ||||
| if _is_up_to_date(repo, branch, upstream): | if _is_up_to_date(repo, branch, upstream): | ||||
| print(" up to date.") | |||||
| print(BLUE + "up to date", end=")") | |||||
| return | return | ||||
| if stasher: | if stasher: | ||||
| @@ -167,16 +168,19 @@ def _update_branch(repo, branch, merge, rebase, stasher=None): | |||||
| def _update_branches(repo, active, merge, rebase): | def _update_branches(repo, active, merge, rebase): | ||||
| """Update a list of branches.""" | """Update a list of branches.""" | ||||
| print(INDENT2, "Updating: ", end="") | |||||
| _update_branch(repo, active, merge, rebase) | _update_branch(repo, active, merge, rebase) | ||||
| branches = set(repo.heads) - {active} | branches = set(repo.heads) - {active} | ||||
| if branches: | if branches: | ||||
| stasher = _Stasher(repo) | stasher = _Stasher(repo) | ||||
| try: | try: | ||||
| for branch in sorted(branches, key=lambda b: b.name): | for branch in sorted(branches, key=lambda b: b.name): | ||||
| print(", ", end="") | |||||
| _update_branch(repo, branch, merge, rebase, stasher) | _update_branch(repo, branch, merge, rebase, stasher) | ||||
| finally: | finally: | ||||
| active.checkout() | active.checkout() | ||||
| stasher.restore() | stasher.restore() | ||||
| print(".") | |||||
| def _update_repository(repo, current_only=False, rebase=False, merge=False): | def _update_repository(repo, current_only=False, rebase=False, merge=False): | ||||
| """Update a single git repository by fetching remotes and rebasing/merging. | """Update a single git repository by fetching remotes and rebasing/merging. | ||||