git-pull.shon commit Merge branch 'mr/gitweb-xz' (dad1a45)
   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        if ! git rev-parse -q --verify HEAD >/dev/null
 123        then
 124                # On an unborn branch
 125                if test -f "$GIT_DIR/index"
 126                then
 127                        die "updating an unborn branch with changes added to the index"
 128                fi
 129        else
 130                git update-index --ignore-submodules --refresh &&
 131                git diff-files --ignore-submodules --quiet &&
 132                git diff-index --ignore-submodules --cached --quiet HEAD -- ||
 133                die "refusing to pull with rebase: your working tree is not up-to-date"
 134        fi
 135        oldremoteref= &&
 136        . git-parse-remote &&
 137        remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
 138        oldremoteref="$(git rev-parse -q --verify "$remoteref")" &&
 139        for reflog in $(git rev-list -g $remoteref 2>/dev/null)
 140        do
 141                if test "$reflog" = "$(git merge-base $reflog $curr_branch)"
 142                then
 143                        oldremoteref="$reflog"
 144                        break
 145                fi
 146        done
 147}
 148orig_head=$(git rev-parse -q --verify HEAD)
 149git fetch $verbosity --update-head-ok "$@" || exit 1
 150
 151curr_head=$(git rev-parse -q --verify HEAD)
 152if test -n "$orig_head" && test "$curr_head" != "$orig_head"
 153then
 154        # The fetch involved updating the current branch.
 155
 156        # The working tree and the index file is still based on the
 157        # $orig_head commit, but we are merging into $curr_head.
 158        # First update the working tree to match $curr_head.
 159
 160        echo >&2 "Warning: fetch updated the current branch head."
 161        echo >&2 "Warning: fast forwarding your working tree from"
 162        echo >&2 "Warning: commit $orig_head."
 163        git update-index -q --refresh
 164        git read-tree -u -m "$orig_head" "$curr_head" ||
 165                die 'Cannot fast-forward your working tree.
 166After making sure that you saved anything precious from
 167$ git diff '$orig_head'
 168output, run
 169$ git reset --hard
 170to recover.'
 171
 172fi
 173
 174merge_head=$(sed -e '/  not-for-merge   /d' \
 175        -e 's/  .*//' "$GIT_DIR"/FETCH_HEAD | \
 176        tr '\012' ' ')
 177
 178case "$merge_head" in
 179'')
 180        case $? in
 181        0) error_on_no_merge_candidates "$@";;
 182        1) echo >&2 "You are not currently on a branch; you must explicitly"
 183           echo >&2 "specify which branch you wish to merge:"
 184           echo >&2 "  git pull <remote> <branch>"
 185           exit 1;;
 186        *) exit $?;;
 187        esac
 188        ;;
 189?*' '?*)
 190        if test -z "$orig_head"
 191        then
 192                die "Cannot merge multiple branches into empty head"
 193        fi
 194        if test true = "$rebase"
 195        then
 196                die "Cannot rebase onto multiple branches"
 197        fi
 198        ;;
 199esac
 200
 201if test -z "$orig_head"
 202then
 203        git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
 204        git read-tree --reset -u HEAD || exit 1
 205        exit
 206fi
 207
 208merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit
 209test true = "$rebase" &&
 210        exec git-rebase $diffstat $strategy_args --onto $merge_head \
 211        ${oldremoteref:-$merge_head}
 212exec git-merge $diffstat $no_commit $squash $no_ff $log_arg $strategy_args \
 213        "$merge_name" HEAD $merge_head $verbosity