Merge branch 'dk/parseopt-optional-filename-fixes'

A recently added configuration variable and command line option
syntax ":(optional)" for values that are of filename type
inconsistently behaved on an empty file (configuration took it
happily, while the command line option pretended as if it did not
exist), which has been corrected.

* dk/parseopt-optional-filename-fixes:
  parseopt: remove unreachable code
  parseopt: restore const qualifier to parsed filename
  config: use boolean type for a simple flag
  parseopt: use boolean type for a simple flag
  doc: clarify command equivalence comment
  parseopt: fix :(optional) at command line to only ignore missing files
main
Junio C Hamano 2025-11-06 15:17:01 -08:00
commit 4badef0c35
3 changed files with 5 additions and 7 deletions

View File

@ -223,7 +223,7 @@ Options that take a filename allow a prefix `:(optional)`. For example:

----------------------------
git commit -F :(optional)COMMIT_EDITMSG
# if COMMIT_EDITMSG does not exist, equivalent to
# if COMMIT_EDITMSG does not exist, the above is equivalent to
git commit
----------------------------


View File

@ -1278,7 +1278,7 @@ int git_config_string(char **dest, const char *var, const char *value)

int git_config_pathname(char **dest, const char *var, const char *value)
{
int is_optional;
bool is_optional;
char *path;

if (!value)

View File

@ -208,12 +208,12 @@ static enum parse_opt_result do_get_value(struct parse_opt_ctx_t *p,
case OPTION_FILENAME:
{
const char *value;
int is_optional;
bool is_optional;

if (unset)
value = NULL;
else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
value = (char *)opt->defval;
value = (const char *)opt->defval;
else {
int err = get_arg(p, opt, flags, &value);
if (err)
@ -223,10 +223,8 @@ static enum parse_opt_result do_get_value(struct parse_opt_ctx_t *p,
return 0;

is_optional = skip_prefix(value, ":(optional)", &value);
if (!value)
is_optional = 0;
value = fix_filename(p->prefix, value);
if (is_optional && is_empty_or_missing_file(value)) {
if (is_optional && is_missing_file(value)) {
free((char *)value);
} else {
FREE_AND_NULL(*(char **)opt->value);