[geany/geany] d61b92: Revert "Implement the run helper as a script" on non-Windows
Enrico Tröger
git-noreply at geany.org
Sun Nov 13 13:55:43 UTC 2016
Branch: refs/heads/master
Author: Enrico Tröger <enrico.troeger at uvena.de>
Committer: Enrico Tröger <enrico.troeger at uvena.de>
Date: Sun, 13 Nov 2016 13:55:43 UTC
Commit: d61b92f20260389222d2ab5fd48a65825afb363c
https://github.com/geany/geany/commit/d61b92f20260389222d2ab5fd48a65825afb363c
Log Message:
-----------
Revert "Implement the run helper as a script" on non-Windows
This restores the previous behavior as it has been on non-Windows
systems before.
Post-1.29 we will merge #1300 which implements run helper script support
for non-Windows systems more sophisticated.
Modified Paths:
--------------
src/Makefile.am
src/build.c
src/geany-run-helper
Modified: src/Makefile.am
2 lines changed, 0 insertions(+), 2 deletions(-)
===================================================================
@@ -187,8 +187,6 @@ CLEANFILES += signallist.i
# install the run script
if MINGW
dist_pkglibexec_SCRIPTS = geany-run-helper.bat
-else
-dist_pkglibexec_SCRIPTS = geany-run-helper
endif
# Ubuntu ld has a bug so that libtool sees /usr/local/lib as a system path so
Modified: src/build.c
86 lines changed, 74 insertions(+), 12 deletions(-)
===================================================================
@@ -79,6 +79,10 @@ typedef struct RunInfo
static RunInfo *run_info;
+#ifndef G_OS_WIN32
+static const gchar RUN_SCRIPT_CMD[] = "geany_run_script_XXXXXX.sh";
+#endif
+
/* pack group (<8) and command (<32) into a user_data pointer */
#define GRP_CMD_TO_POINTER(grp, cmd) GUINT_TO_POINTER((((grp)&7) << 5) | ((cmd)&0x1f))
#define GBO_TO_POINTER(gbo) (GRP_CMD_TO_POINTER(GBO_TO_GBG(gbo), GBO_TO_CMD(gbo)))
@@ -109,6 +113,9 @@ static guint build_items_count = 9;
static void build_exit_cb(GPid pid, gint status, gpointer user_data);
static void build_iofunc(GString *string, GIOCondition condition, gpointer data);
+#ifndef G_OS_WIN32
+static gchar *build_create_shellscript(const gchar *working_dir, const gchar *cmd, gboolean autoclose, GError **error);
+#endif
static void build_spawn_cmd(GeanyDocument *doc, const gchar *cmd, const gchar *dir);
static void set_stop_button(gboolean stop);
static void run_exit_cb(GPid child_pid, gint status, gpointer user_data);
@@ -785,6 +792,7 @@ static gchar *prepare_run_cmd(GeanyDocument *doc, gchar **working_dir, guint cmd
const gchar *cmd_working_dir;
gboolean autoclose = FALSE;
gchar *cmd_string_utf8, *working_dir_utf8, *run_cmd, *cmd_string;
+ GError *error = NULL;
cmd = get_build_cmd(doc, GEANY_GBG_EXEC, cmdindex, NULL);
@@ -823,25 +831,23 @@ static gchar *prepare_run_cmd(GeanyDocument *doc, gchar **working_dir, guint cmd
#ifdef G_OS_WIN32
/* Expand environment variables like %blah%. */
SETPTR(cmd_string, win32_expand_environment_variables(cmd_string));
-#endif
gchar *helper = g_build_filename(utils_resource_dir(RESOURCE_DIR_LIBEXEC), "geany-run-helper", NULL);
- gchar *arg_directory = NULL;
-
/* escape helper appropriately */
-#ifdef G_OS_WIN32
/* FIXME: check the Windows rules, but it should not matter too much here as \es and "es are not
* allowed in paths anyway */
- SETPTR(helper, g_strdup_printf("\"%s\"", helper));
- SETPTR(arg_directory, g_strdup_printf("\"%s\"", *working_dir));
+ run_cmd = g_strdup_printf("\"%s\" \"%s\" %d %s", helper, *working_dir, autoclose ? 1 : 0, cmd_string);
+ g_free(helper);
#else
- SETPTR(helper, g_shell_quote(helper));
- SETPTR(arg_directory, g_shell_quote(*working_dir));
+ run_cmd = build_create_shellscript(*working_dir, cmd_string, autoclose, &error);
+ if (!run_cmd)
+ {
+ ui_set_statusbar(TRUE, _("Failed to execute \"%s\" (start-script could not be created: %s)"),
+ !EMPTY(cmd_string_utf8) ? cmd_string_utf8 : NULL, error->message);
+ g_error_free(error);
+ g_free(*working_dir);
+ }
#endif
- run_cmd = g_strdup_printf("%s %s %d %s", helper, arg_directory, autoclose ? 1 : 0, cmd_string);
- g_free(arg_directory);
- g_free(helper);
-
utils_free_pointers(3, cmd_string_utf8, working_dir_utf8, cmd_string, NULL);
return run_cmd;
}
@@ -930,6 +936,9 @@ static void build_run_cmd(GeanyDocument *doc, guint cmdindex)
"Check the Terminal setting in Preferences"), utf8_term_cmd, error->message);
g_free(utf8_term_cmd);
g_error_free(error);
+#ifndef G_OS_WIN32
+ g_unlink(run_cmd);
+#endif
run_info[cmdindex].pid = (GPid) 0;
}
}
@@ -1080,6 +1089,59 @@ static void run_exit_cb(GPid child_pid, gint status, gpointer user_data)
build_menu_update(NULL);
}
+
+/* write a little shellscript to call the executable (similar to anjuta_launcher but "internal")
+ * working_dir and cmd are both in the locale encoding
+ * it returns the full file name (including path) of the created script in the locale encoding */
+#ifndef G_OS_WIN32
+static gchar *build_create_shellscript(const gchar *working_dir, const gchar *cmd, gboolean autoclose, GError **error)
+{
+ gint fd;
+ gchar *str, *fname;
+ gboolean success = TRUE;
+ gchar *escaped_dir;
+ fd = g_file_open_tmp (RUN_SCRIPT_CMD, &fname, error);
+ if (fd < 0)
+ return NULL;
+ close(fd);
+
+ escaped_dir = g_shell_quote(working_dir);
+ str = g_strdup_printf(
+ "#!/bin/sh\n\nrm $0\n\ncd %s\n\n%s\n\necho \"\n\n------------------\n(program exited with code: $?)\" \
+ \n\n%s\n", escaped_dir, cmd, (autoclose) ? "" :
+ "\necho \"Press return to continue\"\n#to be more compatible with shells like "
+ "dash\ndummy_var=\"\"\nread dummy_var");
+ g_free(escaped_dir);
+
+ if (!g_file_set_contents(fname, str, -1, error))
+ success = FALSE;
+ g_free(str);
+#ifdef __APPLE__
+ if (success && g_chmod(fname, 0777) != 0)
+ {
+ if (error)
+ {
+ gint errsv = errno;
+
+ g_set_error(error, G_FILE_ERROR, g_file_error_from_errno(errsv),
+ "Failed to make file executable: %s", g_strerror(errsv));
+ }
+ success = FALSE;
+ }
+#endif
+
+ if (!success)
+ {
+ g_unlink(fname);
+ g_free(fname);
+ fname = NULL;
+ }
+
+ return fname;
+}
+#endif
+
+
typedef void Callback(GtkWidget *w, gpointer u);
/* run the command catenating cmd_cat if present */
Modified: src/geany-run-helper
28 lines changed, 0 insertions(+), 28 deletions(-)
===================================================================
@@ -1,28 +0,0 @@
-#!/bin/sh
-# USAGE: geany-run-helper DIRECTORY AUTOCLOSE COMMAND...
-
-# OSX resets the current directory, so check it back
-cd "$1"
-shift
-# save autoclose option and remove it
-autoclose=$1
-shift
-
-# spawn the child
-"$@"
-
-# show the result
-echo "
-
-------------------
-(program exited with code: $?)
-"
-
-# and if wanted, wait on the user
-if ! [ "$autoclose" = 0 ]
-then
- echo "Press return to continue"
- # to be more compatible with shells like dash
- dummy_var=
- read dummy_var
-fi
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list