Browse code

fetch: load all default config at startup

When we start the git-fetch program, we call git_config to
load all config, but our callback only processes the
fetch.prune option; we do not chain to git_default_config at
all.

This means that we may not load some core configuration
which will have an effect. For instance, we do not load
core.logAllRefUpdates, which impacts whether or not we
create reflogs in a bare repository.

Note that I said "may" above. It gets even more exciting. If
we have to transfer actual objects as part of the fetch,
then we call fetch_pack as part of the same process. That
function loads its own config, which does chain to
git_default_config, impacting global variables which are
used by the rest of fetch. But if the fetch is a pure ref
update (e.g., a new ref which is a copy of an old one), we
skip fetch_pack entirely. So we get inconsistent results
depending on whether or not we have actual objects to
transfer or not!

Let's just load the core config at the start of fetch, so we
know we have it (we may also load it again as part of
fetch_pack, but that's OK; it's designed to be idempotent).

Our tests check both cases (with and without a pack). We
also check similar behavior for push for good measure, but
it already works as expected.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King authored on 04/11/2014 13:11:19
Showing 2 changed files
... ...
@@ -66,7 +66,7 @@ static int git_fetch_config(const char *k, const char *v, void *cb)
66 66
 		fetch_prune_config = git_config_bool(k, v);
67 67
 		return 0;
68 68
 	}
69
-	return 0;
69
+	return git_default_config(k, v, cb);
70 70
 }
71 71
 
72 72
 static struct option builtin_fetch_options[] = {
... ...
@@ -11,6 +11,7 @@ This test checks the following functionality:
11 11
 * hooks
12 12
 * --porcelain output format
13 13
 * hiderefs
14
+* reflogs
14 15
 '
15 16
 
16 17
 . ./test-lib.sh
... ...
@@ -1277,4 +1278,43 @@ EOF
1277 1277
 	git push --no-thin --receive-pack="$rcvpck" no-thin/.git refs/heads/master:refs/heads/foo
1278 1278
 '
1279 1279
 
1280
+test_expect_success 'push into bare respects core.logallrefupdates' '
1281
+	rm -rf dst.git &&
1282
+	git init --bare dst.git &&
1283
+	git -C dst.git config core.logallrefupdates true &&
1284
+
1285
+	# double push to test both with and without
1286
+	# the actual pack transfer
1287
+	git push dst.git master:one &&
1288
+	echo "one@{0} push" >expect &&
1289
+	git -C dst.git log -g --format="%gd %gs" one >actual &&
1290
+	test_cmp expect actual &&
1291
+
1292
+	git push dst.git master:two &&
1293
+	echo "two@{0} push" >expect &&
1294
+	git -C dst.git log -g --format="%gd %gs" two >actual &&
1295
+	test_cmp expect actual
1296
+'
1297
+
1298
+test_expect_success 'fetch into bare respects core.logallrefupdates' '
1299
+	rm -rf dst.git &&
1300
+	git init --bare dst.git &&
1301
+	(
1302
+		cd dst.git &&
1303
+		git config core.logallrefupdates true &&
1304
+
1305
+		# as above, we double-fetch to test both
1306
+		# with and without pack transfer
1307
+		git fetch .. master:one &&
1308
+		echo "one@{0} fetch .. master:one: storing head" >expect &&
1309
+		git log -g --format="%gd %gs" one >actual &&
1310
+		test_cmp expect actual &&
1311
+
1312
+		git fetch .. master:two &&
1313
+		echo "two@{0} fetch .. master:two: storing head" >expect &&
1314
+		git log -g --format="%gd %gs" two >actual &&
1315
+		test_cmp expect actual
1316
+	)
1317
+'
1318
+
1280 1319
 test_done