Merged in rw_grim/pidgin (pull request #277)

Fri, 15 Dec 2017 03:52:01 +0000

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 15 Dec 2017 03:52:01 +0000
changeset 38808
42859bc2eb8f
parent 38799
4f8e89cf2c4f (diff)
parent 38807
0f364d739dfa (current diff)
child 38815
bc7b43e17b3a
child 38816
9fd4f68ed211

Merged in rw_grim/pidgin (pull request #277)

Move to using GOptionContext to make it easier to share command line arguements

--- a/finch/gntblist.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/finch/gntblist.c	Fri Dec 15 03:52:01 2017 +0000
@@ -127,10 +127,6 @@
 static void add_chat(PurpleChat *chat, FinchBlist *ggblist);
 static void add_node(PurpleBlistNode *node, FinchBlist *ggblist);
 static void node_update(PurpleBuddyList *list, PurpleBlistNode *node);
-#if 0
-static gboolean is_contact_online(PurpleContact *contact);
-static gboolean is_group_online(PurpleGroup *group);
-#endif
 static void draw_tooltip(FinchBlist *ggblist);
 static void tooltip_for_buddy(PurpleBuddy *buddy, GString *str, gboolean full);
 static gboolean remove_typing_cb(gpointer null);
@@ -385,27 +381,6 @@
 		fnode = purple_blist_node_get_ui_data(node);
 		if (fnode && fnode->signed_timer)
 			flag |= GNT_TEXT_FLAG_BLINK;
-	} else if (PURPLE_IS_GROUP(node)) {
-		/* If the node is collapsed, then check to see if any of the priority buddies of
-		 * any of the contacts within this group recently signed on/off, and set the blink
-		 * flag appropriately. */
-		/* XXX: Refs #5444 */
-		/* XXX: there's no way I can ask if the node is expanded or not? *sigh*
-		 * API addition would be necessary */
-#if 0
-		if (!gnt_tree_get_expanded(GNT_TREE(ggblist->tree), node)) {
-			for (node = purple_blist_node_get_first_child(node); node;
-					node = purple_blist_node_get_sibling_next(node)) {
-				PurpleBlistNode *pnode;
-				pnode = purple_contact_get_priority_buddy((PurpleContact*)node);
-				fnode = purple_blist_node_get_ui_data(node);
-				if (fnode && fnode->signed_timer) {
-					flag |= GNT_TEXT_FLAG_BLINK;
-					break;
-				}
-			}
-		}
-#endif
 	}
 
 	return flag;
@@ -418,37 +393,6 @@
 	gnt_tree_set_row_color(GNT_TREE(ggblist->tree), node, get_display_color(node));
 }
 
-#if 0
-static gboolean
-is_contact_online(PurpleContact *contact)
-{
-	PurpleBlistNode *node;
-	for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)contact)); node;
-			node = purple_blist_node_get_sibling_next(node)) {
-		FinchBlistNode *fnode = purple_blist_node_get_ui_data(node);
-		if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node) ||
-				(fnode && fnode->signed_timer))
-			return TRUE;
-	}
-	return FALSE;
-}
-
-static gboolean
-is_group_online(PurpleGroup *group)
-{
-	PurpleBlistNode *node;
-	for (node = purple_blist_node_get_first_child(((PurpleBlistNode*)group)); node;
-			node = purple_blist_node_get_sibling_next(node)) {
-		if (PURPLE_IS_CHAT(node) &&
-				purple_account_is_connected(((PurpleChat *)node)->account))
-			return TRUE;
-		else if (is_contact_online((PurpleContact*)node))
-			return TRUE;
-	}
-	return FALSE;
-}
-#endif
-
 static void
 new_node(PurpleBlistNode *node)
 {
@@ -999,20 +943,6 @@
 		blist_update_row_flags((PurpleBlistNode*)contact);
 }
 
