Hi Phillip, On Thu, 11 Jun 2020, Phillip Wood wrote: > On 10/06/2020 22:19, Don Goodman-Wilson via GitGitGadget wrote: > > From: Don Goodman-Wilson <don@xxxxxxxxxxxxxxxxxx> > > > > There is a growing number of projects trying to avoid the non-inclusive > > name `master` in their repositories. > > I think it would be helpful to explain why 'master' is no-inclusive even > if it originates from the concept of a master copy. i.e. it suggests > master/slave even if git is not based on that concept. Unfortunately, we do not even have that defense: the term `master` was copied from BitKeeper, which firmly uses it in the `master/slave` context. See e.g. https://mail.gnome.org/archives/desktop-devel-list/2019-May/msg00066.html I added a _brief_ extension to the context to the first commit's commit message. However, I do not want to go into details here because _this_ patch series is only about empowering users to change their default main branch name. > Have you got some examples of projects that have changed and the names > that they are using? Yes, there are plenty examples, and I do not want to pick a tiny subset to demonstrate that. A more useful resource is probably this post: https://www.hanselman.com/blog/EasilyRenameYourGitDefaultBranchFromMasterToMain.aspx > I think it would be helpful if we can agree on a replacement for master > - if every repository uses a different name for its main branch it adds > an extra complication for new contributors to those projects. Sure, and that's what I thought we'd discuss, too, maybe at the meeting I proposed elsewhere (Emily started a new thread about it: https://lore.kernel.org/git/20200610222719.GE148632@xxxxxxxxxx/). > > For existing repositories, this > > requires manual work. For new repositories, the only way to do that > > automatically is by copying all of Git's template directory, then > > hard-coding the desired default branch name into the `.git/HEAD` file, > > and then configuring `init.templateDir` to point to those copied > > template files. > > > > To make this process much less cumbersome, let's introduce support for > > `core.defaultBranchName`. That way, users won't need to keep their > > copied template files up to date, and won't interfere with default hooks > > installed by their administrators. > > > > While at it, also let users set the default branch name via the > > environment variable `GIT_TEST_DEFAULT_BRANCH_NAME`, > > I'm not sure we usually promote the use of GIT_TEST_... environment > variables outside of the test suite. True. Together with Alban's suggestion to make this purely work in the test suite (i.e. not even adjust the C code to respect that environment variable), you convinced me to (re-)move that part of the commit. > > diff --git a/refs.c b/refs.c > > index 224ff66c7bb..8499b3865cb 100644 > > --- a/refs.c > > +++ b/refs.c > > @@ -560,6 +560,40 @@ void expand_ref_prefix(struct argv_array *prefixes, const char *prefix) > > argv_array_pushf(prefixes, *p, len, prefix); > > } > > > > +char *git_default_branch_name(int short_name) > > +{ > > + const char *branch_name = getenv("GIT_TEST_DEFAULT_BRANCH_NAME"); > > + char *from_config = NULL, *prefixed; > > + > > + /* > > + * If the default branch name was not specified via the environment > > + * variable GIT_TEST_DEFAULT_BRANCH_NAME, retrieve it from the config > > + * setting core.defaultBranchName. If neither are set, fall back to the > > + * hard-coded default. > > + */ > > + if (!branch_name || !*branch_name) { > > + if (git_config_get_string("core.defaultbranchname", > > + &from_config) < 0) > > + die(_("Could not retrieve `core.defaultBranchName`")); > > + > > + if (from_config) > > + branch_name = from_config; > > + else > > + branch_name = "master"; > > + } > > + > > + if (short_name) > > + return from_config ? from_config : xstrdup(branch_name); > > If short_name is set we return without validating the name is that > intentional? No, unintentional. Thank you for pointing this out. It will be fixed in v2 (still working on it). > > + > > + /* prepend "refs/heads/" to the branch name */ > > + prefixed = xstrfmt("refs/heads/%s", branch_name); > > + if (check_refname_format(prefixed, 0)) > > + die(_("invalid default branch name: '%s'"), branch_name); > > + > > + free(from_config); > > + return prefixed; > > +} > > + > > /* > > * *string and *len will only be substituted, and *string returned (for > > * later free()ing) if the string passed in is a magic short-hand form > > diff --git a/refs.h b/refs.h > > index a92d2c74c83..e8d4f6e2f13 100644 > > --- a/refs.h > > +++ b/refs.h > > @@ -154,6 +154,12 @@ int repo_dwim_log(struct repository *r, const char *str, int len, struct object_ > > int dwim_ref(const char *str, int len, struct object_id *oid, char **ref); > > int dwim_log(const char *str, int len, struct object_id *oid, char **ref); > > > > +/* > > + * Retrieves the name of the default branch. If `short_name` is non-zero, the > > + * branch name will be prefixed with "refs/heads/". > > Isn't the other way around - the branch name is prefixed with > "refs/heads/" if short is zero. Absolutely. Thank you for your careful review, I read past this at least half a dozen times. > > + */ > > +char *git_default_branch_name(int short_name); > > + > > /* > > * A ref_transaction represents a collection of reference updates that > > * should succeed or fail together. > > diff --git a/t/t0001-init.sh b/t/t0001-init.sh > > index 1edd5aeb8f0..b144cd8f46b 100755 > > --- a/t/t0001-init.sh > > +++ b/t/t0001-init.sh > > @@ -464,4 +464,24 @@ test_expect_success MINGW 'redirect std handles' ' > > grep "Needed a single revision" output.txt > > ' > > > > +test_expect_success 'custom default branch name from config' ' > > + git config --global core.defaultbranchname nmb && > > In tests we usually use 'test_config' rather than 'git config' as the > former automatically cleans up the config at the end of the test. Right, and in this instance it is `test_config_global`. > > + GIT_TEST_DEFAULT_BRANCH_NAME= git init custom-config && > > + git config --global --unset core.defaultbranchname && > > + git -C custom-config symbolic-ref HEAD >actual && > > + grep nmb actual > > +' > > + > > +test_expect_success 'custom default branch name from env' ' > > + GIT_TEST_DEFAULT_BRANCH_NAME=nmb git init custom-env && > > It would be good to test that this overrides the config setting Except that we'll make this a thing that is internal to the test suite now. So this test case can go. Thank you for helping me improve the patch series! Dscho