@@ -96,13 +96,59 @@ static struct {
9696 { "pushNonFastForward" , & advice_push_update_rejected }
9797};
9898
99- static void vadvise (const char * advice , va_list params )
99+ static struct {
100+ const char * key ;
101+ int enabled ;
102+ } advice_setting [] = {
103+ [ADVICE_ADD_EMBEDDED_REPO ] = { "addEmbeddedRepo" , 1 },
104+ [ADVICE_AM_WORK_DIR ] = { "amWorkDir" , 1 },
105+ [ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME ] = { "checkoutAmbiguousRemoteBranchName" , 1 },
106+ [ADVICE_COMMIT_BEFORE_MERGE ] = { "commitBeforeMerge" , 1 },
107+ [ADVICE_DETACHED_HEAD ] = { "detachedHead" , 1 },
108+ [ADVICE_FETCH_SHOW_FORCED_UPDATES ] = { "fetchShowForcedUpdates" , 1 },
109+ [ADVICE_GRAFT_FILE_DEPRECATED ] = { "graftFileDeprecated" , 1 },
110+ [ADVICE_IGNORED_HOOK ] = { "ignoredHook" , 1 },
111+ [ADVICE_IMPLICIT_IDENTITY ] = { "implicitIdentity" , 1 },
112+ [ADVICE_NESTED_TAG ] = { "nestedTag" , 1 },
113+ [ADVICE_OBJECT_NAME_WARNING ] = { "objectNameWarning" , 1 },
114+ [ADVICE_PUSH_ALREADY_EXISTS ] = { "pushAlreadyExists" , 1 },
115+ [ADVICE_PUSH_FETCH_FIRST ] = { "pushFetchFirst" , 1 },
116+ [ADVICE_PUSH_NEEDS_FORCE ] = { "pushNeedsForce" , 1 },
117+
118+ /* make this an alias for backward compatibility */
119+ [ADVICE_PUSH_UPDATE_REJECTED_ALIAS ] = { "pushNonFastForward" , 1 },
120+
121+ [ADVICE_PUSH_NON_FF_CURRENT ] = { "pushNonFFCurrent" , 1 },
122+ [ADVICE_PUSH_NON_FF_MATCHING ] = { "pushNonFFMatching" , 1 },
123+ [ADVICE_PUSH_UNQUALIFIED_REF_NAME ] = { "pushUnqualifiedRefName" , 1 },
124+ [ADVICE_PUSH_UPDATE_REJECTED ] = { "pushUpdateRejected" , 1 },
125+ [ADVICE_RESET_QUIET_WARNING ] = { "resetQuiet" , 1 },
126+ [ADVICE_RESOLVE_CONFLICT ] = { "resolveConflict" , 1 },
127+ [ADVICE_RM_HINTS ] = { "rmHints" , 1 },
128+ [ADVICE_SEQUENCER_IN_USE ] = { "sequencerInUse" , 1 },
129+ [ADVICE_SET_UPSTREAM_FAILURE ] = { "setUpstreamFailure" , 1 },
130+ [ADVICE_STATUS_AHEAD_BEHIND_WARNING ] = { "statusAheadBehindWarning" , 1 },
131+ [ADVICE_STATUS_HINTS ] = { "statusHints" , 1 },
132+ [ADVICE_STATUS_U_OPTION ] = { "statusUoption" , 1 },
133+ [ADVICE_SUBMODULE_ALTERNATE_ERROR_STRATEGY_DIE ] = { "submoduleAlternateErrorStrategyDie" , 1 },
134+ [ADVICE_WAITING_FOR_EDITOR ] = { "waitingForEditor" , 1 },
135+ };
136+
137+ static const char turn_off_instructions [] =
138+ N_ ("\n"
139+ "Disable this message with \"git config advice.%s false\"" );
140+
141+ static void vadvise (const char * advice , int display_instructions ,
142+ const char * key , va_list params )
100143{
101144 struct strbuf buf = STRBUF_INIT ;
102145 const char * cp , * np ;
103146
104147 strbuf_vaddf (& buf , advice , params );
105148
149+ if (display_instructions )
150+ strbuf_addf (& buf , turn_off_instructions , key );
151+
106152 for (cp = buf .buf ; * cp ; cp = np ) {
107153 np = strchrnul (cp , '\n' );
108154 fprintf (stderr , _ ("%shint: %.*s%s\n" ),
@@ -119,7 +165,30 @@ void advise(const char *advice, ...)
119165{
120166 va_list params ;
121167 va_start (params , advice );
122- vadvise (advice , params );
168+ vadvise (advice , 0 , "" , params );
169+ va_end (params );
170+ }
171+
172+ int advice_enabled (enum advice_type type )
173+ {
174+ switch (type ) {
175+ case ADVICE_PUSH_UPDATE_REJECTED :
176+ return advice_setting [ADVICE_PUSH_UPDATE_REJECTED ].enabled &&
177+ advice_setting [ADVICE_PUSH_UPDATE_REJECTED_ALIAS ].enabled ;
178+ default :
179+ return advice_setting [type ].enabled ;
180+ }
181+ }
182+
183+ void advise_if_enabled (enum advice_type type , const char * advice , ...)
184+ {
185+ va_list params ;
186+
187+ if (!advice_enabled (type ))
188+ return ;
189+
190+ va_start (params , advice );
191+ vadvise (advice , 1 , advice_setting [type ].key , params );
123192 va_end (params );
124193}
125194
@@ -149,6 +218,13 @@ int git_default_advice_config(const char *var, const char *value)
149218 if (strcasecmp (k , advice_config [i ].name ))
150219 continue ;
151220 * advice_config [i ].preference = git_config_bool (var , value );
221+ break ;
222+ }
223+
224+ for (i = 0 ; i < ARRAY_SIZE (advice_setting ); i ++ ) {
225+ if (strcasecmp (k , advice_setting [i ].key ))
226+ continue ;
227+ advice_setting [i ].enabled = git_config_bool (var , value );
152228 return 0 ;
153229 }
154230
@@ -159,8 +235,8 @@ void list_config_advices(struct string_list *list, const char *prefix)
159235{
160236 int i ;
161237
162- for (i = 0 ; i < ARRAY_SIZE (advice_config ); i ++ )
163- list_config_item (list , prefix , advice_config [i ].name );
238+ for (i = 0 ; i < ARRAY_SIZE (advice_setting ); i ++ )
239+ list_config_item (list , prefix , advice_setting [i ].key );
164240}
165241
166242int error_resolve_conflict (const char * me )
0 commit comments