Skip to content

Commit 78d1502

Browse files
committed
Merge branch 'jk/ref-filter-error-reporting-fix'
Clean-ups in error messages produced by "git for-each-ref" and friends. * jk/ref-filter-error-reporting-fix: ref-filter: convert email atom parser to use err_bad_arg() ref-filter: truncate atom names in error messages ref-filter: factor out "unrecognized %(foo) arg" errors ref-filter: factor out "%(foo) does not take arguments" errors ref-filter: reject arguments to %(HEAD)
2 parents d4539b5 + 285da43 commit 78d1502

File tree

2 files changed

+49
-13
lines changed

2 files changed

+49
-13
lines changed

ref-filter.c

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,22 @@ static int strbuf_addf_ret(struct strbuf *sb, int ret, const char *fmt, ...)
228228
return ret;
229229
}
230230

231+
static int err_no_arg(struct strbuf *sb, const char *name)
232+
{
233+
size_t namelen = strchrnul(name, ':') - name;
234+
strbuf_addf(sb, _("%%(%.*s) does not take arguments"),
235+
(int)namelen, name);
236+
return -1;
237+
}
238+
239+
static int err_bad_arg(struct strbuf *sb, const char *name, const char *arg)
240+
{
241+
size_t namelen = strchrnul(name, ':') - name;
242+
strbuf_addf(sb, _("unrecognized %%(%.*s) argument: %s"),
243+
(int)namelen, name, arg);
244+
return -1;
245+
}
246+
231247
static int color_atom_parser(struct ref_format *format, struct used_atom *atom,
232248
const char *color_value, struct strbuf *err)
233249
{
@@ -262,7 +278,7 @@ static int refname_atom_parser_internal(struct refname_atom *atom, const char *a
262278
if (strtol_i(arg, 10, &atom->rstrip))
263279
return strbuf_addf_ret(err, -1, _("Integer value expected refname:rstrip=%s"), arg);
264280
} else
265-
return strbuf_addf_ret(err, -1, _("unrecognized %%(%s) argument: %s"), name, arg);
281+
return err_bad_arg(err, name, arg);
266282
return 0;
267283
}
268284

@@ -317,7 +333,7 @@ static int objecttype_atom_parser(struct ref_format *format, struct used_atom *a
317333
const char *arg, struct strbuf *err)
318334
{
319335
if (arg)
320-
return strbuf_addf_ret(err, -1, _("%%(objecttype) does not take arguments"));
336+
return err_no_arg(err, "objecttype");
321337
if (*atom->name == '*')
322338
oi_deref.info.typep = &oi_deref.type;
323339
else
@@ -341,15 +357,15 @@ static int objectsize_atom_parser(struct ref_format *format, struct used_atom *a
341357
else
342358
oi.info.disk_sizep = &oi.disk_size;
343359
} else
344-
return strbuf_addf_ret(err, -1, _("unrecognized %%(%s) argument: %s"), "objectsize", arg);
360+
return err_bad_arg(err, "objectsize", arg);
345361
return 0;
346362
}
347363

348364
static int deltabase_atom_parser(struct ref_format *format, struct used_atom *atom,
349365
const char *arg, struct strbuf *err)
350366
{
351367
if (arg)
352-
return strbuf_addf_ret(err, -1, _("%%(deltabase) does not take arguments"));
368+
return err_no_arg(err, "deltabase");
353369
if (*atom->name == '*')
354370
oi_deref.info.delta_base_oid = &oi_deref.delta_base_oid;
355371
else
@@ -361,7 +377,7 @@ static int body_atom_parser(struct ref_format *format, struct used_atom *atom,
361377
const char *arg, struct strbuf *err)
362378
{
363379
if (arg)
364-
return strbuf_addf_ret(err, -1, _("%%(body) does not take arguments"));
380+
return err_no_arg(err, "body");
365381
atom->u.contents.option = C_BODY_DEP;
366382
return 0;
367383
}
@@ -374,7 +390,7 @@ static int subject_atom_parser(struct ref_format *format, struct used_atom *atom
374390
else if (!strcmp(arg, "sanitize"))
375391
atom->u.contents.option = C_SUB_SANITIZE;
376392
else
377-
return strbuf_addf_ret(err, -1, _("unrecognized %%(%s) argument: %s"), "subject", arg);
393+
return err_bad_arg(err, "subject", arg);
378394
return 0;
379395
}
380396

@@ -428,7 +444,7 @@ static int contents_atom_parser(struct ref_format *format, struct used_atom *ato
428444
if (strtoul_ui(arg, 10, &atom->u.contents.nlines))
429445
return strbuf_addf_ret(err, -1, _("positive value expected contents:lines=%s"), arg);
430446
} else
431-
return strbuf_addf_ret(err, -1, _("unrecognized %%(%s) argument: %s"), "contents", arg);
447+
return err_bad_arg(err, "contents", arg);
432448
return 0;
433449
}
434450

