Git fork

remote: bail early from set_head() if missing remote name

In "git remote set-head", we can take varying numbers of arguments
depending on whether we saw the "-d" or "-a" options. But the first
argument is always the remote name.

The current code is somewhat awkward in that it conditionally handles
the remote name up-front like this:

if (argc)
remote = ...from argv[0]...

and then only later decides to bail if we do not have the right number
of arguments for the options we saw.

This makes it hard to figure out if "remote" is always set when it needs
to be. Both for humans, but also for compilers; with -Og, gcc complains
that "remote" can be accessed without being initialized (although this
is not true, as we'd always die with a usage message in that case).

Let's instead enforce the presence of the remote argument up front,
which fixes the compiler warning and is easier to understand. It does
mean duplicating the code to print a usage message, but it's a single
line.

Noticed-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Tested-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Jeff King and committed by
Junio C Hamano
eb883b05 f368df43

+7 -4
+7 -4
builtin/remote.c
··· 1457 1457 }; 1458 1458 argc = parse_options(argc, argv, prefix, options, 1459 1459 builtin_remote_sethead_usage, 0); 1460 - if (argc) { 1461 - strbuf_addf(&b_head, "refs/remotes/%s/HEAD", argv[0]); 1462 - remote = remote_get(argv[0]); 1463 - } 1460 + 1461 + /* All modes require at least a remote name. */ 1462 + if (!argc) 1463 + usage_with_options(builtin_remote_sethead_usage, options); 1464 + 1465 + strbuf_addf(&b_head, "refs/remotes/%s/HEAD", argv[0]); 1466 + remote = remote_get(argv[0]); 1464 1467 1465 1468 if (!opt_a && !opt_d && argc == 2) { 1466 1469 head_name = xstrdup(argv[1]);