Download raw body.
allow remotes without urls in git config; add tests
On Wed, Jan 24, 2024 at 07:54:23PM +0100, Omar Polo wrote: > On 2024/01/24 18:16:02 +0000, James Cook <falsifian@falsifian.org> wrote: > > 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. > > The idea sounds fine to me. > > > 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. > > I think this is due to the fact that gotd doesn't use the libexec > helpers, so you end up with two "interfaces": one that runs > got-read-gitconfig under the hood (lib/read_gitconfig_privsep.c) and one > that doesn't (lib/read_gitconfig.c). > > (i've been bitten by this separation in the past too, but there are more > files like that in lib/ which do the same thing.) > > I think however that if we change the behaviour of got-read-gitconfig we > should keep the same in lib/read_gitconfig. I can tweak the latter in a > follow-up if you prefer though. > > I never used git-annex and I don't know how much a server should care, > but I think that if got(1) can work on a repository, then gotd should be > able to do it too. > > > 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; > > If there is only one remote section and it doesn't have a url, nremotes > becomes zero. This is not a problem, as that's normally handled, > however i wonder if having just one loop and resizing nremotes > on-the-fly wouldn't be simpler than this dance. It would be a bigger > change though. This is essentially the same change as James proposed, just in a different style to avoid having to reshuffle counters and freeing memory that wasn't used. I don't want to steal your commit James, so I first tried to phrase this change in prose. But I ended up deleting what I had written since it seemed much easier to just write the diff. I'm a bit short on time so I only compiled-tested this. Does Jame's test still pass with this? diff /home/stsp/src/got commit - d0980f09b20ac878dcbc62fb940adf273a363f00 path + /home/stsp/src/got blob - 99f2a5a5d4fdc582151efa06eb679bf4bfd09a69 file + libexec/got-read-gitconfig/got-read-gitconfig.c --- libexec/got-read-gitconfig/got-read-gitconfig.c +++ libexec/got-read-gitconfig/got-read-gitconfig.c @@ -230,10 +230,15 @@ gitconfig_remotes_request(struct imsgbuf *ibuf, struct i = 0; TAILQ_FOREACH(node, §ions->fields, link) { - char *name, *end, *mirror; + char *name, *end, *fetch_url, *mirror; if (strncasecmp("remote \"", node->field, 8) != 0) continue; + + fetch_url = got_gitconfig_get_str(gitconfig, + node->field, "url"); + if (fetch_url == NULL) + continue; name = strdup(node->field + 8); if (name == NULL) { @@ -245,22 +250,12 @@ gitconfig_remotes_request(struct imsgbuf *ibuf, struct *end = '\0'; remotes[i].name = name; - 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; - } + remotes[i].fetch_url = fetch_url; remotes[i].send_url = got_gitconfig_get_str(gitconfig, node->field, "pushurl"); if (remotes[i].send_url == NULL) - remotes[i].send_url = got_gitconfig_get_str(gitconfig, - node->field, "url"); - if (remotes[i].send_url == NULL) { - err = got_error(GOT_ERR_GITCONFIG_SYNTAX); - goto done; - } + remotes[i].send_url = fetch_url; remotes[i].mirror_references = 0; mirror = got_gitconfig_get_str(gitconfig, node->field,
allow remotes without urls in git config; add tests