-#if 0
-static void
-buddy_signed_on(PurpleBuddy *buddy, FinchBlist *ggblist)
-{
-	add_node((PurpleBlistNode*)buddy, ggblist);
-}
-
-static void
-buddy_signed_off(PurpleBuddy *buddy, FinchBlist *ggblist)
-{
-	node_remove(purple_blist_get_buddy_list(), (PurpleBlistNode*)buddy);
-}
-#endif
-
 PurpleBlistUiOps *finch_blist_get_ui_ops()
 {
 	return &blist_ui_ops;
@@ -3127,17 +3057,6 @@
 	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_blist_get_handle(),
 				PURPLE_CALLBACK(buddy_signed_on_off), ggblist);
 
-#if 0
-	/* These I plan to use to indicate unread-messages etc. */
-	purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", finch_blist_get_handle(),
-				PURPLE_CALLBACK(received_im_msg), list);
-	purple_signal_connect(purple_conversations_get_handle(), "sent-im-msg", finch_blist_get_handle(),
-				PURPLE_CALLBACK(sent_im_msg), NULL);
-
-	purple_signal_connect(purple_conversations_get_handle(), "received-chat-msg", finch_blist_get_handle(),
-				PURPLE_CALLBACK(received_chat_msg), list);
-#endif
-
 	g_signal_connect(G_OBJECT(ggblist->tree), "selection_changed", G_CALLBACK(selection_changed), ggblist);
 	g_signal_connect(G_OBJECT(ggblist->tree), "key_pressed", G_CALLBACK(key_pressed), ggblist);
 	g_signal_connect(G_OBJECT(ggblist->tree), "context-menu", G_CALLBACK(context_menu), ggblist);
--- a/finch/gntplugin.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/finch/gntplugin.c	Fri Dec 15 03:52:01 2017 +0000
@@ -446,95 +446,6 @@
 	}
 }
 
