From: Stefan Sperling Subject: fix argument error handling in got fetch To: gameoftrees@openbsd.org Date: Tue, 20 Oct 2020 23:07:04 +0200 Reported on the IRC channel: stsp: 'got fetch -b branch remote' appears to pick a wrong remote instead of erroring if the remote doesn't exist Properly handle nonexistent remote repository names given to 'got fetch'. ok? diff 59ae71607ad9127113965097ca3401601a03e2c2 37148ab272827818d1b17698ec0cee5bca650444 blob - 9ff54863f6b41daa7b9bf2b9cb46bf28b42ffe52 blob + 138291e3421f28ca4a7541d072a13b359720b717 --- got/got.c +++ got/got.c @@ -2119,9 +2119,10 @@ cmd_fetch(int argc, char *argv[]) got_gotconfig_get_remotes(&nremotes, &remotes, worktree_conf); for (i = 0; i < nremotes; i++) { - remote = &remotes[i]; - if (strcmp(remote->name, remote_name) == 0) + if (strcmp(remotes[i].name, remote_name) == 0) { + remote = &remotes[i]; break; + } } } } @@ -2131,18 +2132,20 @@ cmd_fetch(int argc, char *argv[]) got_gotconfig_get_remotes(&nremotes, &remotes, repo_conf); for (i = 0; i < nremotes; i++) { - remote = &remotes[i]; - if (strcmp(remote->name, remote_name) == 0) + if (strcmp(remotes[i].name, remote_name) == 0) { + remote = &remotes[i]; break; + } } } } if (remote == NULL) { got_repo_get_gitconfig_remotes(&nremotes, &remotes, repo); for (i = 0; i < nremotes; i++) { - remote = &remotes[i]; - if (strcmp(remote->name, remote_name) == 0) + if (strcmp(remotes[i].name, remote_name) == 0) { + remote = &remotes[i]; break; + } } } if (remote == NULL) { blob - 059c1dc9b29d8efbb092fcd4eaf3bbccc36da1c3 blob + 3f5693ec2c5a3685f79649772017c3e4db3e9779 --- regress/cmdline/fetch.sh +++ regress/cmdline/fetch.sh @@ -978,6 +978,18 @@ remote "barbaz" { repository "$testroot/does-not-exist" } EOF + echo "got: nonexistent: remote repository not found" \ + > $testroot/stderr.expected + (cd $testroot/repo-clone && got fetch nonexistent \ + > $testroot/stdout 2> $testroot/stderr) + ret="$?" + if [ "$ret" == "0" ]; then + echo "got fetch command succeeded unexpectedly" >&2 + diff -u $testroot/stderr.expected $testroot/stderr + test_done "$testroot" "1" + return 1 + fi + (cd $testroot/repo-clone && got fetch -l foobar \ > $testroot/stdout) ret="$?"