From: Junio C Hamano Date: Fri, 13 Mar 2026 17:54:41 GMT Subject: Re: [PATCH v1] builtin/mktree: remove USE_THE_REPOSITORY_VARIABLE Message-ID: In-Reply-To: <4fb9c915-7246-4c55-b7c6-b4ef7ca91230@malon.dev> Tian Yuchen writes: > On 3/14/26 00:03, Junio C Hamano wrote: > >> There is one corner case; upon "git foo -h", your cmd_foo() will get >> repo==NULL when the command is run outside a repository. As long as >> your cmd_foo() asks parse_options() to react to "-h" (which gives >> the help message and then exits) before it uses repo assuming it >> cannot be NULL, you are safe. > > I was completely blown away Σ( ° △ °) > > Thanks for pointing that out. Otherwise, I wouldn’t have been able to > figure it out no matter how hard I try. > > I just took a quick look at the code: > >> const struct option option[] = { >> OPT_BOOL('z', NULL, &nul_term_line, N_("input is NUL terminated")), >> OPT_SET_INT( 0 , "missing", &allow_missing, N_("allow missing objects"), 1), >> OPT_SET_INT( 0 , "batch", &is_batch_mode, N_("allow creation of more than one tree"), 1), >> OPT_END() >> }; >> >> ac = parse_options(ac, av, prefix, option, mktree_usage, 0); >> getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; >> >> while (!got_eof) { >> while (1) { ... > > I think if there's a '-h' parameter, it gets intercepted in > parse_options() and the process exits before repo is called. So there’s > nothing to worry about, right? Correct. The function calls parse_options() before it looks at "repo". > By the way, I find it a bit confusing that the'`-h' parameter — which is > solely used for documentation query — is parsed and intercepted within a > function that handles actual business logic. I strongly disagree your idea that 'z' is more business logic than 'h' is. Both are equally relevant.