Skip to content

Commit 07acda1

Browse files
amishhaagitster
authored andcommitted
help: cleanup the contruction of keys_uniq
uniqueness property of keys_uniq depends on the sort operation executed for keys, sorted property of keys does not gurantee sorted property of keys_uniq due to processing keys, this might also introduce regressions in future when the logic of forming keys_uniq from keys is changed. add string_list_sort_u operation for keys_uniq and refactor the processing code to simplify it. Signed-off-by: Amisha Chhajed <136238836+amishhaa@users.noreply.github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 7c02d39 commit 07acda1

1 file changed

Lines changed: 90 additions & 44 deletions

File tree

builtin/help.c

Lines changed: 90 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,84 @@ struct slot_expansion {
111111
int found;
112112
};
113113

114+
static void show_config_human(struct string_list *keys)
115+
{
116+
string_list_sort(keys);
117+
for (size_t i = 0; i < keys->nr; i++) {
118+
const char *var = keys->items[i].string;
119+
puts(var);
120+
}
121+
}
122+
123+
static void show_config_sections(struct string_list *keys)
124+
{
125+
struct string_list keys_uniq = STRING_LIST_INIT_DUP;
126+
struct strbuf sb = STRBUF_INIT;
127+
struct string_list_item *item;
128+
129+
for (size_t i = 0; i < keys->nr; i++) {
130+
const char *var = keys->items[i].string;
131+
const char *dot = strchr(var, '.');
132+
const char *wildcard = strchr(var, '*');
133+
const char *tag = strchr(var, '<');
134+
const char *cut;
135+
136+
if (dot)
137+
cut = dot;
138+
else if (wildcard && tag)
139+
cut = wildcard < tag ? wildcard : tag;
140+
else if (wildcard)
141+
cut = wildcard;
142+
else if (tag)
143+
cut = tag;
144+
else {
145+
string_list_append(&keys_uniq, var);
146+
continue;
147+
}
148+
149+
strbuf_add(&sb, var, cut - var);
150+
string_list_append(&keys_uniq, sb.buf);
151+
strbuf_release(&sb);
152+
}
153+
string_list_sort_u(&keys_uniq, 0);
154+
for_each_string_list_item(item, &keys_uniq)
155+
puts(item->string);
156+
string_list_clear(&keys_uniq, 0);
157+
}
158+
159+
static void show_config_vars(struct string_list *keys)
160+
{
161+
struct string_list keys_uniq = STRING_LIST_INIT_DUP;
162+
struct strbuf sb = STRBUF_INIT;
163+
struct string_list_item *item;
164+
165+
for (size_t i = 0; i < keys->nr; i++) {
166+
const char *var = keys->items[i].string;
167+
const char *wildcard = strchr(var, '*');
168+
const char *tag = strchr(var, '<');
169+
const char *cut;
170+
171+
if (wildcard && tag)
172+
cut = wildcard < tag ? wildcard : tag;
173+
else if (wildcard)
174+
cut = wildcard;
175+
else if (tag)
176+
cut = tag;
177+
else {
178+
string_list_append(&keys_uniq, var);
179+
continue;
180+
}
181+
182+
strbuf_add(&sb, var, cut - var);
183+
string_list_append(&keys_uniq, sb.buf);
184+
strbuf_release(&sb);
185+
}
186+
string_list_sort_u(&keys_uniq, 0);
187+
for_each_string_list_item(item, &keys_uniq)
188+
puts(item->string);
189+
string_list_clear(&keys_uniq, 0);
190+
}
191+
114192
static void list_config_help(enum show_config_type type)
115193
{
116194
struct slot_expansion slot_expansions[] = {
@@ -129,8 +207,6 @@ static void list_config_help(enum show_config_type type)
129207
const char **p;
130208
struct slot_expansion *e;
131209
struct string_list keys = STRING_LIST_INIT_DUP;
132-
struct string_list keys_uniq = STRING_LIST_INIT_DUP;
133-
struct string_list_item *item;
134210

135211
for (p = config_name_list; *p; p++) {
136212
const char *var = *p;
@@ -156,50 +232,20 @@ static void list_config_help(enum show_config_type type)
156232
BUG("slot_expansion %s.%s is not used",
157233
e->prefix, e->placeholder);
158234

159-
string_list_sort(&keys);
160-
for (size_t i = 0; i < keys.nr; i++) {
161-
const char *var = keys.items[i].string;
162-
const char *wildcard, *tag, *cut;
163-
const char *dot = NULL;
164-
struct strbuf sb = STRBUF_INIT;
165-
166-
switch (type) {
167-
case SHOW_CONFIG_HUMAN:
168-
puts(var);
169-
continue;
170-
case SHOW_CONFIG_SECTIONS:
171-
dot = strchr(var, '.');
172-
break;
173-
case SHOW_CONFIG_VARS:
174-
break;
175-
}
176-
wildcard = strchr(var, '*');
177-
tag = strchr(var, '<');
178-
179-
if (!dot && !wildcard && !tag) {
180-
string_list_append(&keys_uniq, var);
181-
continue;
182-
}
183-
184-
if (dot)
185-
cut = dot;
186-
else if (wildcard && !tag)
187-
cut = wildcard;
188-
else if (!wildcard && tag)
189-
cut = tag;
190-
else
191-
cut = wildcard < tag ? wildcard : tag;
192-
193-
strbuf_add(&sb, var, cut - var);
194-
string_list_append(&keys_uniq, sb.buf);
195-
strbuf_release(&sb);
196-
235+
switch (type) {
236+
case SHOW_CONFIG_HUMAN:
237+
show_config_human(&keys);
238+
break;
239+
case SHOW_CONFIG_SECTIONS:
240+
show_config_sections(&keys);
241+
break;
242+
case SHOW_CONFIG_VARS:
243+
show_config_vars(&keys);
244+
break;
245+
default:
246+
BUG("%d: unexpected type", type);
197247
}
198248
string_list_clear(&keys, 0);
199-
string_list_remove_duplicates(&keys_uniq, 0);
200-
for_each_string_list_item(item, &keys_uniq)
201-
puts(item->string);
202-
string_list_clear(&keys_uniq, 0);
203249
}
204250

205251
static enum help_format parse_help_format(const char *format)

0 commit comments

Comments
 (0)