-#if 0
-static void
-install_selected_file_cb(gpointer handle, const char *filename)
-{
-	/* Try to init the selected file.
-	 * If it succeeds, try to make a copy of the file in $USERDIR/plugins/.
-	 * If the copy succeeds, unload and destroy the plugin in the original
-	 *  location and init+load the new one.
-	 * Select the plugin in the plugin list.
-	 */
-	char *path;
-	PurplePlugin *plugin;
-
-	g_return_if_fail(plugins.window);
-
-	plugin = purple_plugin_probe(filename);
-	if (!plugin) {
-		purple_notify_error(handle, _("Error loading plugin"),
-				_("The selected file is not a valid plugin."),
-				_("Please open the debug window and try again to see the exact error message."), NULL);
-		return;
-	}
-	if (g_list_find(gnt_tree_get_rows(GNT_TREE(plugins.tree)), plugin)) {
-		purple_plugin_load(plugin);
-		gnt_tree_set_choice(GNT_TREE(plugins.tree), plugin, purple_plugin_is_loaded(plugin));
-		gnt_tree_set_selected(GNT_TREE(plugins.tree), plugin);
-		return;
-	}
-
-	path = g_build_filename(purple_user_dir(), "plugins", NULL);
-	if (purple_build_dir(path, S_IRUSR | S_IWUSR | S_IXUSR) == 0) {
-		char *content = NULL;
-		gsize length = 0;
-
-		if (g_file_get_contents(filename, &content, &length, NULL)) {
-			char *file = g_path_get_basename(filename);
-			g_free(path);
-			path = g_build_filename(purple_user_dir(), "plugins", file, NULL);
-			if (purple_util_write_data_to_file_absolute(path, content, length)) {
-				purple_plugin_destroy(plugin);
-				plugin = purple_plugin_probe(path);
-				if (!plugin) {
-					purple_debug_warning("gntplugin", "This is really strange. %s can be loaded, but %s can't!\n",
-							filename, path);
-					g_unlink(path);
-					plugin = purple_plugin_probe(filename);
-				}
-			} else {
-			}
-		}
-		g_free(content);
-	}
-	g_free(path);
-
-	purple_plugin_load(plugin);
-
-	if (plugin->info->type == PURPLE_PLUGIN_LOADER) {
-		GList *cur;
-		for (cur = PURPLE_PLUGIN_LOADER_INFO(plugin)->exts; cur != NULL;
-				cur = cur->next)
-			purple_plugins_probe(cur->data);
-		return;
-	}
-
-	if (plugin->info->type != PURPLE_PLUGIN_STANDARD ||
-			(plugin->info->flags & PURPLE_PLUGIN_FLAG_INVISIBLE) ||
-			plugin->error)
-		return;
-
-	gnt_tree_add_choice(GNT_TREE(plugins.tree), plugin,
-			gnt_tree_create_row(GNT_TREE(plugins.tree), plugin->info->name), NULL, NULL);
-	gnt_tree_set_choice(GNT_TREE(plugins.tree), plugin, purple_plugin_is_loaded(plugin));
-	gnt_tree_set_row_flags(GNT_TREE(plugins.tree), plugin, GNT_TEXT_FLAG_BOLD);
-	gnt_tree_set_selected(GNT_TREE(plugins.tree), plugin);
-}
-
-static void
-install_plugin_cb(GntWidget *w, gpointer null)
-{
-	static int handle;
-
-	purple_request_close_with_handle(&handle);
-	purple_request_file(&handle, _("Select plugin to install"), NULL,
-			FALSE, G_CALLBACK(install_selected_file_cb), NULL,
-			NULL, &handle);
-	g_signal_connect_swapped(G_OBJECT(w), "destroy", G_CALLBACK(purple_request_close_with_handle), &handle);
-}
-#endif
-
 void finch_plugins_show_all(void)
 {
 	GntWidget *window, *tree, *box, *aboot, *button;
@@ -603,13 +514,6 @@
 	box = gnt_hbox_new(FALSE);
 	gnt_box_add_widget(GNT_BOX(window), box);
 
-#if 0
-	button = gnt_button_new(_("Install Plugin..."));
-	gnt_box_add_widget(GNT_BOX(box), button);
-	gnt_util_set_trigger_widget(GNT_WIDGET(tree), GNT_KEY_INS, button);
-	g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(install_plugin_cb), NULL);
-#endif
-
 	button = gnt_button_new(_("Close"));
 	gnt_box_add_widget(GNT_BOX(box), button);
 	g_signal_connect_swapped(G_OBJECT(button), "activate",
--- a/finch/libgnt/gntfilesel.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/finch/libgnt/gntfilesel.c	Fri Dec 15 03:52:01 2017 +0000
@@ -38,10 +38,6 @@
 
 #include <glib/gstdio.h>
 
-#if 0
-#include <glob.h>
-#endif
-
 enum
 {
 	SIG_FILE_SELECTED,
@@ -281,12 +277,7 @@
 {
 	char *path;
 	char *str;
-#if 0
-	int count;
-	glob_t gl;
-	GStatBuf st;
-	int glob_ret;
-#endif
+
 	if (strcmp(key, "\r") && strcmp(key, "\n"))
 		return FALSE;
 
@@ -309,39 +300,9 @@
 		g_free(path);
 		return FALSE;
 	}
-#if 0
-	/* XXX: there needs to be a way to allow other methods for globbing,
-	 * like the read_fn stuff. */
-	glob_ret = glob(path, GLOB_MARK, NULL, &gl);
-	if (!glob_ret) {  /* XXX: do something with the return value */
-		char *loc = g_path_get_dirname(gl.gl_pathv[0]);
 
-		g_stat(gl.gl_pathv[0], &st);
-		gnt_file_sel_set_current_location(sel, loc);  /* XXX: check the return value */
-		g_free(loc);
-		if (!S_ISDIR(st.st_mode) && !sel->dirsonly) {
-			gnt_tree_remove_all(GNT_TREE(sel->files));
-			for (count = 0; count < gl.gl_pathc; count++) {
-				char *tmp = process_path(gl.gl_pathv[count]);
-				loc = g_path_get_dirname(tmp);
-				if (g_utf8_collate(sel->current, loc) == 0) {
-					char *base = g_path_get_basename(tmp);
-					char size[128];
-					snprintf(size, sizeof(size), "%ld", (long)st.st_size);
-					gnt_tree_add_row_after(GNT_TREE(sel->files), base,
-							gnt_tree_create_row(GNT_TREE(sel->files), base, size, ""), NULL, NULL);
-				}
-				g_free(loc);
-				g_free(tmp);
-			}
-			gnt_widget_draw(sel->files);
-		}
-	} else if (sel->files) {
-		gnt_tree_remove_all(GNT_TREE(sel->files));
-		gnt_widget_draw(sel->files);
-	}
-	globfree(&gl);
-#endif
+	/* XXX: Add support for globbing via g_pattern_spec_* */
+
 success:
 	g_free(path);
 	return TRUE;
--- a/finch/libgnt/gntmain.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/finch/libgnt/gntmain.c	Fri Dec 15 03:52:01 2017 +0000
@@ -340,12 +340,6 @@
 	}
 	*k = '\0';
 
-#if 0
-	gnt_warning("a key: [%s] %#x %#x %#x %#x %#x %#x", keys,
-		(guchar)keys[0], (guchar)keys[1], (guchar)keys[2],
-		(guchar)keys[3], (guchar)keys[4], (guchar)keys[5]);
-#endif
-
 	/* TODO: we could call detect_mouse_action here, but no
 	 * events are triggered (yet?) for mouse on win32.
 	 */
@@ -395,17 +389,6 @@
 	if (mouse_enabled && detect_mouse_action(k))
 		goto end;
 
-#if 0
-	/* I am not sure what's happening here. If this actually does something,
-	 * then this needs to go in gnt_keys_refine. */
-	if (*k < 0) { /* Alt not sending ESC* */
-		*(k + 1) = 128 - *k;
-		*k = 27;
-		*(k + 2) = 0;
-		rd++;
-	}
-#endif
-
 	while (rd) {
 		char back;
 		int p;
@@ -450,12 +433,6 @@
 
 	g_io_channel_set_close_on_unref(channel, TRUE);
 
-#if 0
-	g_io_channel_set_encoding(channel, NULL, NULL);
-	g_io_channel_set_buffered(channel, FALSE);
-	g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, NULL );
-#endif
-
 	channel_read_callback = result = g_io_add_watch_full(channel,  G_PRIORITY_HIGH,
 					(G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI),
 					io_invoke, NULL, NULL);
@@ -465,10 +442,6 @@
 					io_invoke_error, GINT_TO_POINTER(result), NULL);
 
 	g_io_channel_unref(channel);
