mirror of
https://github.com/irssi/irssi.git
synced 2024-12-04 14:46:39 -05:00
Irssi now asks if you want to remove unknown settings from configuration
file. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1400 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
9a7524ae75
commit
6806a0b7df
@ -33,6 +33,7 @@ CONFIG_REC *mainconfig;
|
|||||||
|
|
||||||
static GString *last_errors;
|
static GString *last_errors;
|
||||||
static char *last_config_error_msg;
|
static char *last_config_error_msg;
|
||||||
|
static GSList *last_invalid_modules;
|
||||||
static int fe_initialized;
|
static int fe_initialized;
|
||||||
static int config_changed; /* FIXME: remove after .98 (unless needed again) */
|
static int config_changed; /* FIXME: remove after .98 (unless needed again) */
|
||||||
|
|
||||||
@ -269,7 +270,7 @@ static void sig_init_finished(void)
|
|||||||
{
|
{
|
||||||
fe_initialized = TRUE;
|
fe_initialized = TRUE;
|
||||||
if (last_errors != NULL) {
|
if (last_errors != NULL) {
|
||||||
signal_emit("gui dialog", 2, "error", last_errors->str);
|
signal_emit("settings errors", 1, last_errors->str);
|
||||||
g_string_free(last_errors, TRUE);
|
g_string_free(last_errors, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,6 +300,43 @@ static void settings_move(SETTINGS_REC *rec, char *value)
|
|||||||
config_changed = TRUE;
|
config_changed = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void settings_clean_invalid_module(const char *module)
|
||||||
|
{
|
||||||
|
CONFIG_NODE *node;
|
||||||
|
SETTINGS_REC *set;
|
||||||
|
GSList *tmp, *next;
|
||||||
|
|
||||||
|
node = iconfig_node_traverse("settings", FALSE);
|
||||||
|
if (node == NULL) return;
|
||||||
|
|
||||||
|
node = config_node_section(node, module, -1);
|
||||||
|
if (node == NULL) return;
|
||||||
|
|
||||||
|
for (tmp = node->value; tmp != NULL; tmp = next) {
|
||||||
|
CONFIG_NODE *subnode = tmp->data;
|
||||||
|
next = tmp->next;
|
||||||
|
|
||||||
|
set = g_hash_table_lookup(settings, subnode->key);
|
||||||
|
if (set == NULL || strcmp(set->module, module) != 0)
|
||||||
|
iconfig_node_remove(node, subnode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove all invalid settings from config file. works only with the
|
||||||
|
modules that have already called settings_check() */
|
||||||
|
void settings_clean_invalid(void)
|
||||||
|
{
|
||||||
|
while (last_invalid_modules != NULL) {
|
||||||
|
char *module = last_invalid_modules->data;
|
||||||
|
|
||||||
|
settings_clean_invalid_module(module);
|
||||||
|
|
||||||
|
g_free(module);
|
||||||
|
last_invalid_modules =
|
||||||
|
g_slist_remove(last_invalid_modules, module);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* verify that all settings in config file for `module' are actually found
|
/* verify that all settings in config file for `module' are actually found
|
||||||
from /SET list */
|
from /SET list */
|
||||||
void settings_check_module(const char *module)
|
void settings_check_module(const char *module)
|
||||||
@ -311,7 +349,7 @@ void settings_check_module(const char *module)
|
|||||||
|
|
||||||
g_return_if_fail(module != NULL);
|
g_return_if_fail(module != NULL);
|
||||||
|
|
||||||
node = iconfig_node_traverse("settings", TRUE);
|
node = iconfig_node_traverse("settings", FALSE);
|
||||||
if (node != NULL) {
|
if (node != NULL) {
|
||||||
/* FIXME: remove after 0.7.98 */
|
/* FIXME: remove after 0.7.98 */
|
||||||
for (tmp = node->value; tmp != NULL; tmp = next) {
|
for (tmp = node->value; tmp != NULL; tmp = next) {
|
||||||
@ -329,8 +367,8 @@ void settings_check_module(const char *module)
|
|||||||
if (node == NULL) return;
|
if (node == NULL) return;
|
||||||
|
|
||||||
errors = g_string_new(NULL);
|
errors = g_string_new(NULL);
|
||||||
g_string_sprintf(errors, "Unknown settings in configuration "
|
g_string_sprintf(errors, _("Unknown settings in configuration "
|
||||||
"file for module %s:", module);
|
"file for module %s:"), module);
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
|
for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
|
||||||
@ -343,8 +381,15 @@ void settings_check_module(const char *module)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
|
if (gslist_find_icase_string(last_invalid_modules,
|
||||||
|
module) == NULL) {
|
||||||
|
/* mark this module having invalid settings */
|
||||||
|
last_invalid_modules =
|
||||||
|
g_slist_append(last_invalid_modules,
|
||||||
|
g_strdup(module));
|
||||||
|
}
|
||||||
if (fe_initialized)
|
if (fe_initialized)
|
||||||
signal_emit("gui dialog", 2, "error", errors->str);
|
signal_emit("settings errors", 1, errors->str);
|
||||||
else {
|
else {
|
||||||
if (last_errors == NULL)
|
if (last_errors == NULL)
|
||||||
last_errors = g_string_new(NULL);
|
last_errors = g_string_new(NULL);
|
||||||
@ -466,7 +511,7 @@ static CONFIG_REC *parse_configfile(const char *fname)
|
|||||||
config = config_open(path, -1);
|
config = config_open(path, -1);
|
||||||
if (config == NULL) {
|
if (config == NULL) {
|
||||||
last_config_error_msg =
|
last_config_error_msg =
|
||||||
g_strdup_printf("Error opening configuration file %s: %s",
|
g_strdup_printf(_("Error opening configuration file %s: %s"),
|
||||||
path, g_strerror(errno));
|
path, g_strerror(errno));
|
||||||
config = config_open(NULL, -1);
|
config = config_open(NULL, -1);
|
||||||
}
|
}
|
||||||
@ -602,7 +647,8 @@ void settings_init(void)
|
|||||||
(GCompareFunc) g_str_equal);
|
(GCompareFunc) g_str_equal);
|
||||||
|
|
||||||
last_errors = NULL;
|
last_errors = NULL;
|
||||||
last_config_error_msg = NULL;
|
last_config_error_msg = NULL;
|
||||||
|
last_invalid_modules = NULL;
|
||||||
fe_initialized = FALSE;
|
fe_initialized = FALSE;
|
||||||
config_changed = FALSE;
|
config_changed = FALSE;
|
||||||
|
|
||||||
@ -627,6 +673,9 @@ void settings_deinit(void)
|
|||||||
signal_remove("irssi init finished", (SIGNAL_FUNC) sig_init_finished);
|
signal_remove("irssi init finished", (SIGNAL_FUNC) sig_init_finished);
|
||||||
signal_remove("gui exit", (SIGNAL_FUNC) sig_autosave);
|
signal_remove("gui exit", (SIGNAL_FUNC) sig_autosave);
|
||||||
|
|
||||||
|
g_slist_foreach(last_invalid_modules, (GFunc) g_free, NULL);
|
||||||
|
g_slist_free(last_invalid_modules);
|
||||||
|
|
||||||
g_hash_table_foreach(settings, (GHFunc) settings_hash_free, NULL);
|
g_hash_table_foreach(settings, (GHFunc) settings_hash_free, NULL);
|
||||||
g_hash_table_destroy(settings);
|
g_hash_table_destroy(settings);
|
||||||
|
|
||||||
|
@ -74,6 +74,10 @@ SETTINGS_REC *settings_get_record(const char *key);
|
|||||||
void settings_check_module(const char *module);
|
void settings_check_module(const char *module);
|
||||||
#define settings_check() settings_check_module(MODULE_NAME)
|
#define settings_check() settings_check_module(MODULE_NAME)
|
||||||
|
|
||||||
|
/* remove all invalid settings from config file. works only with the
|
||||||
|
modules that have already called settings_check() */
|
||||||
|
void settings_clean_invalid(void);
|
||||||
|
|
||||||
/* if `fname' is NULL, the default is used */
|
/* if `fname' is NULL, the default is used */
|
||||||
int settings_reread(const char *fname);
|
int settings_reread(const char *fname);
|
||||||
int settings_save(const char *fname);
|
int settings_save(const char *fname);
|
||||||
|
@ -285,6 +285,20 @@ static void cmd_save(const char *data)
|
|||||||
0, g_strdup(data));
|
0, g_strdup(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void settings_clean_confirm(const char *line)
|
||||||
|
{
|
||||||
|
if (g_strncasecmp(line, _("Y"), 1) == 0)
|
||||||
|
settings_clean_invalid();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sig_settings_errors(const char *msg)
|
||||||
|
{
|
||||||
|
printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "%s", msg);
|
||||||
|
keyboard_entry_redirect((SIGNAL_FUNC) settings_clean_confirm,
|
||||||
|
_("Remove unknown settings from config file (Y/n)?"),
|
||||||
|
0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void fe_settings_init(void)
|
void fe_settings_init(void)
|
||||||
{
|
{
|
||||||
command_bind("set", NULL, (SIGNAL_FUNC) cmd_set);
|
command_bind("set", NULL, (SIGNAL_FUNC) cmd_set);
|
||||||
@ -293,8 +307,9 @@ void fe_settings_init(void)
|
|||||||
command_bind("unalias", NULL, (SIGNAL_FUNC) cmd_unalias);
|
command_bind("unalias", NULL, (SIGNAL_FUNC) cmd_unalias);
|
||||||
command_bind("reload", NULL, (SIGNAL_FUNC) cmd_reload);
|
command_bind("reload", NULL, (SIGNAL_FUNC) cmd_reload);
|
||||||
command_bind("save", NULL, (SIGNAL_FUNC) cmd_save);
|
command_bind("save", NULL, (SIGNAL_FUNC) cmd_save);
|
||||||
|
|
||||||
command_set_options("set", "clear");
|
command_set_options("set", "clear");
|
||||||
|
|
||||||
|
signal_add("settings errors", (SIGNAL_FUNC) sig_settings_errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fe_settings_deinit(void)
|
void fe_settings_deinit(void)
|
||||||
@ -305,4 +320,6 @@ void fe_settings_deinit(void)
|
|||||||
command_unbind("unalias", (SIGNAL_FUNC) cmd_unalias);
|
command_unbind("unalias", (SIGNAL_FUNC) cmd_unalias);
|
||||||
command_unbind("reload", (SIGNAL_FUNC) cmd_reload);
|
command_unbind("reload", (SIGNAL_FUNC) cmd_reload);
|
||||||
command_unbind("save", (SIGNAL_FUNC) cmd_save);
|
command_unbind("save", (SIGNAL_FUNC) cmd_save);
|
||||||
|
|
||||||
|
signal_remove("settings errors", (SIGNAL_FUNC) sig_settings_errors);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user