summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/script/script-action.c144
-rw-r--r--src/plugins/script/script-buffer.c61
-rw-r--r--src/plugins/script/script-buffer.h1
-rw-r--r--src/plugins/script/script-config.c25
-rw-r--r--src/plugins/script/script-config.h4
5 files changed, 206 insertions, 29 deletions
diff --git a/src/plugins/script/script-action.c b/src/plugins/script/script-action.c
index 4d7751d62..387dfea45 100644
--- a/src/plugins/script/script-action.c
+++ b/src/plugins/script/script-action.c
@@ -22,6 +22,7 @@
*/
#include <stdlib.h>
+#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <libgen.h>
@@ -413,6 +414,7 @@ script_action_installnext_timer_cb (void *data, int remaining_calls)
/*
* script_action_install_process_cb: callback called when script is downloaded
+ * (for installing it)
*/
int
@@ -446,7 +448,8 @@ script_action_install_process_cb (void *data, const char *command,
ptr_script = script_repo_search_by_name_ext (pos + 1);
if (ptr_script)
{
- filename = script_config_get_script_download_filename (ptr_script);
+ filename = script_config_get_script_download_filename (ptr_script,
+ NULL);
if (filename)
{
length = 3 + strlen (filename) + 1;
@@ -506,7 +509,8 @@ script_action_install (int quiet)
if (ptr_script_to_install)
{
- filename = script_config_get_script_download_filename (ptr_script_to_install);
+ filename = script_config_get_script_download_filename (ptr_script_to_install,
+ NULL);
if (filename)
{
options = weechat_hashtable_new (8,
@@ -657,6 +661,94 @@ script_action_hold (const char *name, int quiet)
}
/*
+ * script_action_show_process_cb: callback called when script is downloaded
+ * (for showing source code below script detail)
+ */
+
+int
+script_action_show_process_cb (void *data, const char *command,
+ int return_code, const char *out,
+ const char *err)
+{
+ char *pos, *filename, line[4096], *ptr_line;
+ struct t_repo_script *ptr_script;
+ FILE *file;
+ int line_y;
+
+ /* make C compiler happy */
+ (void) data;
+
+ if (return_code >= 0)
+ {
+ pos = strrchr (command, '/');
+
+ if ((err && err[0]) || (out && (strncmp (out, "error:", 6) == 0)))
+ {
+ weechat_printf (NULL,
+ _("%s%s: error downloading script \"%s\": %s"),
+ weechat_prefix ("error"),
+ SCRIPT_PLUGIN_NAME,
+ (pos) ? pos + 1 : "?",
+ (err && err[0]) ? err : out + 6);
+ return WEECHAT_RC_OK;
+ }
+
+ if (pos)
+ {
+ ptr_script = script_repo_search_by_name_ext (pos + 1);
+ if (ptr_script)
+ {
+ filename = script_config_get_script_download_filename (ptr_script,
+ ".tmp");
+ if (filename)
+ {
+ /*
+ * read file and display content on script buffer
+ * (only if script buffer is still displaying detail of
+ * this script)
+ */
+ if (script_buffer && script_buffer_detail_script
+ && (script_buffer_detail_script == ptr_script))
+ {
+ line_y = script_buffer_detail_script_line_source + 2;
+ file = fopen (filename, "r");
+ if (file)
+ {
+ while (!feof (file))
+ {
+ ptr_line = fgets (line, sizeof (line) - 1, file);
+ if (ptr_line)
+ {
+ weechat_printf_y (script_buffer, line_y,
+ "%s", ptr_line);
+ line_y++;
+ }
+ }
+ fclose (file);
+ }
+ else
+ {
+ weechat_printf_y (script_buffer, line_y,
+ _("Error: file not found"));
+ line_y++;
+ }
+ weechat_printf_y (script_buffer, line_y,
+ "%s----------------------------------------"
+ "----------------------------------------",
+ weechat_color ("green"));
+ line_y++;
+ }
+ unlink (filename);
+ free (filename);
+ }
+ }
+ }
+ }
+
+ return WEECHAT_RC_OK;
+}
+
+/*
* script_action_show: show detailed info on a script
*/
@@ -664,6 +756,9 @@ void
script_action_show (const char *name, int quiet)
{
struct t_repo_script *ptr_script;
+ char *filename, *url;
+ int length;
+ struct t_hashtable *options;
if (name)
{
@@ -671,6 +766,51 @@ script_action_show (const char *name, int quiet)
if (ptr_script)
{
script_buffer_show_detail_script (ptr_script);
+ if (weechat_config_boolean (script_config_look_display_source))
+ {
+ weechat_printf_y (script_buffer,
+ script_buffer_detail_script_line_source,
+ _("Source code:"));
+ weechat_printf_y (script_buffer,
+ script_buffer_detail_script_line_source + 1,
+ "%s----------------------------------------"
+ "----------------------------------------",
+ weechat_color ("green"));
+ weechat_printf_y (script_buffer,
+ script_buffer_detail_script_line_source + 2,
+ _("Downloading script..."));
+ weechat_printf_y (script_buffer,
+ script_buffer_detail_script_line_source + 3,
+ "%s----------------------------------------"
+ "----------------------------------------",
+ weechat_color ("green"));
+ filename = script_config_get_script_download_filename (ptr_script,
+ ".tmp");
+ if (filename)
+ {
+ options = weechat_hashtable_new (8,
+ WEECHAT_HASHTABLE_STRING,
+ WEECHAT_HASHTABLE_STRING,
+ NULL,
+ NULL);
+ if (options)
+ {
+ length = 4 + strlen (ptr_script->url) + 1;
+ url = malloc (length);
+ if (url)
+ {
+ snprintf (url, length, "url:%s", ptr_script->url);
+ weechat_hashtable_set (options, "file_out", filename);
+ weechat_hook_process_hashtable (url, options, 30000,
+ &script_action_show_process_cb,
+ NULL);
+ free (url);
+ }
+ weechat_hashtable_free (options);
+ }
+ free (filename);
+ }
+ }
}
else
{
diff --git a/src/plugins/script/script-buffer.c b/src/plugins/script/script-buffer.c
index c0f4169be..87e6c8b74 100644
--- a/src/plugins/script/script-buffer.c
+++ b/src/plugins/script/script-buffer.c
@@ -36,6 +36,7 @@
struct t_gui_buffer *script_buffer = NULL;
int script_buffer_selected_line = 0;
struct t_repo_script *script_buffer_detail_script = NULL;
+int script_buffer_detail_script_line_source = 0;
/*
@@ -361,11 +362,12 @@ script_buffer_display_detail_script (struct t_repo_script *script)
{
struct tm *tm;
char str_time[1024];
- char *labels[] = { N_("Script"), N_("Version"), N_("Author"),
- N_("License"), N_("Description"), N_("Tags"),
- N_("Status"), N_("Date added"), N_("Date updated"),
- N_("URL"), N_("MD5"), N_("Requires"), N_("Min WeeChat"),
- N_("Max WeeChat"), NULL };
+ char *labels[] = { N_("Script"), N_("Version"), N_("Version loaded"),
+ N_("Author"), N_("License"), N_("Description"),
+ N_("Tags"), N_("Status"), N_("Date added"),
+ N_("Date updated"), N_("URL"), N_("MD5"), N_("Requires"),
+ N_("Min WeeChat"), N_("Max WeeChat"),
+ NULL };
int i, length, max_length, line;
max_length = 0;
@@ -386,10 +388,16 @@ script_buffer_display_detail_script (struct t_repo_script *script)
weechat_color (weechat_config_string (script_config_color_text_extension)),
script_extension[script->language]);
line++;
- weechat_printf_y (script_buffer, line + 1, "%s: %s",
+ weechat_printf_y (script_buffer, line + 1, "%s: %s%s",
script_buffer_detail_label (_(labels[line]), max_length),
+ weechat_color (weechat_config_string (script_config_color_text_version)),
script->version);
line++;
+ weechat_printf_y (script_buffer, line + 1, "%s: %s%s",
+ script_buffer_detail_label (_(labels[line]), max_length),
+ weechat_color (weechat_config_string (script_config_color_text_version_loaded)),
+ (script->version_loaded) ? script->version_loaded : "-");
+ line++;
weechat_printf_y (script_buffer, line + 1,
"%s: %s <%s>",
script_buffer_detail_label (_(labels[line]), max_length),
@@ -481,6 +489,9 @@ script_buffer_display_detail_script (struct t_repo_script *script)
"%s: %s",
script_buffer_detail_label (_(labels[line]), max_length),
(script->max_weechat) ? script->max_weechat : "-");
+ line++;
+
+ script_buffer_detail_script_line_source = line + 2;
}
/*
@@ -730,24 +741,27 @@ script_buffer_input_cb (void *data, struct t_gui_buffer *buffer,
return WEECHAT_RC_OK;
}
- /* change sort keys on buffer */
- if (strncmp (input_data, "s:", 2) == 0)
+ if (!script_buffer_detail_script)
{
- if (input_data[2])
- weechat_config_option_set (script_config_look_sort, input_data + 2, 1);
- else
- weechat_config_option_reset (script_config_look_sort, 1);
- return WEECHAT_RC_OK;
- }
+ /* change sort keys on buffer */
+ if (strncmp (input_data, "s:", 2) == 0)
+ {
+ if (input_data[2])
+ weechat_config_option_set (script_config_look_sort, input_data + 2, 1);
+ else
+ weechat_config_option_reset (script_config_look_sort, 1);
+ return WEECHAT_RC_OK;
+ }
- /* refresh buffer */
- if (strcmp (input_data, "$") == 0)
- {
- script_get_loaded_scripts ();
- script_repo_remove_all ();
- script_repo_file_read (1);
- script_buffer_refresh (1);
- return WEECHAT_RC_OK;
+ /* refresh buffer */
+ if (strcmp (input_data, "$") == 0)
+ {
+ script_get_loaded_scripts ();
+ script_repo_remove_all ();
+ script_repo_file_read (1);
+ script_buffer_refresh (1);
+ return WEECHAT_RC_OK;
+ }
}
/* execute action on a script */
@@ -763,7 +777,8 @@ script_buffer_input_cb (void *data, struct t_gui_buffer *buffer,
}
/* filter scripts with given text */
- script_repo_filter_scripts (input_data);
+ if (!script_buffer_detail_script)
+ script_repo_filter_scripts (input_data);
return WEECHAT_RC_OK;
}
diff --git a/src/plugins/script/script-buffer.h b/src/plugins/script/script-buffer.h
index 5f5b23fa7..7fbd1dfc5 100644
--- a/src/plugins/script/script-buffer.h
+++ b/src/plugins/script/script-buffer.h
@@ -27,6 +27,7 @@ struct t_repo_script;
extern struct t_gui_buffer *script_buffer;
extern int script_buffer_selected_line;
extern struct t_repo_script *script_buffer_detail_script;
+extern int script_buffer_detail_script_line_source;
extern void script_buffer_refresh (int clear);
extern void script_buffer_set_current_line (int line);
diff --git a/src/plugins/script/script-config.c b/src/plugins/script/script-config.c
index ccf61041b..92af46600 100644
--- a/src/plugins/script/script-config.c
+++ b/src/plugins/script/script-config.c
@@ -40,6 +40,7 @@ struct t_config_section *script_config_section_scripts = NULL;
/* script config, look section */
struct t_config_option *script_config_look_columns;
+struct t_config_option *script_config_look_display_source;
struct t_config_option *script_config_look_quiet_actions;
struct t_config_option *script_config_look_sort;
struct t_config_option *script_config_look_translate_description;
@@ -138,21 +139,31 @@ script_config_get_xml_filename ()
* script_config_get_script_download_filename: get filename for a script to
* download, for eample:
* "/home/xxx/.weechat/script/iset.pl"
+ * (if suffix is not NULL, it is
+ * added to filename)
* Note: result must be freed after
* use
*/
char *
-script_config_get_script_download_filename (struct t_repo_script *script)
+script_config_get_script_download_filename (struct t_repo_script *script,
+ const char *suffix)
{
char *path, *filename;
int length;
path = script_config_get_dir ();
- length = strlen (path) + 1 + strlen (script->name_with_extension) + 1;
+ length = strlen (path) + 1 + strlen (script->name_with_extension)
+ + ((suffix) ? strlen (suffix) : 0) + 1;
filename = malloc (length);
if (filename)
- snprintf (filename, length, "%s/%s", path, script->name_with_extension);
+ {
+ snprintf (filename, length,
+ "%s/%s%s",
+ path,
+ script->name_with_extension,
+ (suffix) ? suffix : "");
+ }
free (path);
return filename;
}
@@ -359,6 +370,14 @@ script_config_init ()
"%W=max_weechat)"),
NULL, 0, 0, "%s %n %V %v %u | %d | %t", NULL, 0,
NULL, NULL, &script_config_refresh_cb, NULL, NULL, NULL);
+ script_config_look_display_source = weechat_config_new_option (
+ script_config_file, ptr_section,
+ "display_source", "boolean",
+ N_("display source code of script on buffer with detail on a script "
+ "(script is downloaded in a temporary file when detail on script "
+ "is displayed)"),
+ NULL, 0, 0, "on", NULL, 0,
+ NULL, NULL, NULL, NULL, NULL, NULL);
script_config_look_quiet_actions = weechat_config_new_option (
script_config_file, ptr_section,
"quiet_actions", "boolean",
diff --git a/src/plugins/script/script-config.h b/src/plugins/script/script-config.h
index 22789d35c..dcaded263 100644
--- a/src/plugins/script/script-config.h
+++ b/src/plugins/script/script-config.h
@@ -25,6 +25,7 @@
struct t_repo_script;
extern struct t_config_option *script_config_look_columns;
+extern struct t_config_option *script_config_look_display_source;
extern struct t_config_option *script_config_look_quiet_actions;
extern struct t_config_option *script_config_look_sort;
extern struct t_config_option *script_config_look_translate_description;
@@ -64,7 +65,8 @@ extern struct t_config_option *script_config_scripts_url;
extern char *script_config_get_dir ();
extern char *script_config_get_xml_filename ();
-extern char *script_config_get_script_download_filename (struct t_repo_script *script);
+extern char *script_config_get_script_download_filename (struct t_repo_script *script,
+ const char *suffix);
extern void script_config_hold (const char *name_with_extension);
extern void script_config_unhold (const char *name_with_extension);
extern int script_config_init ();