summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/wee-command.c54
-rw-r--r--src/core/wee-config-file.c92
-rw-r--r--src/core/wee-config-file.h1
-rw-r--r--tests/tests.cpp11
-rw-r--r--tests/unit/core/test-core-command.cpp11
-rw-r--r--tests/unit/core/test-core-config-file.cpp30
-rw-r--r--tests/unit/plugins/irc/test-irc-protocol.cpp9
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", \