t / t5536-fetch-conflicts.shon commit Merge branch 'jc/linkgit-fix' (5f232ec)
   1#!/bin/sh
   2
   3test_description='fetch handles conflicting refspecs correctly'
   4
   5. ./test-lib.sh
   6
   7D=$(pwd)
   8
   9setup_repository () {
  10        git init "$1" && (
  11                cd "$1" &&
  12                git config remote.origin.url "$D" &&
  13                shift &&
  14                for refspec in "$@"
  15                do
  16                        git config --add remote.origin.fetch "$refspec"
  17                done
  18        )
  19}
  20
  21verify_stderr () {
  22        cat >expected &&
  23        # We're not interested in the error
  24        # "fatal: The remote end hung up unexpectedly":
  25        grep -E '^(fatal|warning):' <error | grep -v 'hung up' >actual | sort &&
  26        test_cmp expected actual
  27}
  28
  29test_expect_success 'setup' '
  30        git commit --allow-empty -m "Initial" &&
  31        git branch branch1 &&
  32        git tag tag1 &&
  33        git commit --allow-empty -m "First" &&
  34        git branch branch2 &&
  35        git tag tag2
  36'
  37
  38test_expect_success 'fetch with no conflict' '
  39        setup_repository ok "+refs/heads/*:refs/remotes/origin/*" && (
  40                cd ok &&
  41                git fetch origin
  42        )
  43'
  44
  45test_expect_success 'fetch conflict: config vs. config' '
  46        setup_repository ccc \
  47                "+refs/heads/branch1:refs/remotes/origin/branch1" \
  48                "+refs/heads/branch2:refs/remotes/origin/branch1" && (
  49                cd ccc &&
  50                test_must_fail git fetch origin 2>error &&
  51                verify_stderr <<-\EOF
  52                fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1
  53                EOF
  54        )
  55'
  56
  57test_expect_success 'fetch duplicate: config vs. config' '
  58        setup_repository dcc \
  59                "+refs/heads/*:refs/remotes/origin/*" \
  60                "+refs/heads/branch1:refs/remotes/origin/branch1" && (
  61                cd dcc &&
  62                git fetch origin
  63        )
  64'
  65
  66test_expect_success 'fetch conflict: arg overrides config' '
  67        setup_repository aoc \
  68                "+refs/heads/*:refs/remotes/origin/*" && (
  69                cd aoc &&
  70                git fetch origin refs/heads/branch2:refs/remotes/origin/branch1
  71        )
  72'
  73
  74test_expect_success 'fetch conflict: arg vs. arg' '
  75        setup_repository caa && (
  76                cd caa &&
  77                test_must_fail git fetch origin \
  78                        refs/heads/*:refs/remotes/origin/* \
  79                        refs/heads/branch2:refs/remotes/origin/branch1 2>error &&
  80                verify_stderr <<-\EOF
  81                fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1
  82                EOF
  83        )
  84'
  85
  86test_expect_success 'fetch conflict: criss-cross args' '
  87        setup_repository xaa \
  88                "+refs/heads/*:refs/remotes/origin/*" && (
  89                cd xaa &&
  90                git fetch origin \
  91                        refs/heads/branch1:refs/remotes/origin/branch2 \
  92                        refs/heads/branch2:refs/remotes/origin/branch1 2>error &&
  93                verify_stderr <<-\EOF
  94                warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2
  95                warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1
  96                EOF
  97        )
  98'
  99
 100test_done