Download raw body.
allow remotes without urls in git config; add tests
I have some git repos where .git/config has "remote" sections without urls, like this: [remote "h0-rsync"] annex-rsyncurl = (some url) annex-uuid = (some uuid) skipFetchAll = true Running tog and many got commands there results in: $ tog got-read-gitconfig: gitconfig syntax error tog: gitconfig syntax error The below diff makes got-read-gitconfig instead ignore these sections, and adds test coverage for got fetch and got send commands that read the git config. I didn't touch the implementation in lib/read_gitconfig.c because that seems to be only used by gotd, which I don't (yet) use and so couldn't easily test. Is that duplicate implementation still needed? I actually made my change there first and it took me a while to realize it was the wrong place. -- James diff d0980f09b20ac878dcbc62fb940adf273a363f00 b9782d5c1f3fc2459e8cde0b58a1e128e43a2149 commit - d0980f09b20ac878dcbc62fb940adf273a363f00 commit + b9782d5c1f3fc2459e8cde0b58a1e128e43a2149 blob - 99f2a5a5d4fdc582151efa06eb679bf4bfd09a69 blob + d3e9edfcd3e76bd3faa07932fbdf44acbdebed5c --- libexec/got-read-gitconfig/got-read-gitconfig.c +++ libexec/got-read-gitconfig/got-read-gitconfig.c @@ -248,8 +248,10 @@ gitconfig_remotes_request(struct imsgbuf *ibuf, struct remotes[i].fetch_url = got_gitconfig_get_str(gitconfig, node->field, "url"); if (remotes[i].fetch_url == NULL) { - err = got_error(GOT_ERR_GITCONFIG_SYNTAX); - goto done; + free(remotes[i].name); + remotes[i].name = NULL; + --nremotes; + continue; } remotes[i].send_url = got_gitconfig_get_str(gitconfig, blob - bc9c071363d678f9caf6ad6317ddab429ffee389 blob + 609c219041bc3e37576915d5ae9e8f2cc180f7d7 --- regress/cmdline/fetch.sh +++ regress/cmdline/fetch.sh @@ -1381,6 +1381,49 @@ EOF test_done "$testroot" "$ret" } +test_fetch_gitconfig_remote_repo() { + local testroot=`test_init fetch_gotconfig_remote_repo` + local testurl=ssh://127.0.0.1/$testroot + local commit_id=`git_show_head $testroot/repo` + + make_single_file_repo $testroot/alternate-repo foo + local alt_commit_id=`git_show_head $testroot/alternate-repo` + +cat >> $testroot/repo/.git/config <<EOF +[remote "hasnourl"] + unrelated = setting +[remote "alt"] + url = $testurl/alternate-repo +[remote "another"] + url = $testurl/some-other-repo +EOF + + # unset in a subshell to avoid affecting our environment + (unset GOT_IGNORE_GITCONFIG && cd $testroot/repo && got fetch -q alt) + ret=$? + if [ $ret -ne 0 ]; then + echo "got fetch command failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + got ref -l -r $testroot/repo > $testroot/stdout + + cat > $testroot/stdout.expected <<-EOF + HEAD: refs/heads/master + refs/heads/master: $commit_id + refs/remotes/alt/HEAD: refs/remotes/alt/master + refs/remotes/alt/master: $alt_commit_id + EOF + + cmp -s $testroot/stdout $testroot/stdout.expected + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + fi + test_done "$testroot" "$ret" +} + test_fetch_delete_remote_refs() { local testroot=`test_init fetch_delete_remote_refs` local testurl=ssh://127.0.0.1/$testroot @@ -1991,6 +2034,7 @@ run_test test_fetch_replace_symref run_test test_fetch_update_headref run_test test_fetch_headref_deleted_locally run_test test_fetch_gotconfig_remote_repo +run_test test_fetch_gitconfig_remote_repo run_test test_fetch_delete_remote_refs run_test test_fetch_honor_wt_conf_bflag run_test test_fetch_from_out_of_date_remote blob - 522e20e74edf14f00ee8062462c8e07e0fa3a63c blob + b6f1c50eac455d297c5c32b125224755880ec879 --- regress/cmdline/send.sh +++ regress/cmdline/send.sh @@ -1556,6 +1556,52 @@ EOF test_done "$testroot" "$ret" } +test_send_gitconfig() { + local testroot=`test_init send_config` + local testurl=ssh://127.0.0.1/$testroot + local commit_id=`git_show_head $testroot/repo` + + git init -q --bare $testroot/upstream-repo + ret=$? + if [ $ret -ne 0 ]; then + echo "git init failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + +cat >> $testroot/repo/.git/config <<EOF +[remote "hasnourl"] + unrelated = setting +[remote "foo"] + url = $testurl/upstream-repo +[remote "another"] + url = $testurl/some-other-repo +EOF + + # unset in a subshell to avoid affecting our environment + (unset GOT_IGNORE_GITCONFIG && got send -q -r $testroot/repo foo) + ret=$? + if [ $ret -ne 0 ]; then + echo "got send command failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + got ref -l -r $testroot/upstream-repo > $testroot/stdout + + cat > $testroot/stdout.expected <<-EOF + HEAD: refs/heads/master + refs/heads/master: $commit_id + EOF + + cmp -s $testroot/stdout $testroot/stdout.expected + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + fi + test_done "$testroot" "$ret" +} + test_send_rejected() { local testroot=`test_init send_rejected` local testurl=ssh://127.0.0.1/$testroot @@ -1633,4 +1679,5 @@ run_test test_send_all_branches run_test test_send_to_empty_repo run_test test_send_and_fetch_config run_test test_send_config +run_test test_send_gitconfig run_test test_send_rejected
allow remotes without urls in git config; add tests