t5505-remote.sh 7.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
#!/bin/sh

test_description='git remote porcelain-ish'

. ./test-lib.sh

setup_repository () {
	mkdir "$1" && (
	cd "$1" &&
	git init &&
	>file &&
	git add file &&
13
	test_tick &&
14 15 16 17
	git commit -m "Initial" &&
	git checkout -b side &&
	>elif &&
	git add elif &&
18
	test_tick &&
19 20 21 22 23 24 25 26
	git commit -m "Second" &&
	git checkout master
	)
}

tokens_match () {
	echo "$1" | tr ' ' '\012' | sort | sed -e '/^$/d' >expect &&
	echo "$2" | tr ' ' '\012' | sort | sed -e '/^$/d' >actual &&
27
	test_cmp expect actual
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
}

check_remote_track () {
	actual=$(git remote show "$1" | sed -n -e '$p') &&
	shift &&
	tokens_match "$*" "$actual"
}

check_tracking_branch () {
	f="" &&
	r=$(git for-each-ref "--format=%(refname)" |
		sed -ne "s|^refs/remotes/$1/||p") &&
	shift &&
	tokens_match "$*" "$r"
}

test_expect_success setup '

	setup_repository one &&
	setup_repository two &&
	(
		cd two && git branch another
	) &&
	git clone one test

'

test_expect_success 'remote information for the origin' '
(
	cd test &&
	tokens_match origin "$(git remote)" &&
	check_remote_track origin master side &&
	check_tracking_branch origin HEAD master side
)
'

test_expect_success 'add another remote' '
(
	cd test &&
	git remote add -f second ../two &&
	tokens_match "origin second" "$(git remote)" &&
	check_remote_track origin master side &&
	check_remote_track second master side another &&
	check_tracking_branch second master side another &&
	git for-each-ref "--format=%(refname)" refs/remotes |
	sed -e "/^refs\/remotes\/origin\//d" \
	    -e "/^refs\/remotes\/second\//d" >actual &&
	>expect &&
76
	test_cmp expect actual
77 78 79
)
'

80 81 82 83 84 85 86 87 88 89
test_expect_success 'remote forces tracking branches' '
(
	cd test &&
	case `git config remote.second.fetch` in
	+*) true ;;
	 *) false ;;
	esac
)
'

90 91 92
test_expect_success 'remove remote' '
(
	cd test &&
93
	git symbolic-ref refs/remotes/second/HEAD refs/remotes/second/master &&
94 95 96 97 98 99 100 101 102 103 104 105
	git remote rm second
)
'

test_expect_success 'remove remote' '
(
	cd test &&
	tokens_match origin "$(git remote)" &&
	check_remote_track origin master side &&
	git for-each-ref "--format=%(refname)" refs/remotes |
	sed -e "/^refs\/remotes\/origin\//d" >actual &&
	>expect &&
106
	test_cmp expect actual
107 108 109
)
'

110 111
cat > test/expect << EOF
* remote origin
112
  URL: $(pwd)/one
J
Johannes Schindelin 已提交
113
  Remote branch merged with 'git pull' while on branch master
114
    master
J
Johannes Schindelin 已提交
115
  New remote branch (next fetch will store in remotes/origin)
116 117 118
    master
  Tracked remote branches
    side master
119 120
  Local branches pushed with 'git push'
    master:upstream +refs/tags/lastbackup
121 122 123 124 125 126 127 128 129 130
EOF

test_expect_success 'show' '
	(cd test &&
	 git config --add remote.origin.fetch \
		refs/heads/master:refs/heads/upstream &&
	 git fetch &&
	 git branch -d -r origin/master &&
	 (cd ../one &&
	  echo 1 > file &&
131
	  test_tick &&
132
	  git commit -m update file) &&
133 134 135 136
	 git config remote.origin.push \
		refs/heads/master:refs/heads/upstream &&
	 git config --add remote.origin.push \
		+refs/tags/lastbackup &&
137
	 git remote show origin > output &&
138
	 test_cmp expect output)
139 140
'

O
Olivier Marin 已提交
141 142
cat > test/expect << EOF
* remote origin
143
  URL: $(pwd)/one
O
Olivier Marin 已提交
144 145
  Remote branch merged with 'git pull' while on branch master
    master
146 147
  Tracked remote branches
    master side
O
Olivier Marin 已提交
148 149 150 151 152 153 154 155 156 157 158 159
  Local branches pushed with 'git push'
    master:upstream +refs/tags/lastbackup
EOF

test_expect_success 'show -n' '
	(mv one one.unreachable &&
	 cd test &&
	 git remote show -n origin > output &&
	 mv ../one.unreachable ../one &&
	 test_cmp expect output)
'

