#!/bin/sh test_description='"git fetch/pull --set-upstream" basic tests.' . ./test-lib.sh check_config () { printf "%s\n" "$2" "$3" >"expect.$1" && { git config "branch.$1.remote" && git config "branch.$1.merge" } >"actual.$1" && test_cmp "expect.$1" "actual.$1" } check_config_missing () { test_expect_code 1 git config "branch.$1.remote" && test_expect_code 1 git config "branch.$1.merge" } clear_config () { for branch in "$@"; do test_might_fail git config --unset-all "branch.$branch.remote" test_might_fail git config --unset-all "branch.$branch.merge" done } ensure_fresh_upstream () { rm -rf parent && git init --bare parent } test_expect_success 'setup bare parent fetch' ' ensure_fresh_upstream && git remote add upstream parent ' test_expect_success 'setup commit on master and other fetch' ' test_commit one && git push upstream master && git checkout -b other && test_commit two && git push upstream other ' # tests for fetch --set-upstream test_expect_success 'fetch --set-upstream does not set upstream w/o branch' ' clear_config master other && git checkout master && git fetch --set-upstream upstream && check_config_missing master && check_config_missing other ' test_expect_success 'fetch --set-upstream upstream master sets branch master but not other' ' clear_config master other && git fetch --set-upstream upstream master && check_config master upstream refs/heads/master && check_config_missing other ' test_expect_success 'fetch --set-upstream upstream other sets branch other' ' clear_config master other && git fetch --set-upstream upstream other && check_config master upstream refs/heads/other && check_config_missing other ' test_expect_success 'fetch --set-upstream master:other does not set the branch other2' ' clear_config other2 && git fetch --set-upstream upstream master:other2 && check_config_missing other2 ' test_expect_success 'fetch --set-upstream http://nosuchdomain.example.com fails with invalid url' ' # master explicitly not cleared, we check that it is not touched from previous value clear_config other other2 && test_must_fail git fetch --set-upstream http://nosuchdomain.example.com && check_config master upstream refs/heads/other && check_config_missing other && check_config_missing other2 ' test_expect_success 'fetch --set-upstream with valid URL sets upstream to URL' ' clear_config other other2 && url="file://'"$PWD"'" && git fetch --set-upstream "$url" && check_config master "$url" HEAD && check_config_missing other && check_config_missing other2 ' # tests for pull --set-upstream test_expect_success 'setup bare parent pull' ' git remote rm upstream && ensure_fresh_upstream && git remote add upstream parent ' test_expect_success 'setup commit on master and other pull' ' test_commit three && git push --tags upstream master && test_commit four && git push upstream other ' test_expect_success 'pull --set-upstream upstream master sets branch master but not other' ' clear_config master other && git pull --set-upstream upstream master && check_config master upstream refs/heads/master && check_config_missing other ' test_expect_success 'pull --set-upstream master:other2 does not set the branch other2' ' clear_config other2 && git pull --set-upstream upstream master:other2 && check_config_missing other2 ' test_expect_success 'pull --set-upstream upstream other sets branch master' ' clear_config master other && git pull --set-upstream upstream other && check_config master upstream refs/heads/other && check_config_missing other ' test_expect_success 'pull --set-upstream upstream tag does not set the tag' ' clear_config three && git pull --tags --set-upstream upstream three && check_config_missing three ' test_expect_success 'pull --set-upstream http://nosuchdomain.example.com fails with invalid url' ' # master explicitly not cleared, we check that it is not touched from previous value clear_config other other2 three && test_must_fail git pull --set-upstream http://nosuchdomain.example.com && check_config master upstream refs/heads/other && check_config_missing other && check_config_missing other2 && check_config_missing three ' test_expect_success 'pull --set-upstream upstream HEAD sets branch HEAD' ' clear_config master other && git pull --set-upstream upstream HEAD && check_config master upstream HEAD && git checkout other && git pull --set-upstream upstream HEAD && check_config other upstream HEAD ' test_expect_success 'pull --set-upstream upstream with more than one branch does nothing' ' clear_config master three && git pull --set-upstream upstream master three && check_config_missing master && check_config_missing three ' test_expect_success 'pull --set-upstream with valid URL sets upstream to URL' ' clear_config master other other2 && git checkout master && url="file://'"$PWD"'" && git pull --set-upstream "$url" && check_config master "$url" HEAD && check_config_missing other && check_config_missing other2 ' test_expect_success 'pull --set-upstream with valid URL and branch sets branch' ' clear_config master other other2 && git checkout master && url="file://'"$PWD"'" && git pull --set-upstream "$url" master && check_config master "$url" refs/heads/master && check_config_missing other && check_config_missing other2 ' test_done