column: fix parsing of the '--nl' option

'git column's '--nl' option can be used to specify a "string to be
printed at the end of each line" (quoting the man page), but this
option and its mandatory argument has been parsed as OPT_INTEGER since
the introduction of the command in 7e29b8254f (Add column layout
skeleton and git-column, 2012-04-21).  Consequently, any non-number
argument is rejected by parse-options, and any number other than 0
leads to segfault:

  $ printf "%s\n" one two |git column --mode=plain --nl=foo
  error: option `nl' expects a numerical value
  $ printf "%s\n" one two |git column --mode=plain --nl=42
  Segmentation fault (core dumped)
  $ printf "%s\n" one two |git column --mode=plain --nl=0
  one
  two

Parse this option as OPT_STRING.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
SZEDER Gábor 2021-08-18 11:24:56 +02:00 коммит произвёл Junio C Hamano
Родитель 225bc32a98
Коммит c93ca46cf5
3 изменённых файлов: 20 добавлений и 2 удалений

Просмотреть файл

@ -39,7 +39,7 @@ OPTIONS
--indent=<string>:: --indent=<string>::
String to be printed at the beginning of each line. String to be printed at the beginning of each line.
--nl=<N>:: --nl=<string>::
String to be printed at the end of each line, String to be printed at the end of each line,
including newline character. including newline character.

Просмотреть файл

@ -29,7 +29,7 @@ int cmd_column(int argc, const char **argv, const char *prefix)
OPT_INTEGER(0, "raw-mode", &colopts, N_("layout to use")), OPT_INTEGER(0, "raw-mode", &colopts, N_("layout to use")),
OPT_INTEGER(0, "width", &copts.width, N_("maximum width")), OPT_INTEGER(0, "width", &copts.width, N_("maximum width")),
OPT_STRING(0, "indent", &copts.indent, N_("string"), N_("padding space on left border")), OPT_STRING(0, "indent", &copts.indent, N_("string"), N_("padding space on left border")),
OPT_INTEGER(0, "nl", &copts.nl, N_("padding space on right border")), OPT_STRING(0, "nl", &copts.nl, N_("string"), N_("padding space on right border")),
OPT_INTEGER(0, "padding", &copts.padding, N_("padding space between columns")), OPT_INTEGER(0, "padding", &copts.padding, N_("padding space between columns")),
OPT_END() OPT_END()
}; };

Просмотреть файл

@ -42,6 +42,24 @@ EOF
test_cmp expected actual test_cmp expected actual
' '
test_expect_success '--nl' '
cat >expected <<\EOF &&
oneZ
twoZ
threeZ
fourZ
fiveZ
sixZ
sevenZ
eightZ
nineZ
tenZ
elevenZ
EOF
git column --nl="Z$LF" --mode=plain <lista >actual &&
test_cmp expected actual
'
test_expect_success '80 columns' ' test_expect_success '80 columns' '
cat >expected <<\EOF && cat >expected <<\EOF &&
one two three four five six seven eight nine ten eleven one two three four five six seven eight nine ten eleven