Commit 54eb00d5beb979ca755db29889d236201e53cd52

Stefan Sperling 2020-10-20T22:25:57

properly handle nonexistent remote repository names given to 'got fetch' found by jrick ok naddy

diff --git a/got/got.c b/got/got.c
index 9ff5486..138291e 100644
--- a/got/got.c
+++ b/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) {
diff --git a/regress/cmdline/fetch.sh b/regress/cmdline/fetch.sh
index 059c1dc..3f5693e 100755
--- a/regress/cmdline/fetch.sh
+++ b/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="$?"