shejialuo <shejialuo@xxxxxxxxx> writes: > Some fields such as "msg_type" and "skiplist" in "fsck_objects_options" > are not options, these fields are related to "git-config(1)" which are > initialized using "git_fsck_config" function. Create a static variable > named "fsck_configs" in "fsck.c" which aims at handling configs. Thus we > don't need to reply on the "fsck_objects_options" to set up the fsck > error message severity. reply??? As configuration often is used to prepopulate options, I need a lot stonger justification to split these into a different structure than "'config' is a noun that is different from a noun 'option'". If we intend to have many "option" instances but what these two members store will be the same across these "option" instances, for example, that would be a lot better reason why we may want to separate these two members out of it, but I have a suspicion that if we were to use the "union with tags" approach, these two would become members of the common part shared between "objects' and "refs", i.e. the overall data structure might look more like this: struct fsck_options { enum fsck_msg_type *msg_type; struct oidset oid_skiplist; enum fsck_what_check { O, R } tag; union { struct fsck_object_options o; struct fsck_ref_options r; } u; }; by moving these two members out of fsck_object_options and moving them to the shared part. I dunno. It is unclear what the real reason is for these two things to be extracted out and made to appear totally independent from the "options" thing to begin with, and I am not sure if I agree with the reason when it is known.