[Commits] [SCM] claws branch, gtk3, updated. 3.16.0-271-gd1d8850

ticho at claws-mail.org ticho at claws-mail.org
Fri Aug 3 10:46:14 CEST 2018


The branch, gtk3 has been updated
       via  d1d885030577e131bd3de216fa48f8fac7c9b266 (commit)
       via  3e49295bd11a2ac7035b17a8d4e2276ef035e5e1 (commit)
       via  a99fb6c9951b7b65dac6dba605078352db63c158 (commit)
       via  5a965d62ae17f0480372cf187e79faaebed01894 (commit)
       via  57e1eb91e6fa50ecac5309d5123b60b9a37ae5cb (commit)
       via  0513b196c62fe240000b376215bf88ba78910745 (commit)
       via  284aa580c693dceb3a0e6ba8f5a640385e33759b (commit)
       via  3c35e93568fabe967d398fac5040d0a38f7a73ba (commit)
       via  49a9aa1633bcdd2e0dbc0bfdca2e760b4ddda2e9 (commit)
       via  2f2d8bcd6e21d5840fe0a12d30c3d5757fe3a540 (commit)
       via  604720d100ea1ad4011d3365db7c6db415d8d403 (commit)
       via  d65b3acef712659167828d8862ba28c4e564082f (commit)
       via  75dcdc6dbe179dd574a12d32174601e3da3c739f (commit)
       via  9d26c54bd3f1f93af5bba7d205cd66a443b393f1 (commit)
       via  41dd9c5ac2fe84d297c8ced55176b0190e0e8744 (commit)
       via  b9565000500c1d669b8ffd6c77c5edc850ac7220 (commit)
      from  5b65a79cf66fdd70709a56751ab971ad772ad51c (commit)

Summary of changes:
 src/account.c                           |    7 +-
 src/addressbook_foldersel.c             |   22 -------
 src/advsearch.c                         |    9 ++-
 src/editaddress_other_attributes_ldap.c |   16 -----
 src/gtk/quicksearch.c                   |    2 +-
 src/inc.c                               |   26 +++++---
 src/inc.h                               |    2 +
 src/mainwindow.c                        |    2 +
 src/plugins/libravatar/libravatar.c     |    8 ---
 src/plugins/mailmbox/mailmbox.c         |    2 +-
 src/plugins/managesieve/managesieve.c   |    2 +-
 src/plugins/managesieve/sieve_prefs.c   |    4 --
 src/plugins/pgpcore/prefs_gpg.c         |   50 ++++++++-------
 src/plugins/pgpcore/select-keys.c       |   13 ----
 src/plugins/rssyl/rssyl.c               |    2 +
 src/plugins/rssyl/rssyl_cb_menu.c       |   10 +++
 src/plugins/rssyl/rssyl_deleted.c       |  107 ++++++++++++++++---------------
 src/plugins/rssyl/rssyl_feed.c          |   13 +++-
 src/plugins/rssyl/rssyl_feed_props.c    |   16 ++++-
 src/plugins/rssyl/rssyl_subscribe.c     |    2 +-
 src/summary_search.c                    |    6 --
 src/textview.c                          |   22 ++++---
 22 files changed, 166 insertions(+), 177 deletions(-)


- Log -----------------------------------------------------------------
commit d1d885030577e131bd3de216fa48f8fac7c9b266
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Fri Aug 3 09:45:39 2018 +0200

    Fix two GTK runtime warnings in Managesieve feed properties dialog.