-
-#if 0
-	gnt_warning("setting up IO (%d)", channel_read_callback);
-#endif
 }
 
 static gboolean
--- a/finch/libgnt/gntmenuitem.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/finch/libgnt/gntmenuitem.c	Fri Dec 15 03:52:01 2017 +0000
@@ -65,13 +65,8 @@
 gnt_menuitem_init(GTypeInstance *instance, gpointer klass)
 {
 	GntMenuItem *item = GNT_MENU_ITEM(instance);
-#if 0
-	GntMenuItemPriv *priv = &item->priv;
 
-	priv->visible = TRUE;
-#else
 	item->visible = TRUE;
-#endif
 }
 
 /******************************************************************************
@@ -167,13 +162,7 @@
 void
 gnt_menuitem_set_visible(GntMenuItem *item, gboolean visible)
 {
-#if 0
-	GntMenuItemPriv *priv = &item->priv;
-
-	priv->visible = visible;
-#else
 	item->visible = visible;
-#endif
 }
 
 gboolean
@@ -181,11 +170,7 @@
 {
 	g_return_val_if_fail(GNT_IS_MENU_ITEM(item), FALSE);
 
-#if 0
-	return item->priv.visible;
-#else
 	return item->visible;
-#endif
 }
 
 void
--- a/finch/libgnt/gntwidget.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/finch/libgnt/gntwidget.c	Fri Dec 15 03:52:01 2017 +0000
@@ -322,42 +322,8 @@
 
 	if (widget->window == NULL)
 	{
-#if 0
-		int x, y, maxx, maxy, w, h;
-		int oldw, oldh;
-		gboolean shadow = TRUE;
-
-		if (!gnt_widget_has_shadow(widget))
-			shadow = FALSE;
-
-		x = widget->priv.x;
-		y = widget->priv.y;
-		w = oldw = widget->priv.width + shadow;
-		h = oldh = widget->priv.height + shadow;
-
-		getmaxyx(stdscr, maxy, maxx);
-		maxy -= 1;		/* room for the taskbar */
+		widget->window = newpad(widget->priv.height + 20, widget->priv.width + 20);
 
