git-pull.shon commit merge, pull: introduce '--(no-)stat' option (d8abe14)
   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= no_stat= no_commit= squash= no_ff=
  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        -n|--no-stat|--no-summary)
  27                no_stat=-n ;;
  28        --stat|--summary)
  29                no_stat=$1 ;;
  30        --no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit)
  31                no_commit=--no-commit ;;
  32        --c|--co|--com|--comm|--commi|--commit)
  33                no_commit=--commit ;;
  34        --sq|--squ|--squa|--squas|--squash)
  35                squash=--squash ;;
  36        --no-sq|--no-squ|--no-squa|--no-squas|--no-squash)
  37                squash=--no-squash ;;
  38        --ff)
  39                no_ff=--ff ;;
  40        --no-ff)
  41                no_ff=--no-ff ;;
  42        -s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\
  43                --strateg=*|--strategy=*|\
  44        -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
  45                case "$#,$1" in
  46                *,*=*)
  47                        strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
  48                1,*)
  49                        usage ;;
  50                *)
  51                        strategy="$2"
  52                        shift ;;
  53                esac
  54                strategy_args="${strategy_args}-s $strategy "
  55                ;;
  56        -r|--r|--re|--reb|--reba|--rebas|--rebase)
  57                rebase=true
  58                ;;
  59        --no-r|--no-re|--no-reb|--no-reba|--no-rebas|--no-rebase)
  60                rebase=false
  61                ;;
  62        -h|--h|--he|--hel|--help)
  63                usage
  64                ;;
  65        *)
  66                # Pass thru anything that may be meant for fetch.
  67                break
  68                ;;
  69        esac
  70        shift
  71done
  72
  73error_on_no_merge_candidates () {
  74        exec >&2
  75        for opt
  76        do
  77                case "$opt" in
  78                -t|--t|--ta|--tag|--tags)
  79                        echo "Fetching tags only, you probably meant:"
  80                        echo "  git fetch --tags"
  81                        exit 1
  82                esac
  83        done
  84
  85        curr_branch=${curr_branch#refs/heads/}
  86
  87        echo "You asked me to pull without telling me which branch you"
  88        echo "want to merge with, and 'branch.${curr_branch}.merge' in"
  89        echo "your configuration file does not tell me either.  Please"
  90        echo "name which branch you want to merge on the command line and"
  91        echo "try again (e.g. 'git pull <repository> <refspec>')."
  92        echo "See git-pull(1) for details on the refspec."
  93        echo
  94        echo "If you often merge with the same branch, you may want to"
  95        echo "configure the following variables in your configuration"
  96        echo "file:"
  97        echo
  98        echo "    branch.${curr_branch}.remote = <nickname>"
  99        echo "    branch.${curr_branch}.merge = <remote-ref>"
 100        echo "    remote.<nickname>.url = <url>"
 101        echo "    remote.<nickname>.fetch = <refspec>"
 102        echo
 103        echo "See git-config(1) for details."
 104        exit 1
 105}
 106
 107test true = "$rebase" && {
 108        . git-parse-remote &&
 109        origin="$1"
 110        test -z "$origin" && origin=$(get_default_remote)
 111        reflist="$(get_remote_refs_for_fetch "$@" 2>/dev/null |
 112                sed "s|refs/heads/\(.*\):|\1|")" &&
 113        oldremoteref="$(git rev-parse --verify \
 114                "refs/remotes/$origin/$reflist" 2>/dev/null)"
 115}
 116orig_head=$(git rev-parse --verify HEAD 2>/dev/null)
 117git-fetch --update-head-ok "$@" || exit 1
 118
 119curr_head=$(git rev-parse --verify HEAD 2>/dev/null)
 120if test "$curr_head" != "$orig_head"
 121then
 122        # The fetch involved updating the current branch.
 123
 124        # The working tree and the index file is still based on the
 125        # $orig_head commit, but we are merging into $curr_head.
 126        # First update the working tree to match $curr_head.
 127
 128        echo >&2 "Warning: fetch updated the current branch head."
 129        echo >&2 "Warning: fast forwarding your working tree from"
 130        echo >&2 "Warning: commit $orig_head."
 131        git update-index --refresh 2>/dev/null
 132        git read-tree -u -m "$orig_head" "$curr_head" ||
 133                die 'Cannot fast-forward your working tree.
 134After making sure that you saved anything precious from
 135$ git diff '$orig_head'
 136output, run
 137$ git reset --hard
 138to recover.'
 139
 140fi
 141
 142merge_head=$(sed -e '/  not-for-merge   /d' \
 143        -e 's/  .*//' "$GIT_DIR"/FETCH_HEAD | \
 144        tr '\012' ' ')
 145
 146case "$merge_head" in
 147'')
 148        case $? in
 149        0) error_on_no_merge_candidates "$@";;
 150        1) echo >&2 "You are not currently on a branch; you must explicitly"
 151           echo >&2 "specify which branch you wish to merge:"
 152           echo >&2 "  git pull <remote> <branch>"
 153           exit 1;;
 154        *) exit $?;;
 155        esac
 156        ;;
 157?*' '?*)
 158        if test -z "$orig_head"
 159        then
 160                echo >&2 "Cannot merge multiple branches into empty head"
 161                exit 1
 162        fi
 163        ;;
 164esac
 165
 166if test -z "$orig_head"
 167then
 168        git update-ref -m "initial pull" HEAD $merge_head "" &&
 169        git read-tree --reset -u HEAD || exit 1
 170        exit
 171fi
 172
 173merge_name=$(git fmt-merge-msg <"$GIT_DIR/FETCH_HEAD") || exit
 174test true = "$rebase" &&
 175        exec git-rebase $strategy_args --onto $merge_head \
 176        ${oldremoteref:-$merge_head}
 177exec git-merge $no_stat $no_commit $squash $no_ff $strategy_args \
 178        "$merge_name" HEAD $merge_head