diff --git a/src/plugins/managesieve/sieve_prefs.c b/src/plugins/managesieve/sieve_prefs.c
index 63e5dbd..ec37130 100644
--- a/src/plugins/managesieve/sieve_prefs.c
+++ b/src/plugins/managesieve/sieve_prefs.c
@@ -154,8 +154,6 @@ static void sieve_prefs_account_create_widget_func(PrefsPage *_page,
 
 	/* Server info */
 	serv_vbox = gtkut_get_options_frame(sieve_vbox, &serv_frame, _("Server information"));
-	gtk_widget_show (serv_vbox);
-	gtk_box_pack_start (GTK_BOX (page_vbox), serv_vbox, FALSE, FALSE, 0);
 
 	SET_TOGGLE_SENSITIVITY (enable_checkbtn, sieve_vbox);
 	size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
@@ -187,8 +185,6 @@ static void sieve_prefs_account_create_widget_func(PrefsPage *_page,
 	/* Encryption */
 
 	tls_vbox = gtkut_get_options_frame(sieve_vbox, &tls_frame, _("Encryption"));
-	gtk_widget_show (tls_vbox);
-	gtk_box_pack_start (GTK_BOX (page_vbox), tls_vbox, FALSE, FALSE, 0);
 
 	RADIO_ADD(tls_radio_no, tls_group, hbox, tls_vbox,
 			_("No encryption"));

commit 3e49295bd11a2ac7035b17a8d4e2276ef035e5e1
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Fri Aug 3 09:24:29 2018 +0200

    Fix two GTK runtime warnings in RSSyl feed properties dialog.

diff --git a/src/plugins/rssyl/rssyl_feed_props.c b/src/plugins/rssyl/rssyl_feed_props.c
index 74ca3f4..35dc38d 100644
--- a/src/plugins/rssyl/rssyl_feed_props.c
+++ b/src/plugins/rssyl/rssyl_feed_props.c
@@ -274,13 +274,14 @@ void rssyl_gtk_prop(RFolderItem *ritem)
 	/* Auth username */
 	feedprop->auth_username = gtk_entry_new();
 	gtk_entry_set_text(GTK_ENTRY(feedprop->auth_username),
-			ritem->auth->username);
+			(ritem->auth->username != NULL ? ritem->auth->username : ""));
 
 	/* Auth password */
 	feedprop->auth_password = gtk_entry_new();
 	gtk_entry_set_visibility(GTK_ENTRY(feedprop->auth_password), FALSE);
 	gchar *pwd = rssyl_passwd_get(ritem);
-	gtk_entry_set_text(GTK_ENTRY(feedprop->auth_password), pwd);
+	gtk_entry_set_text(GTK_ENTRY(feedprop->auth_password),
+			(pwd != NULL ? pwd : ""));
 	if (pwd != NULL) {
 		memset(pwd, 0, strlen(pwd));
 		g_free(pwd);

commit a99fb6c9951b7b65dac6dba605078352db63c158
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 15 20:49:15 2018 +0200

    Improve textview keypress handling for scrolling. (PgUp/Down, Space, Backspace)

diff --git a/src/textview.c b/src/textview.c
index ba5f46f..29465bf 100644
--- a/src/textview.c
+++ b/src/textview.c
@@ -2405,6 +2405,7 @@ static gint textview_key_pressed(GtkWidget *widget, GdkEventKey *event,
 	GdkWindow *window = NULL;
 	SummaryView *summaryview = NULL;
 	MessageView *messageview = textview->messageview;
+	gboolean mod_pressed;
 
 	if (!event) return FALSE;
 	if (messageview->mainwin)
@@ -2416,8 +2417,6 @@ static gint textview_key_pressed(GtkWidget *widget, GdkEventKey *event,
 	case GDK_KEY_Up:
 	case GDK_KEY_Right:
 	case GDK_KEY_Down:
-	case GDK_KEY_Page_Up:
-	case GDK_KEY_Page_Down:
 	case GDK_KEY_Control_L:
 	case GDK_KEY_Control_R:
 		return FALSE;
@@ -2426,14 +2425,19 @@ static gint textview_key_pressed(GtkWidget *widget, GdkEventKey *event,
 		textview_scroll_max(textview,(event->keyval == GDK_KEY_Home));
 		return TRUE;
 	case GDK_KEY_space:
-		if (summaryview)
-			summary_pass_key_press_event(summaryview, event);
-		else
-			mimeview_scroll_page
-				(messageview->mimeview,
-				 (event->state &
-				  (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0);
+		mod_pressed = ((event->state & (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0);
+		if (!mimeview_scroll_page(messageview->mimeview, mod_pressed) &&
+				summaryview != NULL) {
+			if (mod_pressed)
+				summary_select_prev_unread(summaryview);
+			else
+				summary_select_next_unread(summaryview);
+		}
 		break;
+	case GDK_KEY_Page_Down:
+		mimeview_scroll_page(messageview->mimeview, FALSE);
+		break;
+	case GDK_KEY_Page_Up:
 	case GDK_KEY_BackSpace:
 		mimeview_scroll_page(messageview->mimeview, TRUE);
 		break;

commit 5a965d62ae17f0480372cf187e79faaebed01894
Author: Ricardo Mones <ricardo at mones.org>
Date:   Wed Jul 25 19:34:03 2018 +0200

    Mailmbox: fix buffer size
    
    Should fix the following warnings reported on ML¹:
    
    mailmbox.c: In function ‘claws_mailmbox_expunge_no_lock.part.4’:
    mailmbox.c:1260:34: warning: ‘XXXXXX’ directive output may be truncated
    writing 6 bytes into a region of size between 1 and 4096
    [-Wformat-truncation=]
       snprintf(tmpfile, PATH_MAX, "%sXXXXXX", folder->mb_filename);
                                      ^~~~~~
    mailmbox.c:1260:3: note: ‘snprintf’ output between 7 and 4102 bytes into
    a destination of size 4096
       snprintf(tmpfile, PATH_MAX, "%sXXXXXX", folder->mb_filename);
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    ¹ https://lists.claws-mail.org/pipermail/users/2018-July/022270.html

diff --git a/src/plugins/mailmbox/mailmbox.c b/src/plugins/mailmbox/mailmbox.c
index 3df5342..feb2453 100644
--- a/src/plugins/mailmbox/mailmbox.c
+++ b/src/plugins/mailmbox/mailmbox.c
@@ -1242,7 +1242,7 @@ static int claws_mailmbox_expunge_to_file_no_lock(char * dest_filename, int dest
 
 int claws_mailmbox_expunge_no_lock(struct claws_mailmbox_folder * folder)
 {
-  char tmpfile[PATH_MAX];
+  char tmpfile[PATH_MAX + 8]; /* for the extra Xs */
   int r;
   int res;
   int dest_fd;

commit 57e1eb91e6fa50ecac5309d5123b60b9a37ae5cb
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 15 19:35:06 2018 +0200

    When switching to/from offline mode, reset override timers.
    
    Closes bug #4056: Impossible to disable overriding of offline mode

diff --git a/src/inc.c b/src/inc.c
index d7a4fc5..2415e46 100644
--- a/src/inc.c
+++ b/src/inc.c
@@ -65,6 +65,9 @@ extern SessionStats session_stats;
 
 static GList *inc_dialog_list = NULL;
 
+static time_t inc_offline_overridden_yes = 0;
+static time_t inc_offline_overridden_no  = 0;
+
 guint inc_lock_count = 0;
 
 static GdkPixbuf *currentpix;
@@ -1593,8 +1596,6 @@ void inc_account_autocheck_timer_set_interval(PrefsAccount *account)
 
 gboolean inc_offline_should_override(gboolean force_ask, const gchar *msg)
 {
-	static time_t overridden_yes = 0;
-	static time_t overridden_no  = 0;
 	int length = 10; /* minutes */
 	gint answer = G_ALERTDEFAULT;
 
@@ -1608,15 +1609,15 @@ gboolean inc_offline_should_override(gboolean force_ask, const gchar *msg)
 		length = prefs_common.autochk_itv; /* minutes */
 
 	if (force_ask) {
-		overridden_no = (time_t)0;
+		inc_offline_overridden_no = (time_t)0;
 	}
 
 	if (prefs_common.work_offline) {
 		gchar *tmp = NULL;
 		
-		if (time(NULL) - overridden_yes < length * 60) /* seconds */
+		if (time(NULL) - inc_offline_overridden_yes < length * 60) /* seconds */
 			 return TRUE;
-		else if (time(NULL) - overridden_no < length * 60) /* seconds */
+		else if (time(NULL) - inc_offline_overridden_no < length * 60) /* seconds */
 			 return FALSE;
 
 		if (!force_ask)
@@ -1637,17 +1638,23 @@ gboolean inc_offline_should_override(gboolean force_ask, const gchar *msg)
 				!force_ask? _("On_ly once"):NULL, ALERTFOCUS_SECOND);
 		g_free(tmp);
 		if (answer == G_ALERTALTERNATE) {
-			overridden_yes = time(NULL);
+			inc_offline_overridden_yes = time(NULL);
 			return TRUE;
 		} else if (answer == G_ALERTDEFAULT) {
 			if (!force_ask)
-				overridden_no  = time(NULL);
+				inc_offline_overridden_no  = time(NULL);
 			return FALSE;
 		} else {
-			overridden_yes = (time_t)0;
-			overridden_no  = (time_t)0;
+			inc_reset_offline_override_timers();
 			return TRUE;
 		}
 	}
 	return TRUE;
 }
+
+void inc_reset_offline_override_timers()
+{
+	debug_print("resetting offline override timers\n");
+	inc_offline_overridden_yes = (time_t)0;
+	inc_offline_overridden_no  = (time_t)0;
+}
diff --git a/src/inc.h b/src/inc.h
index 0f91f9b..b9c09f6 100644
--- a/src/inc.h
+++ b/src/inc.h
@@ -130,4 +130,6 @@ gboolean inc_offline_should_override(gboolean force_ask, const gchar *msg);
 void inc_account_autocheck_timer_remove(PrefsAccount *account);
 void inc_account_autocheck_timer_set_interval(PrefsAccount *account);
 
+void inc_reset_offline_override_timers();
+
 #endif /* __INC_H__ */
diff --git a/src/mainwindow.c b/src/mainwindow.c
index 077cbc8..67f9be2 100644
--- a/src/mainwindow.c
+++ b/src/mainwindow.c
@@ -4213,6 +4213,8 @@ void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
 		online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
 	offline_ask_sync = TRUE;
 
+	inc_reset_offline_override_timers();
+
 	switching = FALSE;
 }
 

commit 0513b196c62fe240000b376215bf88ba78910745
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 22 21:28:32 2018 +0200

    Fixed a small memory leak in advsearch_expand_search_string().

diff --git a/src/advsearch.c b/src/advsearch.c
index 94e010e..3abbeaa 100644
--- a/src/advsearch.c
+++ b/src/advsearch.c
@@ -311,9 +311,12 @@ gchar *advsearch_expand_search_string(const gchar *search_string)
 
 	/* return search string if no match is found to allow
 	   all available filtering expressions in advanced search */
-	if (matcherstr->len > 0) returnstr = matcherstr->str;
-	else returnstr = g_strdup(search_string);
-	g_string_free(matcherstr, FALSE);
+	if (matcherstr->len > 0) {
+		returnstr = g_string_free(matcherstr, FALSE);
+	} else {
+		returnstr = g_strdup(search_string);
+		g_string_free(matcherstr, TRUE);
+	}
 	return returnstr;
 }
 

commit 284aa580c693dceb3a0e6ba8f5a640385e33759b
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 22 21:07:46 2018 +0200

    Fix auth retry in Managesieve - wrong state variable was being set.

diff --git a/src/plugins/managesieve/managesieve.c b/src/plugins/managesieve/managesieve.c
index c145715..74b08d3 100644
--- a/src/plugins/managesieve/managesieve.c
+++ b/src/plugins/managesieve/managesieve.c
@@ -748,7 +748,7 @@ static gint sieve_session_recv_msg(Session *session, const gchar *msg)
 	case SIEVE_AUTH_CRAM_MD5:
 		if (response_is_no(msg)) {
 			log_print(LOG_PROTOCOL, "Sieve auth failed\n");
-			session->state = SIEVE_RETRY_AUTH;
+			sieve_session->state = SIEVE_RETRY_AUTH;
 			ret = SE_AUTHFAIL;
 		} else if (response_is_ok(msg)) {
 			log_print(LOG_PROTOCOL, "Sieve auth completed\n");

commit 3c35e93568fabe967d398fac5040d0a38f7a73ba
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 22 21:06:26 2018 +0200

    Removed a few obsolete and unused functions.

diff --git a/src/account.c b/src/account.c
index 6fb22b6..cf28983 100644
--- a/src/account.c
+++ b/src/account.c
@@ -156,10 +156,6 @@ static void account_get_all_toggled		(GtkCellRendererToggle	*widget,
 						 gchar			*path, 
 						 GtkWidget		*list_view);
 
-static void account_autocheck_toggled		(GtkCellRendererToggle	*widget,
-						 gchar			*path,
-						 GtkWidget		*list_view);
-
 static void account_double_clicked		(GtkTreeView		*list_view,
 						 GtkTreePath		*path,
 						 GtkTreeViewColumn	*column,
diff --git a/src/addressbook_foldersel.c b/src/addressbook_foldersel.c
index 6b8c41f..14ca696 100644
--- a/src/addressbook_foldersel.c
+++ b/src/addressbook_foldersel.c
@@ -54,13 +54,6 @@ typedef struct {
 	ItemFolder	*folder;
 } FolderInfo;
 
-typedef struct {
-	gchar **folder_path;
-	gboolean matched;
-	gint index;
-	GtkCMCTreeNode *node;
-} FolderPathMatch;
-
 static struct _AddressBookFolderSel_dlg {
 	GtkWidget *window;
 	GtkWidget *view_folder;
@@ -135,21 +128,6 @@ static void addressbook_foldersel_row_activated(GtkTreeView *view,
 	addressbook_foldersel_ok(NULL, NULL);
 }
 
-static gboolean addressbook_foldersel_tree_button( GtkCMCTree *ctree, GdkEventButton *event, gpointer data )
-{
-	if ( ! event )
-		return FALSE;
-	if ( event->button == 1 ) {
-		/* Handle double click */
-		if ( event->type == GDK_2BUTTON_PRESS ) {
-			addressbook_foldersel_cancelled = FALSE;
-			gtk_main_quit();
-		}
-	}
-
-	return FALSE;
-}
-
 static void addressbook_foldersel_size_allocate_cb(GtkWidget *widget,
 					 GtkAllocation *allocation)
 {
diff --git a/src/editaddress_other_attributes_ldap.c b/src/editaddress_other_attributes_ldap.c
index 3bdb0ec..18b591f 100644
--- a/src/editaddress_other_attributes_ldap.c
+++ b/src/editaddress_other_attributes_ldap.c
@@ -94,22 +94,6 @@ static gboolean list_find_attribute(const gchar *attr)
 	return FALSE;
 }
 
-/*
-* Comparison using cell contents (text in first column). Used for sort
-* address index widget.
-*/
-static gint edit_person_attrib_compare_func(GtkCMCList *clist, gconstpointer ptr1, gconstpointer ptr2) {
-	GtkCMCell *cell1 = ((GtkCMCListRow *)ptr1)->cell;
-	GtkCMCell *cell2 = ((GtkCMCListRow *)ptr2)->cell;
-	gchar *name1 = NULL, *name2 = NULL;
-
-	if (cell1) name1 = cell1->u.text;
-	if (cell2) name2 = cell2->u.text;
-	if (!name1) return (name2 != NULL);
-	if (!name2) return -1;
-	return g_utf8_collate(name1, name2);
-}
-
 static void edit_person_combo_box_changed(GtkComboBox *opt_menu, gpointer data)
 {
 	GtkWidget *view = GTK_WIDGET(data);
diff --git a/src/plugins/libravatar/libravatar.c b/src/plugins/libravatar/libravatar.c
index 41290aa..dee85bb 100644
--- a/src/plugins/libravatar/libravatar.c
+++ b/src/plugins/libravatar/libravatar.c
@@ -146,14 +146,6 @@ static gchar *cache_name_for_md5(const gchar *md5)
 	return g_strconcat(cache_dir, md5, NULL);
 }
 
-static size_t write_image_data_cb(void *ptr, size_t size, size_t nmemb, void *stream)
-{
-	size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
-	debug_print("received %zu bytes from avatar server\n", written);
-
-	return written;
-}
-
 static GtkWidget *image_widget_from_url(const gchar *url, const gchar *md5)
 {
 	GtkWidget *image = NULL;
diff --git a/src/plugins/pgpcore/select-keys.c b/src/plugins/pgpcore/select-keys.c
index 76b3ebd..677c6f7 100644
--- a/src/plugins/pgpcore/select-keys.c
+++ b/src/plugins/pgpcore/select-keys.c
@@ -85,9 +85,6 @@ static void select_btn_cb (GtkWidget *widget, gpointer data);
 static void cancel_btn_cb (GtkWidget *widget, gpointer data);
 static void dont_encrypt_btn_cb (GtkWidget *widget, gpointer data);
 static void other_btn_cb (GtkWidget *widget, gpointer data);
-static void sort_keys (struct select_keys_s *sk, enum col_titles column);
-static void sort_keys_name (GtkWidget *widget, gpointer data);
-static void sort_keys_email (GtkWidget *widget, gpointer data);
 
 static gboolean use_untrusted (gpgme_key_t, gpgme_user_id_t uid, gpgme_protocol_t proto);
 
@@ -175,16 +172,6 @@ gpgmegtk_recipient_selection (GSList *recp_names, SelectionResult *result,
 } 
 
 static void
-destroy_key (gpointer data)
-{
-    gpgme_key_t key = data;
-
-    debug_print("unref key %p\n", key);
-
-    gpgme_key_unref (key);
-}
-
-static void
 set_row (GtkListStore *store, gpgme_key_t key, gpgme_protocol_t proto)
 {
     const gchar *s;
diff --git a/src/summary_search.c b/src/summary_search.c
index 1b545a4..31e358a 100644
--- a/src/summary_search.c
+++ b/src/summary_search.c
@@ -130,7 +130,6 @@ static void subject_changed			(void);
 static void body_changed			(void);
 static void adv_condition_changed	(void);
 static void case_changed			(GtkToggleButton *togglebutton, gpointer user_data);
-static void adv_search_changed		(GtkToggleButton *togglebutton, gpointer user_data);
 
 static gboolean from_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event,
 			      	  gpointer data);
@@ -966,11 +965,6 @@ static void case_changed(GtkToggleButton *togglebutton, gpointer user_data)
 	search_window.matcher_is_outdated = TRUE;
 }
 
-static void adv_search_changed(GtkToggleButton *togglebutton, gpointer user_data)
-{
-	search_window.matcher_is_outdated = TRUE;
-}
-
 static gboolean from_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event,
 			      	  gpointer data)
 {

commit 49a9aa1633bcdd2e0dbc0bfdca2e760b4ddda2e9
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 22 18:55:18 2018 +0200

    When deleting an account, cancel its autocheck timer.

diff --git a/src/account.c b/src/account.c
index aa626ad..6fb22b6 100644
--- a/src/account.c
+++ b/src/account.c
@@ -1137,6 +1137,9 @@ static void account_delete(GtkWidget *widget, gpointer data)
 		folder_destroy(FOLDER(ac_prefs->folder));
 		folderview_set_all();
 	}
+
+	inc_account_autocheck_timer_remove(ac_prefs);
+
 	account_destroy(ac_prefs);
 	account_list_view_set();
 
diff --git a/src/inc.c b/src/inc.c
index 473e11e..d7a4fc5 100644
--- a/src/inc.c
+++ b/src/inc.c
@@ -1567,6 +1567,7 @@ void inc_account_autocheck_timer_remove(PrefsAccount *account)
 	cm_return_if_fail(account != NULL);
 
 	if (account->autocheck_timer != 0) {
+		g_source_remove(account->autocheck_timer);
 		debug_print("INC: account %d: removed inc timer %d\n", account->account_id,
 				account->autocheck_timer);
 		account->autocheck_timer = 0;

commit 2f2d8bcd6e21d5840fe0a12d30c3d5757fe3a540
Author: Paul <paul at claws-mail.org>
Date:   Fri Jul 20 08:26:57 2018 +0100

    fix bug 4058, '# in extended search description window should not be translated'

diff --git a/src/gtk/quicksearch.c b/src/gtk/quicksearch.c
index 3fb9587..a0241d3 100644
--- a/src/gtk/quicksearch.c
+++ b/src/gtk/quicksearch.c
@@ -522,7 +522,7 @@ static gchar *search_descr_strings[] = {
 	"|",	 N_("logical OR operator"),
 	"! or ~",	N_("logical NOT operator"),
 	"%",	 N_("case sensitive search"),
-	"#",	 N_("match using regular expressions instead of substring search"),
+	"&#x00023;", N_("match using regular expressions instead of substring search"),
 	"",	 "" ,
 	" ",	 N_("all filtering expressions are allowed, but cannot be mixed "
 	            "through logical operators with the expressions above"),

commit 604720d100ea1ad4011d3365db7c6db415d8d403
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Tue Jul 17 19:21:36 2018 +0200

    RSSyl: do not look at modified time when matching deleted items

diff --git a/src/plugins/rssyl/rssyl_deleted.c b/src/plugins/rssyl/rssyl_deleted.c
index a4ba75e..4da0f83 100644
--- a/src/plugins/rssyl/rssyl_deleted.c
+++ b/src/plugins/rssyl/rssyl_deleted.c
@@ -44,7 +44,6 @@ static RDeletedItem *_new_deleted_item()
 	ditem->id = NULL;
 	ditem->title = NULL;
 	ditem->date_published = -1;
-	ditem->date_modified = -1;
 
 	return ditem;
 }
@@ -130,8 +129,6 @@ GSList *rssyl_deleted_update(RFolderItem *ritem)
 				ditem->title = g_strdup(line[1]);
 			} else if (ditem != NULL && !strcmp(line[0], "DPUB")) {
 				ditem->date_published = atoi(line[1]);
-			} else if (ditem != NULL && !strcmp(line[0], "DMOD")) {
-				ditem->date_modified = atoi(line[1]);
 				deleted_items = g_slist_prepend(deleted_items, ditem);
 				ditem = NULL;
 			}
@@ -160,11 +157,9 @@ static void _store_one_deleted_item(gpointer data, gpointer user_data)
 	err |= (fprintf(f,
 			"ID: %s\n"
 			"TITLE: %s\n"
-			"DPUB: %lld\n"
-			"DMOD: %lld\n",
+			"DPUB: %lld\n",
 			ditem->id, ditem->title,
-			(long long)ditem->date_published,
-			(long long)ditem->date_modified) < 0);
+			(long long)ditem->date_published) < 0);
 
 	if (err)
 		debug_print("RSSyl: Error during writing deletion file.\n");
@@ -226,7 +221,6 @@ void rssyl_deleted_add(RFolderItem *ritem, gchar *path)
 	ditem->title = conv_unmime_header(feed_item_get_title(fitem),
 			CS_UTF_8, FALSE);
 	ditem->date_published = feed_item_get_date_published(fitem);
-	ditem->date_modified = feed_item_get_date_modified(fitem);
 
 	deleted_items = g_slist_prepend(deleted_items, ditem);
 
@@ -249,7 +243,6 @@ static gint _rssyl_deleted_check_func(gconstpointer a, gconstpointer b)
 	gboolean id_match = FALSE;
 	gboolean title_match = FALSE;
 	gboolean pubdate_match = FALSE;
-	gboolean moddate_newer = FALSE;
 
 	g_return_val_if_fail(ditem != NULL, -10);
 	g_return_val_if_fail(fitem != NULL, -20);
@@ -270,24 +263,14 @@ static gint _rssyl_deleted_check_func(gconstpointer a, gconstpointer b)
 			!strcmp(ditem->title, feed_item_get_title(fitem)))
 		title_match = TRUE;
 
-	/* time of publishing, if set... */
+	/* ...and time of publishing */
 	if (ditem->date_published == -1 ||
 			ditem->date_published == feed_item_get_date_published(fitem))
 		pubdate_match = TRUE;
 
-	/* and the time of last modification must be greater
-	 * (this means that the item was updated since deletion, and possibly
-	 * contains new data, so we add it again) */
-	if (ditem->date_modified != -1 &&
-			ditem->date_modified < feed_item_get_date_modified(fitem))
-		moddate_newer = TRUE;
-
+	/* if all three match, it's the same item */
 	if (id_match && title_match && pubdate_match) {
-		/* we have our item */
-		if (moddate_newer)
-			return -1; /* it's been updated, add it */
-		else
-			return 0; /* not updated, keep ignoring */
+		return 0;
 	}
 
 	/* not our item */

commit d65b3acef712659167828d8862ba28c4e564082f
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Mon Jul 16 22:20:22 2018 +0200

    RSSyl: Re-add a mistakenly deleted #include.

diff --git a/src/plugins/rssyl/rssyl_subscribe.c b/src/plugins/rssyl/rssyl_subscribe.c
index 25b5b17..a5a0024 100644
--- a/src/plugins/rssyl/rssyl_subscribe.c
+++ b/src/plugins/rssyl/rssyl_subscribe.c
@@ -42,6 +42,7 @@
 #include "rssyl_feed.h"
 #include "rssyl_gtk.h"
 #include "rssyl_subscribe_gtk.h"
+#include "rssyl_update_feed.h"
 #include "strutils.h"
 
 static void rssyl_subscribe_foreach_func(gpointer data, gpointer user_data)

commit 75dcdc6dbe179dd574a12d32174601e3da3c739f
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 15 23:43:45 2018 +0200

    Remove unneeded debug_print lines.

diff --git a/src/plugins/pgpcore/prefs_gpg.c b/src/plugins/pgpcore/prefs_gpg.c
index b41a82b..9ac4bbb 100644
--- a/src/plugins/pgpcore/prefs_gpg.c
+++ b/src/plugins/pgpcore/prefs_gpg.c
@@ -552,10 +552,8 @@ struct GPGAccountConfig *prefs_gpg_account_get_config(PrefsAccount *account)
 
 	confstr = prefs_account_get_privacy_prefs(account, "gpg");
 	if (confstr != NULL) {
-		debug_print("confstr|%s|\n", confstr);
 		strv = g_strsplit(confstr, ";", 0);
 		if (strv[0] != NULL) {
-			debug_print("strv0|%s|\n", strv[0]);
 			if (!strcmp(strv[0], "DEFAULT"))
 				config->sign_key = SIGN_KEY_DEFAULT;
 			else if (!strcmp(strv[0], "BY_FROM"))
@@ -580,10 +578,8 @@ struct GPGAccountConfig *prefs_gpg_account_get_config(PrefsAccount *account)
 	if (confstr == NULL)
 		confstr = prefs_account_get_privacy_prefs(account, "gpg");
 	if (confstr != NULL) {
-		debug_print("confstr|%s|\n", confstr);
 		strv = g_strsplit(confstr, ";", 0);
 		if (strv[0] != NULL) {
-			debug_print("strv0|%s|\n", strv[0]);
 			if (!strcmp(strv[0], "DEFAULT"))
 				config->smime_sign_key = SIGN_KEY_DEFAULT;
 			else if (!strcmp(strv[0], "BY_FROM"))

commit 9d26c54bd3f1f93af5bba7d205cd66a443b393f1
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 15 23:42:01 2018 +0200

    Save the account custom signing key ID even if other option than custom is selected.

diff --git a/src/plugins/pgpcore/prefs_gpg.c b/src/plugins/pgpcore/prefs_gpg.c
index 7595c54..b41a82b 100644
--- a/src/plugins/pgpcore/prefs_gpg.c
+++ b/src/plugins/pgpcore/prefs_gpg.c
@@ -297,8 +297,6 @@ void key_custom_toggled(GtkToggleButton *togglebutton, gpointer user_data)
 	active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_custom));
 	gtk_widget_set_sensitive(GTK_WIDGET(page->keyid_label), active);
 	gtk_widget_set_sensitive(GTK_WIDGET(page->keyid), active);
-	if (!active)
-		gtk_editable_delete_text(GTK_EDITABLE(page->keyid), 0, -1);
 }
 
 static void prefs_gpg_update_sens(struct GPGAccountPage *page)
@@ -491,9 +489,9 @@ static void prefs_gpg_account_save_func(PrefsPage *_page)
 			config->smime_sign_key = SIGN_KEY_BY_FROM;
 		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_custom))) {
 			config->smime_sign_key = SIGN_KEY_CUSTOM;
-			g_free(config->smime_sign_key_id);
-			config->smime_sign_key_id = gtk_editable_get_chars(GTK_EDITABLE(page->keyid), 0, -1);
 		}
+		g_free(config->smime_sign_key_id);
+		config->smime_sign_key_id = gtk_editable_get_chars(GTK_EDITABLE(page->keyid), 0, -1);
 	} else {
 		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_default)))
 			config->sign_key = SIGN_KEY_DEFAULT;
@@ -501,9 +499,9 @@ static void prefs_gpg_account_save_func(PrefsPage *_page)
 			config->sign_key = SIGN_KEY_BY_FROM;
 		else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_custom))) {
 			config->sign_key = SIGN_KEY_CUSTOM;
-			g_free(config->sign_key_id);
-			config->sign_key_id = gtk_editable_get_chars(GTK_EDITABLE(page->keyid), 0, -1);
 		}
