git-pull.shon commit Merge commit 'b319ef7' into jc/maint-fix-test-perm (00d3278)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano
   4#
   5# Fetch one or more remote refs and merge it/them into the current HEAD.
   6
   7USAGE='[-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff] [-s strategy]... [<fetch-options>] <repo> <head>...'
   8LONG_USAGE='Fetch one or more remote refs and merge it/them into the current HEAD.'
   9SUBDIRECTORY_OK=Yes
  10OPTIONS_SPEC=
  11. git-sh-setup
  12set_reflog_action "pull $*"
  13require_work_tree
  14cd_to_toplevel
  15
  16test -z "$(git ls-files -u)" ||
  17        die "You are in the middle of a conflicted merge."
  18
  19strategy_args= diffstat= no_commit= squash= no_ff= log_arg= verbosity=
  20curr_branch=$(git symbolic-ref -q HEAD)
  21curr_branch_short=$(echo "$curr_branch" | sed "s|refs/heads/||")
  22rebase=$(git config --bool branch.$curr_branch_short.rebase)
  23while :
  24do
  25        case "$1" in
  26        -q|--quiet)
  27                verbosity="$verbosity -q" ;;
  28        -v|--verbose)
  29                verbosity="$verbosity -v" ;;
  30        -n|--no-stat|--no-summary)
  31                diffstat=--no-stat ;;
  32        --stat|--summary)
  33                diffstat=--stat ;;
  34        --log|--no-log)
  35                log_arg=$1 ;;
  36        --no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit)
  37                no_commit=--no-commit ;;
  38        --c|--co|--com|--comm|--commi|--commit)
  39                no_commit=--commit ;;
  40        --sq|--squ|--squa|--squas|--squash)
  41                squash=--squash ;;
  42        --no-sq|--no-squ|--no-squa|--no-squas|--no-squash)
  43                squash=--no-squash ;;
  44        --ff)
  45                no_ff=--ff ;;
  46        --no-ff)
  47                no_ff=--no-ff ;;
  48        -s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\
  49                --strateg=*|--strategy=*|\
  50        -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
  51                case "$#,$1" in
  52                *,*=*)
  53                        strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
  54                1,*)
  55                        usage ;;
  56                *)
  57                        strategy="$2"
  58                        shift ;;
  59                esac
  60                strategy_args="${strategy_args}-s $strategy "
  61                ;;
  62        -r|--r|--re|--reb|--reba|--rebas|--rebase)
  63                rebase=true
  64                ;;
  65        --no-r|--no-re|--no-reb|--no-reba|--no-rebas|--no-rebase)
  66                rebase=false
  67                ;;
  68        -h|--h|--he|--hel|--help)
  69                usage
  70                ;;
  71        *)
  72                # Pass thru anything that may be meant for fetch.
  73                break
  74                ;;
  75        esac
  76        shift
  77done
  78
  79error_on_no_merge_candidates () {
  80        exec >&2
  81        for opt
  82        do
  83                case "$opt" in
  84                -t|--t|--ta|--tag|--tags)
  85                        echo "Fetching tags only, you probably meant:"
  86                        echo "  git fetch --tags"
  87                        exit 1
  88                esac
  89        done
  90
  91        curr_branch=${curr_branch#refs/heads/}
  92
  93        if [ -z "$curr_branch" ]; then
  94                echo "You are not currently on a branch, so I cannot use any"
  95                echo "'branch.<branchname>.merge' in your configuration file."
  96                echo "Please specify which branch you want to merge on the command"
  97                echo "line and try again (e.g. 'git pull <repository> <refspec>')."
  98                echo "See git-pull(1) for details."
  99        else
 100                echo "You asked me to pull without telling me which branch you"
 101                echo "want to merge with, and 'branch.${curr_branch}.merge' in"
 102                echo "your configuration file does not tell me either.  Please"
 103                echo "specify which branch you want to merge on the command line and"
 104                echo "try again (e.g. 'git pull <repository> <refspec>')."
 105                echo "See git-pull(1) for details."
 106                echo
 107                echo "If you often merge with the same branch, you may want to"
 108                echo "configure the following variables in your configuration"
 109                echo "file:"
 110                echo
 111                echo "    branch.${curr_branch}.remote = <nickname>"
 112                echo "    branch.${curr_branch}.merge = <remote-ref>"
 113                echo "    remote.<nickname>.url = <url>"
 114                echo "    remote.<nickname>.fetch = <refspec>"
 115                echo
 116                echo "See git-config(1) for details."
 117        fi
 118        exit 1
 119}
 120
 121test true = "$rebase" && {
 122        git update-index --ignore-submodules --refresh &&
 123        git diff-files --ignore-submodules --quiet &&
 124        git diff-index --ignore-submodules --cached --quiet HEAD -- ||
 125        die "refusing to pull with rebase: your working tree is not up-to-date"
 126
 127        . git-parse-remote &&
 128        reflist="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
 129        oldremoteref="$(git rev-parse -q --verify \
 130                "$reflist")"
 131}
 132orig_head=$(git rev-parse -q --verify HEAD)
 133git fetch $verbosity --update-head-ok "$@" || exit 1
 134
 135curr_head=$(git rev-parse -q --verify HEAD)
 136if test -n "$orig_head" && test "$curr_head" != "$orig_head"
 137then
 138        # The fetch involved updating the current branch.
 139
 140        # The working tree and the index file is still based on the
 141        # $orig_head commit, but we are merging into $curr_head.
 142        # First update the working tree to match $curr_head.
 143
 144        echo >&2 "Warning: fetch updated the current branch head."
 145        echo >&2 "Warning: fast forwarding your working tree from"
 146        echo >&2 "Warning: commit $orig_head."
 147        git update-index -q --refresh
 148        git read-tree -u -m "$orig_head" "$curr_head" ||
 149                die 'Cannot fast-forward your working tree.
 150After making sure that you saved anything precious from
 151$ git diff '$orig_head'
 152output, run
 153$ git reset --hard
 154to recover.'
 155
 156fi
 157
 158merge_head=$(sed -e '/  not-for-merge   /d' \
 159        -e 's/  .*//' "$GIT_DIR"/FETCH_HEAD | \
 160        tr '\012' ' ')
 161
 162case "$merge_head" in
 163'')
 164        case $? in
 165        0) error_on_no_merge_candidates "$@";;
 166        1) echo >&2 "You are not currently on a branch; you must explicitly"
 167           echo >&2 "specify which branch you wish to merge:"
 168           echo >&2 "  git pull <remote> <branch>"
 169           exit 1;;
 170        *) exit $?;;
 171        esac
 172        ;;
 173?*' '?*)
 174        if test -z "$orig_head"
 175        then
 176                die "Cannot merge multiple branches into empty head"
 177        fi
 178        if test true = "$rebase"
 179        then
 180                die "Cannot rebase onto multiple branches"
 181        fi
 182        ;;
 183esac
 184
 185if test -z "$orig_head"
 186then
 187        git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
 188        git read-tree --reset -u HEAD || exit 1
 189        exit
 190fi
 191
 192merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit
 193test true = "$rebase" &&
 194        exec git-rebase $diffstat $strategy_args --onto $merge_head \
 195        ${oldremoteref:-$merge_head}
 196exec git-merge $diffstat $no_commit $squash $no_ff $log_arg $strategy_args \
 197        "$merge_name" HEAD $merge_head $verbosity