diff --git a/lib/ulib/vcs b/lib/ulib/vcs index 79cbad9..9e7ccd0 100644 --- a/lib/ulib/vcs +++ b/lib/ulib/vcs @@ -451,26 +451,42 @@ function git_update() { return 1 } - git pull "$@" || return - if [ -n "$autoff" ]; then - local orig_branch restore_branch rbranch - local -a branches - git_check_cleancheckout || return 0 - orig_branch="$(git_get_branch)" - array_from_lines branches "$(git_list_branches)" - for branch in "${branches[@]}"; do - remote="$(git_get_branch_remote "$branch")" - rbranch="$(git_get_branch_rbranch "$branch" "$remote")" - [ -n "$remote" -a -n "$rbranch" ] || continue + if [ -z "$autoff" ]; then + git pull "$@" + return $? + fi + + local orig_branch restore_branch remote rbranch pbranch + local -a branches + + git fetch -p "$@" || return + + git_check_cleancheckout || return 0 + orig_branch="$(git_get_branch)" + array_from_lines branches "$(git_list_branches)" + for branch in "${branches[@]}"; do + remote="$(git_get_branch_remote "$branch")" + rbranch="$(git_get_branch_rbranch "$branch" "$remote")" + pbranch="${rbranch#refs/remotes/}" + [ -n "$remote" -a -n "$rbranch" ] || continue + if git_is_ancestor "$branch" "$rbranch"; then if git_should_ff "$branch" "$rbranch"; then - echo "Fast-forwarding $branch..." + echo "* Fast-forwarding $branch -> $pbranch" git checkout -q "$branch" git merge -q --ff-only "$rbranch" restore_branch=1 fi - done - [ -n "$restore_branch" ] && git checkout -q "$orig_branch" - fi + else + if [ "$branch" == "$orig_branch" ]; then + echo "* Cannot fast-forward CURRENT branch $branch from $pbranch +Try to merge manually with: git merge $pbranch" + else + echo "* Cannot fast-forward local branch $branch from $pbranch +You can merge manually with: git checkout $branch; git merge $pbranch" + fi + fi + done + [ -n "$restore_branch" ] && git checkout -q "$orig_branch" return 0 } function git_push() {