-		x = MAX(0, x);
-		y = MAX(0, y);
-		if (x + w >= maxx)
-			x = MAX(0, maxx - w);
-		if (y + h >= maxy)
-			y = MAX(0, maxy - h);
-
-		w = MIN(w, maxx);
-		h = MIN(h, maxy);
-
-		widget->priv.x = x;
-		widget->priv.y = y;
-		if (w != oldw || h != oldh) {
-			widget->priv.width = w - shadow;
-			widget->priv.height = h - shadow;
-			g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh);
-		}
-#else
-		widget->window = newpad(widget->priv.height + 20, widget->priv.width + 20);  /* XXX: */
-#endif
 		init_widget(widget);
 	}
 
@@ -403,11 +369,6 @@
 {
 	g_signal_emit(widget, signals[SIG_HIDE], 0);
 	wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_NORMAL));
-#if 0
-	/* XXX: I have no clue why, but this seemed to be necessary. */
-	if (gnt_widget_has_shadow(widget))
-		mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height);
-#endif
 	gnt_screen_release(widget);
 	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE);
 	GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_MAPPED);
--- a/finch/libgnt/test.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/finch/libgnt/test.c	Fri Dec 15 03:52:01 2017 +0000
@@ -16,25 +16,6 @@
 	gnt_box_set_title(GNT_BOX(box), "This is a test");
 
 	gnt_widget_show(box);
-#if 0
-
-	gnt_widget_set_focus(w, TRUE);
-
-	/* XXX: This is to just test stuff */
-	if (text[0] == 27)
-	{
-		if (strcmp(text+1, GNT_KEY_LEFT) == 0 && w->priv.x)
-			(w->priv.x)--;
-		else if (strcmp(text+1, GNT_KEY_RIGHT) == 0)
-			(w->priv.x)++;
-		else if (strcmp(text+1, GNT_KEY_UP) == 0 && w->priv.y)
-			(w->priv.y)--;
-		else if (strcmp(text+1, GNT_KEY_DOWN) == 0)
-			(w->priv.y)++;
-	}
-
-	gnt_widget_draw(w);
-#endif
 
 	return FALSE;
 }
@@ -57,11 +38,7 @@
 {
 	g_return_val_if_fail(GNT_IS_TREE(tree), FALSE);
 	gnt_tree_scroll(GNT_TREE(tree), 1);
-	/*wscrl(tree->window, 1);*/
-	/*box(tree->window, ACS_VLINE, ACS_HLINE);*/
-	/*wrefresh(tree->window);*/
-	/*char *s = 0;*/
-	/**s = 'a';*/
+
 	return TRUE;
 }
 
@@ -90,7 +67,6 @@
 	gnt_box_add_widget(GNT_BOX(vbox), widget2);
 
 	gnt_box_add_widget(GNT_BOX(hbox), label);
-	/*gnt_box_add_widget(GNT_BOX(hbox), vbox);*/
 
 	gnt_box_add_widget(GNT_BOX(hbox), gnt_entry_new("a"));
 
@@ -106,18 +82,12 @@
 	GNT_WIDGET_UNSET_FLAGS(hbox, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW);
 	gnt_box_set_title(GNT_BOX(hbox), "111111111111111111111111111111111111111111111111111111111111111This is the title …");
 
-	/*gnt_widget_set_take_focus(vbox, TRUE);*/
-	/*gnt_widget_set_take_focus(hbox, TRUE);*/
-	/*gnt_widget_set_position(hbox, 10, 10);*/
-
 	gnt_widget_show(hbox);
 
 	g_signal_connect(hbox, "key_pressed", G_CALLBACK(key_pressed), tree);
 	g_signal_connect(widget, "activate", G_CALLBACK(button1), hbox);
 	g_signal_connect(widget2, "activate", G_CALLBACK(button2), hbox);
 
