1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
#!/bin/sh
test_description='"git fetch/pull --set-upstream" basic tests.'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
. ./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 main and other fetch' '
test_commit one &&
git push upstream main &&
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 main other &&
git checkout main &&
git fetch --set-upstream upstream &&
check_config_missing main &&
check_config_missing other
'
test_expect_success 'fetch --set-upstream upstream main sets branch main but not other' '
clear_config main other &&
git fetch --set-upstream upstream main &&
check_config main upstream refs/heads/main &&
check_config_missing other
'
test_expect_success 'fetch --set-upstream upstream other sets branch other' '
clear_config main other &&
git fetch --set-upstream upstream other &&
check_config main upstream refs/heads/other &&
check_config_missing other
'
test_expect_success 'fetch --set-upstream main:other does not set the branch other2' '
clear_config other2 &&
git fetch --set-upstream upstream main:other2 &&
check_config_missing other2
'
test_expect_success 'fetch --set-upstream ./does-not-exist fails with invalid url' '
# main explicitly not cleared, we check that it is not touched from previous value
clear_config other other2 &&
test_must_fail git fetch --set-upstream ./does-not-exist &&
check_config main 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 main "$url" HEAD &&
check_config_missing other &&
check_config_missing other2
'
test_expect_success 'fetch --set-upstream with a detached HEAD' '
git checkout HEAD^0 &&
test_when_finished "git checkout -" &&
cat >expect <<-\EOF &&
warning: could not set upstream of HEAD to '"'"'main'"'"' from '"'"'upstream'"'"' when it does not point to any branch.
EOF
git fetch --set-upstream upstream main 2>actual.raw &&
grep ^warning: actual.raw >actual &&
test_cmp expect actual
'
# 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 main and other pull' '
test_commit three &&
git push --tags upstream main &&
test_commit four &&
git push upstream other
'
test_expect_success 'pull --set-upstream upstream main sets branch main but not other' '
clear_config main other &&
git pull --no-rebase --set-upstream upstream main &&
check_config main upstream refs/heads/main &&
check_config_missing other
'
test_expect_success 'pull --set-upstream main:other2 does not set the branch other2' '
clear_config other2 &&
git pull --no-rebase --set-upstream upstream main:other2 &&
check_config_missing other2
'
test_expect_success 'pull --set-upstream upstream other sets branch main' '
clear_config main other &&
git pull --no-rebase --set-upstream upstream other &&
check_config main 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 --no-rebase --tags --set-upstream upstream three &&
check_config_missing three
'
test_expect_success 'pull --set-upstream ./does-not-exist fails with invalid url' '
# main 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 ./does-not-exist &&
check_config main 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 main other &&
git pull --no-rebase --set-upstream upstream HEAD &&
check_config main upstream HEAD &&
git checkout other &&
git pull --no-rebase --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 main three &&
git pull --no-rebase --set-upstream upstream main three &&
check_config_missing main &&
check_config_missing three
'
test_expect_success 'pull --set-upstream with valid URL sets upstream to URL' '
clear_config main other other2 &&
git checkout main &&
url="file://$PWD" &&
git pull --set-upstream "$url" &&
check_config main "$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 main other other2 &&
git checkout main &&
url="file://$PWD" &&
git pull --set-upstream "$url" main &&
check_config main "$url" refs/heads/main &&
check_config_missing other &&
check_config_missing other2
'
test_expect_success 'pull --set-upstream with a detached HEAD' '
git checkout HEAD^0 &&
test_when_finished "git checkout -" &&
cat >expect <<-\EOF &&
warning: could not set upstream of HEAD to '"'"'main'"'"' from '"'"'upstream'"'"' when it does not point to any branch.
EOF
git pull --no-rebase --set-upstream upstream main 2>actual.raw &&
grep ^warning: actual.raw >actual &&
test_cmp expect actual
'
test_done
|