diff options
-rw-r--r-- | src/core/wee-command.c | 54 | ||||
-rw-r--r-- | src/core/wee-config-file.c | 92 | ||||
-rw-r--r-- | src/core/wee-config-file.h | 1 | ||||
-rw-r--r-- | tests/tests.cpp | 11 | ||||
-rw-r--r-- | tests/unit/core/test-core-command.cpp | 11 | ||||
-rw-r--r-- | tests/unit/core/test-core-config-file.cpp | 30 | ||||
-rw-r--r-- | tests/unit/plugins/irc/test-irc-protocol.cpp | 9 |
7 files changed, 183 insertions, 25 deletions
diff --git a/src/core/wee-command.c b/src/core/wee-command.c index 1bea236a6..725689af0 100644 --- a/src/core/wee-command.c +++ b/src/core/wee-command.c @@ -5586,13 +5586,41 @@ command_reload_file (struct t_config_file *config_file) } /* + * Compares two configuration files to sort them by priority (highest priority + * at beginning of list). + * + * Returns: + * -1: config1 has higher priority than config2 + * 1: config1 has same or lower priority than config2 + */ + +int +command_reload_arraylist_cmp_config_cb (void *data, + struct t_arraylist *arraylist, + void *pointer1, void *pointer2) +{ + struct t_config_file *ptr_config1, *ptr_config2; + + /* make C compiler happy */ + (void) data; + (void) arraylist; + + ptr_config1 = (struct t_config_file *)pointer1; + ptr_config2 = (struct t_config_file *)pointer2; + + return (ptr_config1->priority > ptr_config2->priority) ? -1 : 1; +} + + +/* * Callback for command "/reload": reloads a configuration file. */ COMMAND_CALLBACK(reload) { struct t_config_file *ptr_config_file; - int i; + struct t_arraylist *all_configs; + int i, list_size; /* make C compiler happy */ (void) pointer; @@ -5619,11 +5647,33 @@ COMMAND_CALLBACK(reload) } else { + /* + * build a list of pointers to configs sorted by priority, + * so that configs with high priority are reloaded first + */ + all_configs = arraylist_new ( + 32, 1, 1, + &command_reload_arraylist_cmp_config_cb, NULL, + NULL, NULL); + if (!all_configs) + COMMAND_ERROR; + for (ptr_config_file = config_files; ptr_config_file; ptr_config_file = ptr_config_file->next_config) { - command_reload_file (ptr_config_file); + arraylist_add (all_configs, ptr_config_file); } + + list_size = arraylist_size (all_configs); + for (i = 0; i < list_size; i++) + { + ptr_config_file = (struct t_config_file *)arraylist_get ( + all_configs, i); + if (config_file_valid (ptr_config_file)) + command_reload_file (ptr_config_file); + } + + arraylist_free (all_configs); } return WEECHAT_RC_OK; diff --git a/src/core/wee-config-file.c b/src/core/wee-config-file.c index 3fa2f5b8b..e51652b5a 100644 --- a/src/core/wee-config-file.c +++ b/src/core/wee-config-file.c @@ -60,6 +60,33 @@ void config_file_option_free_data (struct t_config_option *option); /* + * Checks if a configuration file pointer is valid. + * + * Returns: + * 1: configuration file exists + * 0: configuration file does not exist + */ + +int +config_file_valid (struct t_config_file *config_file) +{ + struct t_config_file *ptr_config; + + if (!config_file) + return 0; + + for (ptr_config = config_files; ptr_config; + ptr_config = ptr_config->next_config) + { + if (ptr_config == config_file) + return 1; + } + + /* configuration file not found */ + return 0; +} + +/* * Searches for a configuration file. */ @@ -67,15 +94,19 @@ struct t_config_file * config_file_search (const char *name) { struct t_config_file *ptr_config; + int rc; if (!name) return NULL; - for (ptr_config = config_files; ptr_config; - ptr_config = ptr_config->next_config) + for (ptr_config = last_config_file; ptr_config; + ptr_config = ptr_config->prev_config) { - if (string_strcasecmp (ptr_config->name, name) == 0) + rc = string_strcasecmp (ptr_config->name, name); + if (rc == 0) return ptr_config; + else if (rc < 0) + break; } /* configuration file not found */ @@ -88,7 +119,7 @@ config_file_search (const char *name) */ struct t_config_file * -config_file_config_find_pos (const char *name) +config_file_find_pos (const char *name) { struct t_config_file *ptr_config; @@ -107,6 +138,51 @@ config_file_config_find_pos (const char *name) } /* + * Inserts a configuration file (keeping files sorted by name). + */ + +void +config_file_config_insert (struct t_config_file *config_file) +{ + struct t_config_file *pos_config; + + if (!config_file) + return; + + if (config_files) + { + pos_config = config_file_find_pos (config_file->name); + if (pos_config) + { + /* insert config into the list (before config found) */ + config_file->prev_config = pos_config->prev_config; + config_file->next_config = pos_config; + if (pos_config->prev_config) + (pos_config->prev_config)->next_config = config_file; + else + config_files = config_file; + pos_config->prev_config = config_file; + } + else + { + /* add config to the end */ + config_file->prev_config = last_config_file; + config_file->next_config = NULL; + last_config_file->next_config = config_file; + last_config_file = config_file; + } + } + else + { + /* first config */ + config_file->prev_config = NULL; + config_file->next_config = NULL; + config_files = config_file; + last_config_file = config_file; + } +} + +/* * Creates a new configuration file. * * Returns pointer to new configuration file, NULL if error. @@ -168,13 +244,7 @@ config_file_new (struct t_weechat_plugin *plugin, const char *name, new_config_file->sections = NULL; new_config_file->last_section = NULL; - new_config_file->prev_config = last_config_file; - new_config_file->next_config = NULL; - if (last_config_file) - last_config_file->next_config = new_config_file; - else - config_files = new_config_file; - last_config_file = new_config_file; + config_file_config_insert (new_config_file); } return new_config_file; diff --git a/src/core/wee-config-file.h b/src/core/wee-config-file.h index c0ab4dce2..3da27398b 100644 --- a/src/core/wee-config-file.h +++ b/src/core/wee-config-file.h @@ -169,6 +169,7 @@ struct t_config_option extern struct t_config_file *config_files; extern struct t_config_file *last_config_file; +extern int config_file_valid (struct t_config_file *config_file); extern struct t_config_file *config_file_search (const char *name); extern struct t_config_file *config_file_new (struct t_weechat_plugin *plugin, const char *name, diff --git a/tests/tests.cpp b/tests/tests.cpp index 00363e0d7..616d35ab8 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -222,22 +222,23 @@ record_stop () * The format of "message" argument is: "prefix message" (prefix and message * separated by a space). * - * Returns: - * 1: message has been displayed - * 0: message has NOT been displayed + * Returns index of message displayed (≥ 0), -1 if message has NOT been + * displayed. */ int record_search (const char *buffer, const char *message) { char str_message[8192]; + int index; snprintf (str_message, sizeof (str_message), "%s: \"%s\"", buffer, message); - return (arraylist_search (recorded_messages, str_message, - NULL, NULL) != NULL); + arraylist_search (recorded_messages, str_message, &index, NULL); + + return index; } /* diff --git a/tests/unit/core/test-core-command.cpp b/tests/unit/core/test-core-command.cpp index 0a24a0ff0..d2ec90bd0 100644 --- a/tests/unit/core/test-core-command.cpp +++ b/tests/unit/core/test-core-command.cpp @@ -42,7 +42,7 @@ extern "C" command_record ("core.weechat", __command); #define WEE_CHECK_MSG_BUFFER(__buffer_name, __message) \ - if (!record_search (__buffer_name, __message)) \ + if (record_search (__buffer_name, __message) < 0) \ { \ char **msg = command_build_error ( \ "Message not displayed on buffer " __buffer_name ": " \ @@ -54,6 +54,8 @@ extern "C" #define WEE_CHECK_MSG_CORE(__message) \ WEE_CHECK_MSG_BUFFER("core.weechat", __message); +#define WEE_SEARCH_MSG_CORE(__message) \ + record_search ("core.weechat", __message) TEST_GROUP(CoreCommand) @@ -369,7 +371,12 @@ TEST(CoreCommand, Quit) TEST(CoreCommand, Reload) { - /* TODO: write tests */ + WEE_CMD_CORE("/save"); + WEE_CMD_CORE("/reload"); + LONGS_EQUAL(0, WEE_SEARCH_MSG_CORE("Options reloaded from sec.conf")); + LONGS_EQUAL(1, WEE_SEARCH_MSG_CORE("Options reloaded from weechat.conf")); + LONGS_EQUAL(2, WEE_SEARCH_MSG_CORE("Options reloaded from plugins.conf")); + LONGS_EQUAL(3, WEE_SEARCH_MSG_CORE("Options reloaded from charset.conf")); } /* diff --git a/tests/unit/core/test-core-config-file.cpp b/tests/unit/core/test-core-config-file.cpp index 0a84c2f54..9c6a74732 100644 --- a/tests/unit/core/test-core-config-file.cpp +++ b/tests/unit/core/test-core-config-file.cpp @@ -32,6 +32,7 @@ extern "C" #include "src/gui/gui-color.h" #include "src/plugins/plugin.h" +extern struct t_config_file *config_file_find_pos (const char *name); extern char *config_file_option_full_name (struct t_config_option *option); extern int config_file_string_boolean_is_valid (const char *text); extern const char *config_file_option_escape (const char *name); @@ -43,6 +44,20 @@ TEST_GROUP(CoreConfigFile) /* * Tests functions: + * config_file_valid + */ + +TEST(CoreConfigFile, Valid) +{ + LONGS_EQUAL(0, config_file_valid (NULL)); + LONGS_EQUAL(0, config_file_valid ((struct t_config_file *)0x1)); + + LONGS_EQUAL(1, config_file_valid (config_file_search ("weechat"))); + LONGS_EQUAL(1, config_file_valid (config_file_search ("sec"))); +} + +/* + * Tests functions: * config_file_search */ @@ -58,11 +73,24 @@ TEST(CoreConfigFile, Search) /* * Tests functions: - * config_file_config_find_pos + * config_file_find_pos */ TEST(CoreConfigFile, FindPos) { + POINTERS_EQUAL(NULL, config_file_find_pos (NULL)); + POINTERS_EQUAL(config_files, config_file_find_pos ("")); + POINTERS_EQUAL(weechat_config_file->next_config, config_file_find_pos ("weechat")); + POINTERS_EQUAL(weechat_config_file->next_config, config_file_find_pos ("WEECHAT")); +} + +/* + * Tests functions: + * config_file_config_insert + */ + +TEST(CoreConfigFile, ConfigInsert) +{ /* TODO: write tests */ } diff --git a/tests/unit/plugins/irc/test-irc-protocol.cpp b/tests/unit/plugins/irc/test-irc-protocol.cpp index c5611e337..fa5d4158a 100644 --- a/tests/unit/plugins/irc/test-irc-protocol.cpp +++ b/tests/unit/plugins/irc/test-irc-protocol.cpp @@ -78,7 +78,7 @@ extern char *irc_protocol_cap_to_enable (const char *capabilities, server_recv (__irc_msg); #define CHECK_CORE(__message) \ - if (!record_search ("core.weechat", __message)) \ + if (record_search ("core.weechat", __message) < 0) \ { \ char **msg = server_build_error ( \ "Core message not displayed", \ @@ -89,7 +89,7 @@ extern char *irc_protocol_cap_to_enable (const char *capabilities, } #define CHECK_SRV(__message) \ - if (!record_search ("irc.server." IRC_FAKE_SERVER, __message)) \ + if (record_search ("irc.server." IRC_FAKE_SERVER, __message) < 0) \ { \ char **msg = server_build_error ( \ "Server message not displayed", \ @@ -113,7 +113,7 @@ extern char *irc_protocol_cap_to_enable (const char *capabilities, "(please report to developers): \"" __message "\""); #define CHECK_CHAN(__message) \ - if (!record_search ("irc." IRC_FAKE_SERVER ".#test", __message)) \ + if (record_search ("irc." IRC_FAKE_SERVER ".#test", __message) < 0) \ { \ char **msg = server_build_error ( \ "Channel message not displayed", \ @@ -124,7 +124,8 @@ extern char *irc_protocol_cap_to_enable (const char *capabilities, } #define CHECK_PV(__nick, __message) \ - if (!record_search ("irc." IRC_FAKE_SERVER "." __nick, __message)) \ + if (record_search ("irc." IRC_FAKE_SERVER "." __nick, \ + __message) < 0) \ { \ char **msg = server_build_error ( \ "Private message not displayed", \ |