On 5/27/2022 5:09 PM, Glen Choo via GitGitGadget wrote: > +enum discovery_bare_config { > + DISCOVERY_BARE_UNKNOWN = -1, > + DISCOVERY_BARE_NEVER = 0, > + DISCOVERY_BARE_ALWAYS, > +}; > +static enum discovery_bare_config discovery_bare_config = > + DISCOVERY_BARE_UNKNOWN; Using this static global is fine, I think. > +static int discovery_bare_cb(const char *key, const char *value, void *d) > +{ > + if (strcmp(key, "discovery.bare")) > + return 0; > + > + if (!strcmp(value, "never")) { > + discovery_bare_config = DISCOVERY_BARE_NEVER; > + return 0; > + } > + if (!strcmp(value, "always")) { > + discovery_bare_config = DISCOVERY_BARE_ALWAYS; > + return 0; > + } > + return -1; > +} However, I do think that this _cb method could benefit from interpreting the 'd' pointer as a 'enum discovery_bare_config *' and assigning the value at the pointer. We can then pass the global to the git_protected_config() call below. This is probably over-defensive future-proofing, but this kind of change would be necessary if we ever wanted to return the enum instead of simply an integer, as below: > + > +static int check_bare_repo_allowed(void) > +{ > + if (discovery_bare_config == DISCOVERY_BARE_UNKNOWN) { > + discovery_bare_config = DISCOVERY_BARE_ALWAYS; > + git_protected_config(discovery_bare_cb, NULL); > + } > + switch (discovery_bare_config) { > + case DISCOVERY_BARE_NEVER: > + return 0; > + case DISCOVERY_BARE_ALWAYS: > + return 1; > + case DISCOVERY_BARE_UNKNOWN: > + BUG("invalid discovery_bare_config %d", discovery_bare_config); > + } > + return 0; > +} With the recommended change to the _cb method, we could rewrite this as static enum discovery_bare_config get_discovery_bare(void) { enum discovery_bare_config result = DISCOVERY_BARE_ALWAYS; git_protected_config(discovery_bare_cb, &result); return result; } With this, we can drop the UNKNOWN and let the caller treat the response as a simple boolean. I think this is simpler overall, but also makes it easier to extend in the future to have "discovery.bare=non-embedded" by adding a new mode and adjusting the consumer in setup_git_directory_gently_1() to use a switch() on the resurned enum. > + > +static const char *discovery_bare_config_to_string(void) > +{ > + switch (discovery_bare_config) { > + case DISCOVERY_BARE_NEVER: > + return "never"; > + case DISCOVERY_BARE_ALWAYS: > + return "always"; > + case DISCOVERY_BARE_UNKNOWN: > + BUG("invalid discovery_bare_config %d", discovery_bare_config); This case should be a "default:" in case somehow an arbitrary integer value was placed in the variable. This could also take an enum as a parameter, to avoid being coupled to the global. > +++ b/t/t0035-discovery-bare.sh > @@ -0,0 +1,64 @@ > +#!/bin/sh > + > +test_description='verify discovery.bare checks' > + > +. ./test-lib.sh > + > +pwd="$(pwd)" > + > +expect_rejected () { > + test_must_fail git rev-parse --git-dir 2>err && > + grep "discovery.bare" err > +} Should we make a simple "expect_accepted" helper in case we ever want to replace the "git rev-parse --git-dir" with anything else? > + > +test_expect_success 'setup bare repo in worktree' ' > + git init outer-repo && > + git init --bare outer-repo/bare-repo > +' > + > +test_expect_success 'discovery.bare unset' ' > + ( > + cd outer-repo/bare-repo && > + git rev-parse --git-dir > + ) > +' > + > +test_expect_success 'discovery.bare=always' ' > + git config --global discovery.bare always && > + ( > + cd outer-repo/bare-repo && > + git rev-parse --git-dir > + ) > +' > + > +test_expect_success 'discovery.bare=never' ' > + git config --global discovery.bare never && > + ( > + cd outer-repo/bare-repo && > + expect_rejected > + ) > +' > + > +test_expect_success 'discovery.bare in the repository' ' > + ( > + cd outer-repo/bare-repo && > + # Temporarily set discovery.bare=always, otherwise git > + # config fails with "fatal: not in a git directory" > + # (like safe.directory) > + git config --global discovery.bare always && > + git config discovery.bare always && > + git config --global discovery.bare never && > + expect_rejected > + ) > +' > + > +test_expect_success 'discovery.bare on the command line' ' > + git config --global discovery.bare never &&> + ( > + cd outer-repo/bare-repo && > + test_must_fail git -c discovery.bare=always rev-parse --git-dir 2>err && > + grep "discovery.bare" err > + ) Ok, at the current place in the series, this test_must_fail matches expectation. If you reorder to have this patch after your current patch 4, then we can write this test immediately as a successful case. We could also reuse some information from the expect_rejected helper by adding this: expect_rejected () { test_must_fail git $* rev-parse --git-dir 2>err && grep "discovery.bare" err } Then you can test the -c options in the tests as expect_rejected -c discovery.bare=always Thanks, -Stolee