@@ -440,7 +456,7 @@ static int raw_atom_parser(struct ref_format *format, struct used_atom *atom,
440456
else if (!strcmp(arg, "size"))
441457
atom->u.raw_data.option = RAW_LENGTH;
442458
else
443-
return strbuf_addf_ret(err, -1, _("unrecognized %%(%s) argument: %s"), "raw", arg);
459+
return err_bad_arg(err, "raw", arg);
444460
return 0;
445461
}
446462

@@ -459,7 +475,7 @@ static int oid_atom_parser(struct ref_format *format, struct used_atom *atom,
459475
if (atom->u.oid.length < MINIMUM_ABBREV)
460476
atom->u.oid.length = MINIMUM_ABBREV;
461477
} else
462-
return strbuf_addf_ret(err, -1, _("unrecognized %%(%s) argument: %s"), atom->name, arg);
478+
return err_bad_arg(err, atom->name, arg);
463479
return 0;
464480
}
465481

@@ -473,7 +489,7 @@ static int person_email_atom_parser(struct ref_format *format, struct used_atom
473489
else if (!strcmp(arg, "localpart"))
474490
atom->u.email_option.option = EO_LOCALPART;
475491
else
476-
return strbuf_addf_ret(err, -1, _("unrecognized email option: %s"), arg);
492+
return err_bad_arg(err, atom->name, arg);
477493
return 0;
478494
}
479495

@@ -557,22 +573,24 @@ static int if_atom_parser(struct ref_format *format, struct used_atom *atom,
557573
} else if (skip_prefix(arg, "notequals=", &atom->u.if_then_else.str)) {
558574
atom->u.if_then_else.cmp_status = COMPARE_UNEQUAL;
559575
} else
560-
return strbuf_addf_ret(err, -1, _("unrecognized %%(%s) argument: %s"), "if", arg);
576+
return err_bad_arg(err, "if", arg);
561577
return 0;
562578
}
563579

564580
static int rest_atom_parser(struct ref_format *format, struct used_atom *atom,
565581
const char *arg, struct strbuf *err)
566582
{
567583
if (arg)
568-
return strbuf_addf_ret(err, -1, _("%%(rest) does not take arguments"));
584+
return err_no_arg(err, "rest");
569585
format->use_rest = 1;
570586
return 0;
571587
}
572588

573589
static int head_atom_parser(struct ref_format *format, struct used_atom *atom,
574-
const char *arg, struct strbuf *unused_err)
590+
const char *arg, struct strbuf *err)
575591
{
592+
if (arg)
593+
return err_no_arg(err, "HEAD");
576594
atom->u.head = resolve_refdup("HEAD", RESOLVE_REF_READING, NULL, NULL);
577595
return 0;
578596
}

t/t6300-for-each-ref.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,6 +1242,24 @@ test_expect_success 'basic atom: rest must fail' '
12421242
test_must_fail git for-each-ref --format="%(rest)" refs/heads/main
12431243
'
12441244

1245+
test_expect_success 'HEAD atom does not take arguments' '
1246+
test_must_fail git for-each-ref --format="%(HEAD:foo)" 2>err &&
1247+
echo "fatal: %(HEAD) does not take arguments" >expect &&
1248+
test_cmp expect err
1249+
'
1250+
1251+
test_expect_success 'subject atom rejects unknown arguments' '
1252+
test_must_fail git for-each-ref --format="%(subject:foo)" 2>err &&
1253+
echo "fatal: unrecognized %(subject) argument: foo" >expect &&
1254+
test_cmp expect err
1255+
'
1256+
1257+
test_expect_success 'refname atom rejects unknown arguments' '
1258+
test_must_fail git for-each-ref --format="%(refname:foo)" 2>err &&
1259+
echo "fatal: unrecognized %(refname) argument: foo" >expect &&
1260+
test_cmp expect err
1261+
'
1262+
12451263
test_expect_success 'trailer parsing not fooled by --- line' '
12461264
git commit --allow-empty -F - <<-\EOF &&
12471265
this is the subject

0 commit comments

Comments
 (0)