160 161 162 163 164 165 166
test_expect_success 'prune' '
	(cd one &&
	 git branch -m side side2) &&
	(cd test &&
	 git fetch origin &&
	 git remote prune origin &&
	 git rev-parse refs/remotes/origin/side2 &&
167
	 test_must_fail git rev-parse refs/remotes/origin/side)
168 169
'

170 171
cat > test/expect << EOF
Pruning origin
172
URL: $(pwd)/one
173 174 175 176 177 178 179 180 181
 * [would prune] origin/side2
EOF

test_expect_success 'prune --dry-run' '
	(cd one &&
	 git branch -m side2 side) &&
	(cd test &&
	 git remote prune --dry-run origin > output &&
	 git rev-parse refs/remotes/origin/side2 &&
182
	 test_must_fail git rev-parse refs/remotes/origin/side &&
183 184 185 186 187
	(cd ../one &&
	 git branch -m side side2) &&
	 test_cmp expect output)
'

188 189 190 191 192 193 194 195 196
test_expect_success 'add --mirror && prune' '
	(mkdir mirror &&
	 cd mirror &&
	 git init &&
	 git remote add --mirror -f origin ../one) &&
	(cd one &&
	 git branch -m side2 side) &&
	(cd mirror &&
	 git rev-parse --verify refs/heads/side2 &&
197
	 test_must_fail git rev-parse --verify refs/heads/side &&
198 199
	 git fetch origin &&
	 git remote prune origin &&
200
	 test_must_fail git rev-parse --verify refs/heads/side2 &&
201 202 203
	 git rev-parse --verify refs/heads/side)
'

204 205 206 207 208 209 210 211 212 213 214
test_expect_success 'add alt && prune' '
	(mkdir alttst &&
	 cd alttst &&
	 git init &&
	 git remote add -f origin ../one &&
	 git config remote.alt.url ../one &&
	 git config remote.alt.fetch "+refs/heads/*:refs/remotes/origin/*") &&
	(cd one &&
	 git branch -m side side2) &&
	(cd alttst &&
	 git rev-parse --verify refs/remotes/origin/side &&
215
	 test_must_fail git rev-parse --verify refs/remotes/origin/side2 &&
216 217
	 git fetch alt &&
	 git remote prune alt &&
218
	 test_must_fail git rev-parse --verify refs/remotes/origin/side &&
219 220 221
	 git rev-parse --verify refs/remotes/origin/side2)
'

222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
cat > one/expect << EOF
  apis/master
  apis/side
  drosophila/another
  drosophila/master
  drosophila/side
EOF

test_expect_success 'update' '

	(cd one &&
	 git remote add drosophila ../two &&
	 git remote add apis ../mirror &&
	 git remote update &&
	 git branch -r > output &&
237
	 test_cmp expect output)
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263

'

cat > one/expect << EOF
  drosophila/another
  drosophila/master
  drosophila/side
  manduca/master
  manduca/side
  megaloprepus/master
  megaloprepus/side
EOF

test_expect_success 'update with arguments' '

	(cd one &&
	 for b in $(git branch -r)
	 do
		git branch -r -d $b || break
	 done &&
	 git remote add manduca ../mirror &&
	 git remote add megaloprepus ../mirror &&
	 git config remotes.phobaeticus "drosophila megaloprepus" &&
	 git config remotes.titanus manduca &&
	 git remote update phobaeticus titanus &&
	 git branch -r > output &&
264
	 test_cmp expect output)
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286

'

cat > one/expect << EOF
  apis/master
  apis/side
  manduca/master
  manduca/side
  megaloprepus/master
  megaloprepus/side
EOF

test_expect_success 'update default' '

	(cd one &&
	 for b in $(git branch -r)
	 do
		git branch -r -d $b || break
	 done &&
	 git config remote.drosophila.skipDefaultUpdate true &&
	 git remote update default &&
	 git branch -r > output &&
287
	 test_cmp expect output)
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306

'

cat > one/expect << EOF
  drosophila/another
  drosophila/master
  drosophila/side
EOF

test_expect_success 'update default (overridden, with funny whitespace)' '

	(cd one &&
	 for b in $(git branch -r)
	 do
		git branch -r -d $b || break
	 done &&
	 git config remotes.default "$(printf "\t drosophila  \n")" &&
	 git remote update default &&
	 git branch -r > output &&
307
	 test_cmp expect output)
308 309 310

'

311 312 313 314 315 316 317 318 319 320
test_expect_success '"remote show" does not show symbolic refs' '

	git clone one three &&
	(cd three &&
	 git remote show origin > output &&
	 ! grep HEAD < output &&
	 ! grep -i stale < output)

'

321 322
test_expect_success 'reject adding remote with an invalid name' '

323
	test_must_fail git remote add some:url desired-name
324 325 326

'

327
test_done