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