|
|
@@ -43,16 +43,28 @@ def _update_repository(repo, current_only=False, rebase=False, merge=False, |
|
|
|
""" |
|
|
|
def _update_branch(branch): |
|
|
|
"""Update a single branch.""" |
|
|
|
print(INDENT2, "Updating branch:", branch, end=" ") |
|
|
|
print(INDENT2, "Updating", branch, end="...") |
|
|
|
upstream = branch.tracking_branch() |
|
|
|
if not upstream: |
|
|
|
print("Branch is not tracking any remote.") |
|
|
|
continue |
|
|
|
print(" skipped; no upstream is tracked.") |
|
|
|
return |
|
|
|
if branch.commit == upstream.commit: |
|
|
|
print(" up to date.") |
|
|
|
return |
|
|
|
branch.checkout() |
|
|
|
c_attr = "branch.{0}.rebase".format(branch.name) |
|
|
|
if not merge and (rebase or repo_rebase or _read_config(repo, c_attr)): |
|
|
|
### TODO: rebase |
|
|
|
print(" rebasing...", end="") |
|
|
|
try: |
|
|
|
res = repo.git.rebase(upstream.name) |
|
|
|
except exc.GitCommandError as err: |
|
|
|
print(err) |
|
|
|
### TODO: ... |
|
|
|
else: |
|
|
|
print(" done.") |
|
|
|
else: |
|
|
|
### TODO: merge |
|
|
|
repo.git.merge(upstream.name) |
|
|
|
### TODO: etc |
|
|
|
|
|
|
|
print(INDENT1, BOLD + os.path.split(repo.working_dir)[1] + ":") |
|
|
|
|
|
|
@@ -65,56 +77,29 @@ def _update_repository(repo, current_only=False, rebase=False, merge=False, |
|
|
|
remotes = [repo.remotes[ref.remote_name]] |
|
|
|
else: |
|
|
|
remotes = repo.remotes |
|
|
|
if not remotes: |
|
|
|
print(INDENT2, ERROR, "no remotes configured to pull from.") |
|
|
|
return |
|
|
|
|
|
|
|
for remote in remotes: |
|
|
|
print(INDENT2, "Fetching remote:", remote.name) |
|
|
|
remote.fetch() # TODO: show progress |
|
|
|
print(INDENT2, "Fetching", remote.name, end="...") |
|
|
|
remote.fetch() ### TODO: show progress |
|
|
|
print(" done.") |
|
|
|
|
|
|
|
repo_rebase = _read_config(repo, "pull.rebase") |
|
|
|
|
|
|
|
_update_branch(active) |
|
|
|
branches = set(repo.heads) - {active} |
|
|
|
if branches: |
|
|
|
stashed = repo.git.stash("--all") != "No local changes to save" |
|
|
|
stashed = repo.git.stash("--all") != "No local changes to save" ### TODO: don't do this unless actually necessary |
|
|
|
try: |
|
|
|
for branch in sorted(branches, key=lambda b: b.name): |
|
|
|
branch.checkout() |
|
|
|
_update_branch(branch) |
|
|
|
finally: |
|
|
|
active.checkout() |
|
|
|
if stashed: |
|
|
|
repo.git.stash("pop") |
|
|
|
|
|
|
|
##################################### |
|
|
|
|
|
|
|
try: |
|
|
|
last_commit = _exec_shell("git log -n 1 --pretty=\"%ar\"") |
|
|
|
except subprocess.CalledProcessError: |
|
|
|
last_commit = "never" # Couldn't get a log, so no commits |
|
|
|
|
|
|
|
if not dry_fetch: # No new changes to pull |
|
|
|
print(INDENT2, BLUE + "No new changes." + RESET, |
|
|
|
"Last commit was {0}.".format(last_commit)) |
|
|
|
|
|
|
|
else: # Stuff has happened! |
|
|
|
print(INDENT2, "There are new changes upstream...") |
|
|
|
status = _exec_shell("git status") |
|
|
|
|
|
|
|
if status.endswith("nothing to commit, working directory clean"): |
|
|
|
print(INDENT2, GREEN + "Pulling new changes...") |
|
|
|
result = _exec_shell("git pull") |
|
|
|
if last_commit == "never": |
|
|
|
print(INDENT2, "The following changes have been made:") |
|
|
|
else: |
|
|
|
print(INDENT2, "The following changes have been made since", |
|
|
|
last_commit + ":") |
|
|
|
print(result) |
|
|
|
|
|
|
|
else: |
|
|
|
print(INDENT2, RED + "Warning:" + RESET, |
|
|
|
"you have uncommitted changes in this repository!") |
|
|
|
print(INDENT2, "Ignoring.") |
|
|
|
|
|
|
|
def _update_subdirectories(path, long_name, update_args): |
|
|
|
"""Update all subdirectories that are git repos in a given directory.""" |
|
|
|
repos = [] |
|
|
|