git-pull.shon commit New tests and en-passant modifications to mktag. (446c6fa)
   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-summary] [--no-commit] [-s strategy]... [<fetch-options>] <repo> <head>...'
   8LONG_USAGE='Fetch one or more remote refs and merge it/them into the current HEAD.'
   9. git-sh-setup
  10
  11strategy_args= no_summary= no_commit= squash=
  12while case "$#,$1" in 0) break ;; *,-*) ;; *) break ;; esac
  13do
  14        case "$1" in
  15        -n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\
  16                --no-summa|--no-summar|--no-summary)
  17                no_summary=-n ;;
  18        --no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit)
  19                no_commit=--no-commit ;;
  20        --sq|--squ|--squa|--squas|--squash)
  21                squash=--squash ;;
  22        -s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\
  23                --strateg=*|--strategy=*|\
  24        -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
  25                case "$#,$1" in
  26                *,*=*)
  27                        strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
  28                1,*)
  29                        usage ;;
  30                *)
  31                        strategy="$2"
  32                        shift ;;
  33                esac
  34                strategy_args="${strategy_args}-s $strategy "
  35                ;;
  36        -h|--h|--he|--hel|--help)
  37                usage
  38                ;;
  39        -*)
  40                # Pass thru anything that is meant for fetch.
  41                break
  42                ;;
  43        esac
  44        shift
  45done
  46
  47orig_head=$(git-rev-parse --verify HEAD) || die "Pulling into a black hole?"
  48git-fetch --update-head-ok --reflog-action=pull "$@" || exit 1
  49
  50curr_head=$(git-rev-parse --verify HEAD)
  51if test "$curr_head" != "$orig_head"
  52then
  53        # The fetch involved updating the current branch.
  54
  55        # The working tree and the index file is still based on the
  56        # $orig_head commit, but we are merging into $curr_head.
  57        # First update the working tree to match $curr_head.
  58
  59        echo >&2 "Warning: fetch updated the current branch head."
  60        echo >&2 "Warning: fast forwarding your working tree from"
  61        echo >&2 "Warning: $orig_head commit."
  62        git-update-index --refresh 2>/dev/null
  63        git-read-tree -u -m "$orig_head" "$curr_head" ||
  64                die 'Cannot fast-forward your working tree.
  65After making sure that you saved anything precious from
  66$ git diff '$orig_head'
  67output, run
  68$ git reset --hard
  69to recover.'
  70
  71fi
  72
  73merge_head=$(sed -e '/  not-for-merge   /d' \
  74        -e 's/  .*//' "$GIT_DIR"/FETCH_HEAD | \
  75        tr '\012' ' ')
  76
  77case "$merge_head" in
  78'')
  79        echo >&2 "No changes."
  80        exit 0
  81        ;;
  82?*' '?*)
  83        var=`git-repo-config --get pull.octopus`
  84        if test -n "$var"
  85        then
  86                strategy_default_args="-s $var"
  87        fi
  88        ;;
  89*)
  90        var=`git-repo-config --get pull.twohead`
  91        if test -n "$var"
  92        then
  93                strategy_default_args="-s $var"
  94        fi
  95        ;;
  96esac
  97
  98case "$strategy_args" in
  99'')
 100        strategy_args=$strategy_default_args
 101        ;;
 102esac
 103
 104merge_name=$(git-fmt-merge-msg <"$GIT_DIR/FETCH_HEAD") || exit
 105git-merge "--reflog-action=pull $*" \
 106        $no_summary $no_commit $squash $strategy_args \
 107        "$merge_name" HEAD $merge_head