Download raw body.
tweak git config created by 'got clone'
Anyone? On Tue, Jan 12, 2021 at 11:15:57PM +0100, Stefan Sperling wrote: > Could someone with Git experience please take a look at this? > > My goal is to have 'got clone' generate Git config files that make > 'git fetch' behave more or less, if not perfectly, like 'got fetch' > will behave in the presence of a got.conf created by 'got clone'. > > Instead of using wildcards like refs/heads/*, list the branches and refs > which were passed on the command line and/or fetched by default. > This matches what the generated got.conf file contains. > > Add a refspec that fetches all of refs/tags/* into refs/tags/* > This matches Got's hard-coded behaviour. My assumption is that tag names are > a global resource across all clones of the repository, and fireworks should > occur if this assumption is violated. This makes sense to me because Got is > focussing on the centralized-repo workflow. Truly distributed workflows are > rare and require a lot of Git's crazy flexibility. > > I noticed that we currently enable 'git fetch --force', which I expect could > probably lead to surprises. I've dropped the + prefix from all refspecs. > Git users will probably know when using --force is safe. > > I'm not sure what 'mirror = true' will accomplish without the corresponding > fetch refspec "+refs/*:refs/*". I have dropped 'mirror = true' for now. > > Do these changes make sense? > > diff 99495ddb79841fe89b0746d35a49bb81e9220096 /home/stsp/src/got > blob - 588f144e15210cef646e4d3b143f8cb74e7e5abe > file + got/got.c > --- got/got.c > +++ got/got.c > @@ -1277,7 +1277,7 @@ create_gitconfig(const char *git_url, const char *defa > char *gitconfig = NULL; > FILE *gitconfig_file = NULL; > char *branches = NULL, *refs = NULL; > - const char *branchname, *mirror = NULL; > + const char *branchname; > ssize_t n; > > /* Create a config file Git can understand. */ > @@ -1291,16 +1291,15 @@ create_gitconfig(const char *git_url, const char *defa > err = got_error_from_errno2("fopen", gitconfig_path); > goto done; > } > - if (mirror_references) { > - mirror = "\tmirror = true\n"; > - branches = strdup("\tfetch = +refs/*:refs/*\n"); > - if (branches == NULL) { > - err = got_error_from_errno("strdup"); > - goto done; > - } > - } else if (fetch_all_branches) { > - if (asprintf(&branches, > - "\tfetch = +refs/heads/*:refs/remotes/%s/*\n", > + if (fetch_all_branches) { > + if (mirror_references) { > + if (asprintf(&branches, > + "\tfetch = refs/heads/*:refs/heads/*\n") == -1) { > + err = got_error_from_errno("asprintf"); > + goto done; > + } > + } else if (asprintf(&branches, > + "\tfetch = refs/heads/*:refs/remotes/%s/*\n", > GOT_FETCH_DEFAULT_REMOTE_NAME) == -1) { > err = got_error_from_errno("asprintf"); > goto done; > @@ -1312,8 +1311,16 @@ create_gitconfig(const char *git_url, const char *defa > branchname = pe->path; > if (strncmp(branchname, "refs/heads/", 11) == 0) > branchname += 11; > - if (asprintf(&s, > - "%s\tfetch = +refs/heads/%s:refs/remotes/%s/%s\n", > + if (mirror_references) { > + if (asprintf(&s, > + "%s\tfetch = refs/heads/%s:refs/heads/%s\n", > + branches ? branches : "", > + branchname, branchname) == -1) { > + err = got_error_from_errno("asprintf"); > + goto done; > + } > + } else if (asprintf(&s, > + "%s\tfetch = refs/heads/%s:refs/remotes/%s/%s\n", > branches ? branches : "", > branchname, GOT_FETCH_DEFAULT_REMOTE_NAME, > branchname) == -1) { > @@ -1334,23 +1341,37 @@ create_gitconfig(const char *git_url, const char *defa > branchname += 11; > } else > branchname = "*"; /* fall back to all branches */ > - if (asprintf(&branches, > - "\tfetch = +refs/heads/%s:refs/remotes/%s/%s\n", > + if (mirror_references) { > + if (asprintf(&branches, > + "\tfetch = refs/heads/%s:refs/heads/%s\n", > + branchname, branchname) == -1) { > + err = got_error_from_errno("asprintf"); > + goto done; > + } > + } else if (asprintf(&branches, > + "\tfetch = refs/heads/%s:refs/remotes/%s/%s\n", > branchname, GOT_FETCH_DEFAULT_REMOTE_NAME, > branchname) == -1) { > err = got_error_from_errno("asprintf"); > goto done; > } > } > - if (!mirror_references && !TAILQ_EMPTY(wanted_refs)) { > + if (!TAILQ_EMPTY(wanted_refs)) { > struct got_pathlist_entry *pe; > TAILQ_FOREACH(pe, wanted_refs, entry) { > char *s; > const char *refname = pe->path; > if (strncmp(refname, "refs/", 5) == 0) > refname += 5; > - if (asprintf(&s, > - "%s\tfetch = +refs/%s:refs/remotes/%s/%s\n", > + if (mirror_references) { > + if (asprintf(&s, > + "%s\tfetch = refs/%s:refs/%s\n", > + refs ? refs : "", refname, refname) == -1) { > + err = got_error_from_errno("asprintf"); > + goto done; > + } > + } else if (asprintf(&s, > + "%s\tfetch = refs/%s:refs/remotes/%s/%s\n", > refs ? refs : "", > refname, GOT_FETCH_DEFAULT_REMOTE_NAME, > refname) == -1) { > @@ -1367,9 +1388,9 @@ create_gitconfig(const char *git_url, const char *defa > "\turl = %s\n" > "%s" > "%s" > - "%s", > + "\tfetch = refs/tags/*:refs/tags/*\n", > GOT_FETCH_DEFAULT_REMOTE_NAME, git_url, branches ? branches : "", > - refs ? refs : "", mirror ? mirror : "") == -1) { > + refs ? refs : "") == -1) { > err = got_error_from_errno("asprintf"); > goto done; > } > blob - 44c5e030d3c0d68974cecd35b85f6edabc096ee3 > file + regress/cmdline/clone.sh > --- regress/cmdline/clone.sh > +++ regress/cmdline/clone.sh > @@ -114,7 +114,8 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/heads/master:refs/remotes/origin/master > + fetch = refs/heads/master:refs/remotes/origin/master > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > @@ -214,7 +215,8 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/heads/foo:refs/remotes/origin/foo > + fetch = refs/heads/foo:refs/remotes/origin/foo > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > @@ -290,7 +292,8 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/heads/*:refs/remotes/origin/* > + fetch = refs/heads/*:refs/remotes/origin/* > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > @@ -362,8 +365,8 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/*:refs/* > - mirror = true > + fetch = refs/heads/master:refs/heads/master > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > @@ -435,8 +438,8 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/*:refs/* > - mirror = true > + fetch = refs/heads/*:refs/heads/* > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > @@ -512,8 +515,9 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/heads/master:refs/remotes/origin/master > - fetch = +refs/hoo:refs/remotes/origin/hoo > + fetch = refs/heads/master:refs/remotes/origin/master > + fetch = refs/hoo:refs/remotes/origin/hoo > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > @@ -587,8 +591,9 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/heads/foo:refs/remotes/origin/foo > - fetch = +refs/hoo/boo/zoo:refs/remotes/origin/hoo/boo/zoo > + fetch = refs/heads/foo:refs/remotes/origin/foo > + fetch = refs/hoo/boo/zoo:refs/remotes/origin/hoo/boo/zoo > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > @@ -660,8 +665,9 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/*:refs/* > - mirror = true > + fetch = refs/heads/master:refs/heads/master > + fetch = refs/hoo:refs/hoo > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > @@ -731,8 +737,9 @@ EOF > > [remote "origin"] > url = ssh://127.0.0.1$testroot/repo > - fetch = +refs/heads/foo:refs/remotes/origin/foo > - fetch = +refs/heads/bar:refs/remotes/origin/bar > + fetch = refs/heads/foo:refs/remotes/origin/foo > + fetch = refs/heads/bar:refs/remotes/origin/bar > + fetch = refs/tags/*:refs/tags/* > EOF > cmp -s $testroot/repo-clone/config $testroot/config.expected > ret="$?" > >
tweak git config created by 'got clone'