Skip to content

Commit 133a880

Browse files
committed
Merge branch 'ac/help-sort-correctly'
The code in "git help" that shows configuration items in sorted order was awkwardly organized and prone to bugs. * ac/help-sort-correctly: help: cleanup the contruction of keys_uniq
2 parents 05f91df + 088e994 commit 133a880

File tree

2 files changed

+78
-52
lines changed

2 files changed

+78
-52
lines changed

builtin/help.c

Lines changed: 56 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,49 @@ struct slot_expansion {
114114
int found;
115115
};
116116

117+
static void set_config_vars(struct string_list *keys_uniq, struct string_list_item *var)
118+
{
119+
struct strbuf sb = STRBUF_INIT;
120+
const char *str = var->string;
121+
const char *wildcard = strchr(str, '*');
122+
const char *tag = strchr(str, '<');
123+
const char *cut;
124+
125+
if (wildcard && tag)
126+
cut = wildcard < tag ? wildcard : tag;
127+
else if (wildcard)
128+
cut = wildcard;
129+
else if (tag)
130+
cut = tag;
131+
else {
132+
string_list_append(keys_uniq, str);
133+
return;
134+
}
135+
136+
strbuf_add(&sb, str, cut - str);
137+
string_list_append(keys_uniq, sb.buf);
138+
strbuf_release(&sb);
139+
}
140+
141+
static void set_config_sections(struct string_list *keys_uniq, struct string_list_item *var)
142+
{
143+
struct strbuf sb = STRBUF_INIT;
144+
const char *str = var->string;
145+
const char *dot = strchr(str, '.');
146+
const char *cut;
147+
148+
if (dot)
149+
cut = dot;
150+
else {
151+
set_config_vars(keys_uniq, var);
152+
return;
153+
}
154+
155+
strbuf_add(&sb, str, cut - str);
156+
string_list_append(keys_uniq, sb.buf);
157+
strbuf_release(&sb);
158+
}
159+
117160
static void list_config_help(enum show_config_type type)
118161
{
119162
struct slot_expansion slot_expansions[] = {
@@ -134,13 +177,12 @@ static void list_config_help(enum show_config_type type)
134177
struct string_list keys = STRING_LIST_INIT_DUP;
135178
struct string_list keys_uniq = STRING_LIST_INIT_DUP;
136179
struct string_list_item *item;
180+
struct strbuf sb = STRBUF_INIT;
137181

138182
for (p = config_name_list; *p; p++) {
139183
const char *var = *p;
140-
struct strbuf sb = STRBUF_INIT;
141184

142185
for (e = slot_expansions; e->prefix; e++) {
143-
144186
strbuf_reset(&sb);
145187
strbuf_addf(&sb, "%s.%s", e->prefix, e->placeholder);
146188
if (!strcasecmp(var, sb.buf)) {
@@ -149,60 +191,39 @@ static void list_config_help(enum show_config_type type)
149191
break;
150192
}
151193
}
152-
strbuf_release(&sb);
194+
153195
if (!e->prefix)
154196
string_list_append(&keys, var);
155197
}
156198

199+
strbuf_release(&sb);
200+
157201
for (e = slot_expansions; e->prefix; e++)
158202
if (!e->found)
159203
BUG("slot_expansion %s.%s is not used",
160204
e->prefix, e->placeholder);
161205

162-
string_list_sort(&keys);
163206
for (size_t i = 0; i < keys.nr; i++) {
164-
const char *var = keys.items[i].string;
165-
const char *wildcard, *tag, *cut;
166-
const char *dot = NULL;
167-
struct strbuf sb = STRBUF_INIT;
168-
169207
switch (type) {
170208
case SHOW_CONFIG_HUMAN:
171-
puts(var);
172-
continue;
209+
string_list_append(&keys_uniq, keys.items[i].string);
210+
break;
173211
case SHOW_CONFIG_SECTIONS:
174-
dot = strchr(var, '.');
212+
set_config_sections(&keys_uniq, &keys.items[i]);
175213
break;
176214
case SHOW_CONFIG_VARS:
215+
set_config_vars(&keys_uniq, &keys.items[i]);
177216
break;
217+
default:
218+
BUG("%d: unexpected type", type);
178219
}
179-
wildcard = strchr(var, '*');
180-
tag = strchr(var, '<');
181-
182-
if (!dot && !wildcard && !tag) {
183-
string_list_append(&keys_uniq, var);
184-
continue;
185-
}
186-
187-
if (dot)
188-
cut = dot;
189-
else if (wildcard && !tag)
190-
cut = wildcard;
191-
else if (!wildcard && tag)
192-
cut = tag;
193-
else
194-
cut = wildcard < tag ? wildcard : tag;
195-
196-
strbuf_add(&sb, var, cut - var);
197-
string_list_append(&keys_uniq, sb.buf);
198-
strbuf_release(&sb);
199-
200220
}
201-
string_list_clear(&keys, 0);
202-
string_list_remove_duplicates(&keys_uniq, 0);
221+
222+
string_list_sort_u(&keys_uniq, 0);
203223
for_each_string_list_item(item, &keys_uniq)
204224
puts(item->string);
205225
string_list_clear(&keys_uniq, 0);
226+
string_list_clear(&keys, 0);
206227
}
207228

208229
static enum help_format parse_help_format(const char *format)

t/t0012-help.sh

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -141,35 +141,40 @@ test_expect_success 'git help -c' '
141141
142142
'\''git help config'\'' for more information
143143
EOF
144-
grep -v -E \
145-
-e "^[^.]+\.[^.]+$" \
146-
-e "^[^.]+\.[^.]+\.[^.]+$" \
147-
help.output >actual &&
144+
sed -E -e "
145+
/^[^.]+\.[^.]+$/d
146+
/^[^.]+\.[^.]+\.[^.]+$/d
147+
" help.output >actual &&
148148
test_cmp expect actual
149149
'
150150

151151
test_expect_success 'git help --config-for-completion' '
152152
git help -c >human &&
153-
grep -E \
154-
-e "^[^.]+\.[^.]+$" \
155-
-e "^[^.]+\.[^.]+\.[^.]+$" human |
156-
sed -e "s/\*.*//" -e "s/<.*//" |
157-
sort -u >human.munged &&
153+
sed -E -e "
154+
/^[^.]+\.[^.]+$/b out
155+
/^[^.]+\.[^.]+\.[^.]+$/b out
156+
d
157+
: out
158+
s/\*.*//
159+
s/<.*//
160+
" human | sort -u >human.munged &&
158161
159162
git help --config-for-completion >vars &&
160163
test_cmp human.munged vars
161164
'
162165

163166
test_expect_success 'git help --config-sections-for-completion' '
164167
git help -c >human &&
165-
grep -E \
166-
-e "^[^.]+\.[^.]+$" \
167-
-e "^[^.]+\.[^.]+\.[^.]+$" human |
168-
sed -e "s/\..*//" |
169-
sort -u >human.munged &&
170-
171-
git help --config-sections-for-completion >sections &&
172-
test_cmp human.munged sections
168+
sed -E -e "
169+
/^[^.]+\.[^.]+$/b out
170+
/^[^.]+\.[^.]+\.[^.]+$/b out
171+
d
172+
: out
173+
s/\..*//
174+
" human | sort -u >expect &&
175+
176+
git help --config-sections-for-completion >actual &&
177+
test_cmp expect actual
173178
'
174179

175180
test_section_spacing () {

0 commit comments

Comments
 (0)