+		g_free(config->sign_key_id);
+		config->sign_key_id = gtk_editable_get_chars(GTK_EDITABLE(page->keyid), 0, -1);
 	}
 
 	prefs_gpg_account_set_config(page->account, config);
@@ -554,18 +552,22 @@ struct GPGAccountConfig *prefs_gpg_account_get_config(PrefsAccount *account)
 
 	confstr = prefs_account_get_privacy_prefs(account, "gpg");
 	if (confstr != NULL) {
+		debug_print("confstr|%s|\n", confstr);
 		strv = g_strsplit(confstr, ";", 0);
 		if (strv[0] != NULL) {
+			debug_print("strv0|%s|\n", strv[0]);
 			if (!strcmp(strv[0], "DEFAULT"))
 				config->sign_key = SIGN_KEY_DEFAULT;
-			if (!strcmp(strv[0], "BY_FROM"))
+			else if (!strcmp(strv[0], "BY_FROM"))
 				config->sign_key = SIGN_KEY_BY_FROM;
-			if (!strcmp(strv[0], "CUSTOM")) {
-				if (strv[1] != NULL) {
-					config->sign_key = SIGN_KEY_CUSTOM;
-					config->sign_key_id = g_strdup(strv[1]);
-				} else
-					config->sign_key = SIGN_KEY_DEFAULT;
+			else if (!strcmp(strv[0], "CUSTOM")) {
+				config->sign_key = SIGN_KEY_CUSTOM;
+			} else {
+				config->sign_key = SIGN_KEY_DEFAULT;
+			}
+
+			if (strv[1] != NULL) {
+				config->sign_key_id = g_strdup(strv[1]);
 			}
 		}
 		g_strfreev(strv);
@@ -578,18 +580,22 @@ struct GPGAccountConfig *prefs_gpg_account_get_config(PrefsAccount *account)
 	if (confstr == NULL)
 		confstr = prefs_account_get_privacy_prefs(account, "gpg");
 	if (confstr != NULL) {
+		debug_print("confstr|%s|\n", confstr);
 		strv = g_strsplit(confstr, ";", 0);
 		if (strv[0] != NULL) {
+			debug_print("strv0|%s|\n", strv[0]);
 			if (!strcmp(strv[0], "DEFAULT"))
 				config->smime_sign_key = SIGN_KEY_DEFAULT;
-			if (!strcmp(strv[0], "BY_FROM"))
+			else if (!strcmp(strv[0], "BY_FROM"))
 				config->smime_sign_key = SIGN_KEY_BY_FROM;
-			if (!strcmp(strv[0], "CUSTOM")) {
-				if (strv[1] != NULL) {
-					config->smime_sign_key = SIGN_KEY_CUSTOM;
-					config->smime_sign_key_id = g_strdup(strv[1]);
-				} else
-					config->smime_sign_key = SIGN_KEY_DEFAULT;
+			else if (!strcmp(strv[0], "CUSTOM")) {
+				config->smime_sign_key = SIGN_KEY_CUSTOM;
+			} else {
+				config->smime_sign_key = SIGN_KEY_DEFAULT;
+			}
+
+			if (strv[1] != NULL) {
+				config->smime_sign_key_id = g_strdup(strv[1]);
 			}
 		}
 		g_strfreev(strv);
@@ -604,10 +610,10 @@ void prefs_gpg_account_set_config(PrefsAccount *account, GPGAccountConfig *confi
 
 	switch (config->sign_key) {
 	case SIGN_KEY_DEFAULT:
-		confstr = g_strdup("DEFAULT");
+		confstr = g_strdup_printf("DEFAULT;%s", config->sign_key_id);
 		break;
 	case SIGN_KEY_BY_FROM:
-		confstr = g_strdup("BY_FROM");
+		confstr = g_strdup_printf("BY_FROM;%s", config->sign_key_id);
 		break;
 	case SIGN_KEY_CUSTOM:
 		confstr = g_strdup_printf("CUSTOM;%s", config->sign_key_id);
@@ -624,10 +630,10 @@ void prefs_gpg_account_set_config(PrefsAccount *account, GPGAccountConfig *confi
 
 	switch (config->smime_sign_key) {
 	case SIGN_KEY_DEFAULT:
-		confstr = g_strdup("DEFAULT");
+		confstr = g_strdup_printf("DEFAULT;%s", config->smime_sign_key_id);
 		break;
 	case SIGN_KEY_BY_FROM:
-		confstr = g_strdup("BY_FROM");
+		confstr = g_strdup_printf("BY_FROM;%s", config->smime_sign_key_id);
 		break;
 	case SIGN_KEY_CUSTOM:
 		confstr = g_strdup_printf("CUSTOM;%s", config->smime_sign_key_id);

commit 41dd9c5ac2fe84d297c8ced55176b0190e0e8744
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 15 10:25:42 2018 +0200

    RSSyl: add more missing checks for offline mode
    
    Closes bug #4014 - "Work offline" doesn't seem to affect RSS

diff --git a/src/plugins/rssyl/rssyl.c b/src/plugins/rssyl/rssyl.c
index ea70028..c400e96 100644
--- a/src/plugins/rssyl/rssyl.c
+++ b/src/plugins/rssyl/rssyl.c
@@ -38,6 +38,7 @@
 #include <mh.h>
 #include <xml.h>
 #include <toolbar.h>
+#include <prefs_common.h>
 #include <prefs_toolbar.h>
 #include <utils.h>
 
@@ -156,6 +157,7 @@ void rssyl_init(void)
 	prefs_toolbar_register_plugin_item(TOOLBAR_MAIN, PLUGIN_NAME, _("Refresh all feeds"), rssyl_toolbar_cb_refresh_all_feeds, NULL);
 
 	if( rssyl_prefs_get()->refresh_on_startup &&
+			!prefs_common_get_prefs()->work_offline &&
 			claws_is_starting() )
 		g_timeout_add(2000, rssyl_update_all_feeds_deferred, NULL);
 }
diff --git a/src/plugins/rssyl/rssyl_cb_menu.c b/src/plugins/rssyl/rssyl_cb_menu.c
index 304d133..5874326 100644
--- a/src/plugins/rssyl/rssyl_cb_menu.c
+++ b/src/plugins/rssyl/rssyl_cb_menu.c
@@ -292,6 +292,16 @@ void rssyl_update_all_cb( GtkAction *action, gpointer data)
 		return;
 	}
 
+	/* Offline check */
+	if( prefs_common_get_prefs()->work_offline &&
+			!inc_offline_should_override(TRUE,
+					ngettext("Claws Mail needs network access in order "
+					"to update the feed.",
+					"Claws Mail needs network access in order "
+					"to update feeds.", 1))) {
+		return;
+	}
+
 	rssyl_update_recursively(item);
 }
 
diff --git a/src/plugins/rssyl/rssyl_feed.c b/src/plugins/rssyl/rssyl_feed.c
index dde0a20..cbc1459 100644
--- a/src/plugins/rssyl/rssyl_feed.c
+++ b/src/plugins/rssyl/rssyl_feed.c
@@ -82,10 +82,17 @@ gboolean rssyl_refresh_timeout_cb(gpointer data)
 	}
 
 	tmpdate = createRFC822Date(&tt);
-	debug_print(" %s: refresh %s (%d)\n", tmpdate, ctx->ritem->url,
-			ctx->ritem->refresh_id);
+
+	if (prefs_common_get_prefs()->work_offline) {
+		debug_print("RSSyl: %s: skipping update of %s (%d), we are offline\n",
+				tmpdate, ctx->ritem->url, ctx->ritem->refresh_id);
+	} else {
+		debug_print("RSSyl: %s: updating %s (%d)\n",
+				tmpdate, ctx->ritem->url, ctx->ritem->refresh_id);
+		rssyl_update_feed(ctx->ritem, 0);
+	}
+
 	g_free(tmpdate);
-	rssyl_update_feed(ctx->ritem, 0);
 
 	return TRUE;
 }
diff --git a/src/plugins/rssyl/rssyl_feed_props.c b/src/plugins/rssyl/rssyl_feed_props.c
index 97085a2..74ca3f4 100644
--- a/src/plugins/rssyl/rssyl_feed_props.c
+++ b/src/plugins/rssyl/rssyl_feed_props.c
@@ -30,7 +30,9 @@
 #include <gdk/gdkkeysyms.h>
 
 /* Claws Mail includes */
+#include <inc.h>
 #include <mainwindow.h>
+#include <prefs_common.h>
 #include <prefs_gtk.h>
 
 /* Local includes */
@@ -194,6 +196,15 @@ rssyl_props_trim_cb(GtkWidget *widget, gpointer data)
 	RFolderItem *ritem = (RFolderItem *)data;
 	gboolean k = ritem->keep_old;
 
+	if( prefs_common_get_prefs()->work_offline &&
+			!inc_offline_should_override(TRUE,
+					ngettext("Claws Mail needs network access in order "
+					"to update the feed.",
+					"Claws Mail needs network access in order "
+					"to update feeds.", 1))) {
+		return FALSE;
+	}
+
 	if( k )
 		ritem->keep_old = FALSE;
 
diff --git a/src/plugins/rssyl/rssyl_subscribe.c b/src/plugins/rssyl/rssyl_subscribe.c
index 1014385..25b5b17 100644
--- a/src/plugins/rssyl/rssyl_subscribe.c
+++ b/src/plugins/rssyl/rssyl_subscribe.c
@@ -41,7 +41,6 @@
 #include "rssyl_add_item.h"
 #include "rssyl_feed.h"
 #include "rssyl_gtk.h"
-#include "rssyl_update_feed.h"
 #include "rssyl_subscribe_gtk.h"
 #include "strutils.h"
 

commit b9565000500c1d669b8ffd6c77c5edc850ac7220
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Sun Jul 15 00:31:18 2018 +0200

    RSSyl: rework matching deleted items to better handle feeds without id
    
    Fixes bug #3971 again.

diff --git a/src/plugins/rssyl/rssyl_deleted.c b/src/plugins/rssyl/rssyl_deleted.c
index 5991093..a4ba75e 100644
--- a/src/plugins/rssyl/rssyl_deleted.c
+++ b/src/plugins/rssyl/rssyl_deleted.c
@@ -245,34 +245,53 @@ static gint _rssyl_deleted_check_func(gconstpointer a, gconstpointer b)
 {
 	RDeletedItem *ditem = (RDeletedItem *)a;
 	FeedItem *fitem = (FeedItem *)b;
+	gchar *id;
+	gboolean id_match = FALSE;
+	gboolean title_match = FALSE;
+	gboolean pubdate_match = FALSE;
+	gboolean moddate_newer = FALSE;
 
 	g_return_val_if_fail(ditem != NULL, -10);
 	g_return_val_if_fail(fitem != NULL, -20);
 
 	/* Following must match:
-	 * ID, ... */
-	if (!ditem->id || !feed_item_get_id(fitem) ||
-			strcmp(ditem->id, feed_item_get_id(fitem)))
-		return -1;
+	 * ID, or if there is no ID, the URL, since that's
+	 * what would have been stored in .deleted instead
+	 * of ID... */
+	if ((id = feed_item_get_id(fitem)) == NULL)
+		id = feed_item_get_url(fitem);
+
+	if (ditem->id && id &&
+			!strcmp(ditem->id, id))
+		id_match = TRUE;
 
 	/* title, ... */
-	if (!ditem->title || !feed_item_get_title(fitem) ||
-			strcmp(ditem->title, feed_item_get_title(fitem)))
-		return -2;
+	if (ditem->title && feed_item_get_title(fitem) &&
+			!strcmp(ditem->title, feed_item_get_title(fitem)))
+		title_match = TRUE;
 
-	/* time of publishing, ... */
-	if (ditem->date_published != -1 &&
-			ditem->date_published != feed_item_get_date_published(fitem))
-		return -3;
+	/* time of publishing, if set... */
+	if (ditem->date_published == -1 ||
+			ditem->date_published == feed_item_get_date_published(fitem))
+		pubdate_match = TRUE;
 
 	/* and the time of last modification must be greater
 	 * (this means that the item was updated since deletion, and possibly
 	 * contains new data, so we add it again) */
 	if (ditem->date_modified != -1 &&
 			ditem->date_modified < feed_item_get_date_modified(fitem))
-		return -4;
+		moddate_newer = TRUE;
+
+	if (id_match && title_match && pubdate_match) {
+		/* we have our item */
+		if (moddate_newer)
+			return -1; /* it's been updated, add it */
+		else
+			return 0; /* not updated, keep ignoring */
+	}
 
-	return 0;
+	/* not our item */
+	return -1;
 }
 
 /* Returns TRUE if fitem is found among the deleted stuff. */
@@ -297,31 +316,36 @@ static void _rssyl_deleted_expire_func_f(gpointer data, gpointer user_data)
 {
 	FeedItem *fitem = (FeedItem *)data;
 	RDelExpireCtx *ctx = (RDelExpireCtx *)user_data;
+	gchar *id;
+	gboolean id_match = FALSE;
+	gboolean title_match = FALSE;
+	gboolean pubdate_match = FALSE;
 
 	/* Following must match:
-	 * ID, ... */
-	if (!ctx->ditem->id || !feed_item_get_id(fitem) ||
-			strcmp(ctx->ditem->id, feed_item_get_id(fitem)))
-		return;
+	 * ID, or if there is no ID, the URL, since that's
+	 * what would have been stored in .deleted instead
+	 * of ID... */
+	if ((id = feed_item_get_id(fitem)) == NULL)
+		id = feed_item_get_url(fitem);
 
-	/* title, ... */
-	if (!ctx->ditem->title || !feed_item_get_title(fitem) ||
-			strcmp(ctx->ditem->title, feed_item_get_title(fitem)))
-		return;
-
-	/* time of publishing, ... */
-	if (ctx->ditem->date_published != -1 &&
-			ctx->ditem->date_published != feed_item_get_date_published(fitem))
-		return;
+	if (ctx->ditem->id && id &&
+			!strcmp(ctx->ditem->id, id))
+		id_match = TRUE;
 
-	/* and the time of last modification must be greater
-	 * (this means that the item was updated since deletion, and possibly
-	 * contains new data, so we add it again) */
-	if (ctx->ditem->date_modified != -1 &&
-			ctx->ditem->date_modified != feed_item_get_date_modified(fitem))
-		return;
-
-	ctx->delete = FALSE;
+	/* title, ... */
+	if (ctx->ditem->title && feed_item_get_title(fitem) &&
+			!strcmp(ctx->ditem->title, feed_item_get_title(fitem)))
+		title_match = TRUE;
+
+	/* time of publishing, if set... */
+	if (ctx->ditem->date_published == -1 ||
+			ctx->ditem->date_published == feed_item_get_date_published(fitem))
+		pubdate_match = TRUE;
+
+	/* if it's our item, set to NOT delete, since it's obviously
+	 * still in the feed */
+	if (id_match && title_match && pubdate_match)
+		ctx->delete = FALSE;
 }
 
 /* Checks each item in deleted items list against feed and removes it if

-----------------------------------------------------------------------


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list