-	/*g_timeout_add(1000, (GSourceFunc)w_scroll, tree);*/
-
 	gnt_main();
 
 	return 0;
--- a/libpurple/plugins/filectl.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/libpurple/plugins/filectl.c	Fri Dec 15 03:52:01 2017 +0000
@@ -86,27 +86,6 @@
 			free(arg1);
 			free(arg2);
 
-/* purple_find_conversation() is gone in 2.0.0. */
-#if 0
-		} else if (!g_ascii_strncasecmp(command, "send", 4)) {
-			PurpleConversation *conv;
-
-			arg1 = getarg(buffer, 1, 0);
-			arg2 = getarg(buffer, 2, 1);
-
-			conv = purple_find_conversation(PURPLE_CONV_TYPE_ANY, arg1);
-			if (conv != NULL)
-			{
-				/*
-				purple_conversation_write(conv, arg2, WFLAG_SEND, NULL, time(NULL), -1);
-				purple_serv_send_im(conv->gc, arg1, arg2, 0);
-				*/
-			}
-
-			free(arg1);
-			free(arg2);
-#endif
-
 		} else if (!g_ascii_strncasecmp(command, "away", 4)) {
 			arg1 = getarg(buffer, 1, 1);
 			/* serv_set_away_all(arg1); */
--- a/libpurple/plugins/log_reader.c	Thu Nov 23 21:44:29 2017 -0600
+++ b/libpurple/plugins/log_reader.c	Fri Dec 15 03:52:01 2017 +0000
@@ -2444,35 +2444,6 @@
 	if (path) {
 		/* Read talk.ini file to find the log directory. */
 		GError *error = NULL;
-
-#if 0 /* FIXME: Not tested yet. */
-		GKeyFile *key_file;
-
-		purple_debug_info("Trillian talk.ini read", "Reading %s\n", path);
-
-		error = NULL;
-		if (!g_key_file_load_from_file(key_file, path, G_KEY_FILE_NONE, GError &error)) {
-			purple_debug_error("Trillian talk.ini read",
-			                   "Error reading talk.ini\n");
-			if (error)
-				g_error_free(error);
-		} else {
-			char *logdir = g_key_file_get_string(key_file, "Logging", "Directory", &error);
-			if (error) {
-				purple_debug_error("Trillian talk.ini read",
-				                   "Error reading Directory value from Logging section\n");
-				g_error_free(error);
-			}
-
-			if (logdir) {
-				g_strchomp(logdir);
-				purple_prefs_add_string("/plugins/core/log_reader/trillian/log_directory", logdir);
-				found = TRUE;
-			}
-
-			g_key_file_free(key_file);
-		}
-#else
 		gchar *contents = NULL;
 
 		if (g_file_test(path, G_FILE_TEST_IS_REGULAR)) {
@@ -2514,7 +2485,6 @@
 			g_free(contents);
 		}
 		g_free(path);
-#endif
 	} /* path */
 
 	if (!found) {
--- a/meson.build	Thu Nov 23 21:44:29 2017 -0600
+++ b/meson.build	Fri Dec 15 03:52:01 2017 +0000
@@ -864,7 +864,7 @@
 
 DYNAMIC_BONJOUR = DYNAMIC_PRPLS.contains('bonjour')
 DYNAMIC_FACEBOOK = DYNAMIC_PRPLS.contains('facebook')
-DYNAMIC_GG  = DYNAMIC_PRPLS.contains('gg ')
+DYNAMIC_GG  = DYNAMIC_PRPLS.contains('gg')
 DYNAMIC_IRC = DYNAMIC_PRPLS.contains('irc')
 DYNAMIC_JABBER = DYNAMIC_PRPLS.contains('jabber')
 DYNAMIC_NOVELL = DYNAMIC_PRPLS.contains('novell')

mercurial