Hi Peff,
On Tue, 16 Jun 2020, Jeff King wrote:
On Wed, Jun 10, 2020 at 08:16:38PM -0400, Eric Sunshine wrote:
quoted
quoted
+/*
+ * Retrieves the name of the default branch. If `short_name` is non-zero, the
+ * branch name will be prefixed with "refs/heads/".
+ */
+char *git_default_branch_name(int short_name);
Overall, the internal logic regarding duplicating/freeing strings
would probably be easier to grok if there were two separate functions:
char *git_default_branch_name(void);
char *git_default_ref_name(void);
but that's subjective.
Having seen one of the callers, might it be worth avoiding handing off
ownership of the string entirely?
For `git_default_branch_name()`: yes. For `repo_default_branch_name()`,
not really, as that is potentially repository-specific.
(Side note: while I cannot really think of a use case where you would want
to set `init.defaultBranch` in a repository-local config, there _might_ be
use cases for that out there, and it _is_ how our config machinery works.)
I.e., this comes from a string that's already owned for the lifetime of
the process (either the environment, or a string stored by the config
machinery). Could we just pass that back (or if we want to be more
careful about getenv() lifetimes, we can copy it into a static owned by
this function)?
Then all of the callers can stop dealing with the extra free(), and you
can do:
const char *git_default_branch_name(void)
{
return skip_prefix("refs/heads/", git_default_ref_name());
}
For ease of use, I decided to only ever return the branch name (but check
the full ref).
Those callers that actually need the full ref usually also need the branch
name, and it is easy enough to call `xstrfmt("refs/heads/%s", ...)`.
It might make the code a bit less efficient (but who cares, it's not like
we're setting up a gazillion repositories per second all the time), but
quite a bit easier to reason about.
Ciao,
Dscho