[geany/geany-osx] 8b73e3: Update patches related to configurable shell

Jiří Techet git-noreply at xxxxx
Sat Nov 9 22:10:41 UTC 2019


Branch:      refs/heads/master
Author:      Jiří Techet <techet at gmail.com>
Committer:   Jiří Techet <techet at gmail.com>
Date:        Sat, 09 Nov 2019 22:10:41 UTC
Commit:      8b73e326d94db638c06596591a7ffb9e21bfd8b7
             https://github.com/geany/geany-osx/commit/8b73e326d94db638c06596591a7ffb9e21bfd8b7

Log Message:
-----------
Update patches related to configurable shell


Modified Paths:
--------------
    geany.modules
    patches/01-geany_config_shell.patch
    patches/03-geany_vte_login_shell.patch

Modified: geany.modules
2 lines changed, 2 insertions(+), 0 deletions(-)
===================================================================
@@ -102,6 +102,7 @@
             revision="master" >
       <!-- This patch corresponds to https://github.com/geany/geany/pull/2363 -->
       <patch file="https://github.com/geany/geany-osx/raw/master/patches/01-geany_config_shell.patch" strip="1" />
+      <patch file="https://github.com/geany/geany-osx/raw/master/patches/03-geany_vte_login_shell.patch" strip="1" />
       <!-- TODO: remove once merged upstream-->
       <patch file="https://github.com/geany/geany-osx/raw/master/patches/02-geany_scintilla_im_fix.patch" strip="1" />
     </branch>
@@ -119,6 +120,7 @@
             version="1.36">
       <!-- This patch corresponds to https://github.com/geany/geany/pull/2363 -->
       <patch file="https://github.com/geany/geany-osx/raw/master/patches/01-geany_config_shell.patch" strip="1" />
+      <patch file="https://github.com/geany/geany-osx/raw/master/patches/03-geany_vte_login_shell.patch" strip="1" />
       <!-- TODO: remove once merged upstream-->
       <patch file="https://github.com/geany/geany-osx/raw/master/patches/02-geany_scintilla_im_fix.patch" strip="1" />
     </branch>


Modified: patches/01-geany_config_shell.patch
388 lines changed, 132 insertions(+), 256 deletions(-)
===================================================================
@@ -1,73 +1,53 @@
-From 7ae8e240bb29d300d8343ad0166405cde76d3ec9 Mon Sep 17 00:00:00 2001
+From 2981b0761b343e0eb49ab36f01bf37c4acec5245 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= <techet at gmail.com>
-Date: Wed, 16 Oct 2019 13:21:45 -0700
-Subject: [PATCH] Make the shell used by Geany to run various commands
- configurable
+Date: Sat, 9 Nov 2019 10:46:39 -0800
+Subject: [PATCH 1/2] Allow configuring shell used for build commands
 
-Because each shell has its own configuration file which can contain
-different environment settings, it is useful to be able to specify
-which shell Geany should use.
+Currently there is a problem when users use a different shell than sh/bash
+and configure their environment in the config file of the given shell.
+This config file isn't loaded by Geany because Geany always uses sh
+in a non-login non-interactive way.
 
-To limit the shells to only those we know that work with Geany, this
-implementation only allows users to select from /bin/sh, /bin/bash and
-/bin/zsh. More shells can be added in the future.
+This patch tries to solve the problem by allowing users to specify the
+shell they want to use for launching build commands. In order to make
+shells load their config files, the shells are run as login non-interactive
+shells because non-login non-interactive shells like sh/bash don't load
+configuration from any files. Unfortunately csh/tcsh don't allow us to be
+run as login and use the -c option simultaneously so these shells aren't
+started as login shells.
 
-The affected places where we used hard-coded /bin/sh are:
-1. Running commands (in VTE or without, with launch script or without)
-2. Build commands
-3. Print command
+Running shells as login is absolutely necessary on macOS even for sh/bash.
+While on linux display managers typically source .profile upon login,
+this doesn't happen on macOS and the only way to get the environment loaded
+is to run shells as login.
 
-On macOS, the shell defaults to /bin/bash, on other systems to /bin/sh.
+There are some places where /bin/sh can still be used. One of them is
+the execute command. When configured to use VTE for execution, we already
+have the environment set up by the shell in VTE so we don't need to do any
+other work. When configured to use external terminal for running, the
+terminal is run as non-login interactive so it should load its
+configuration too.
 
-Use /bin/sh in some cases
+I kept the printing command to use /bin/sh because either the code used
+for the build command would have to be duplicated there or somehow
+factored-out and it doesn't seem to be worth the work for this simple
+case where only /usr/bin/lpr is called.
 
-1. Use /bin/sh as the default value of the terminal command - it's
-configurable anyway
-2. Use /bin/sh for running the launch script in VTE - the user already has
-the environment variables set using the shell he uses for the terminal
-and this way we can be sure it's run using compatible shell.
-
-Also remove the shebang at the beginning of the launch script - we never
-run it directory, only as a paramter of a shell command so it's useless.
-
-Make sure we run a shell as a login shell on macOS
-
-Unlike other unixes, macOS runs shell inside the Terminal app as a login
-shell. This means that most users put their environment variables into
-e.g. .bash_profile instead of .bashrc like linux users. So if we wouldn't
-run the shell as a login shell, user's environment variables wouldn't be
-loaded.
-
-All the shels supported by Geany have the -l option.
+This patch has been tested with the following shells:
+sh, bash, dash, ksh, zsh, csh, tcsh, fish, ion
 ---
- data/geany.glade | 44 +++++++++++++++++++++++++++++++++++++++++++-
- src/build.c      | 26 ++++++++++++++++++++------
- src/keyfile.c    | 22 ++++++++++++++--------
- src/prefs.c      | 13 ++++++++++++-
- src/prefs.h      | 10 ++++++++++
- src/printing.c   | 11 +++++++++--
- src/utils.c      | 10 ++++++++++
- src/utils.h      |  2 ++
- 8 files changed, 120 insertions(+), 18 deletions(-)
+ data/geany.glade | 59 +++++++++++++++++++++++++++++++++++++++++++++++-
+ src/build.c      | 14 ++++++++++--
+ src/keyfile.c    |  7 ++++++
+ src/prefs.c      | 10 ++++++++
+ src/prefs.h      |  1 +
+ 5 files changed, 88 insertions(+), 3 deletions(-)
 
 diff --git a/data/geany.glade b/data/geany.glade
-index 3864a0ad1..5fef5c4b0 100644
+index 3864a0ad1..79cf7c4b9 100644
 --- a/data/geany.glade
 +++ b/data/geany.glade
-@@ -724,6 +724,12 @@
-       </row>
-     </data>
-   </object>
-+  <object class="GtkListStore" id="shell_list">
-+    <columns>
-+      <!-- column-name text -->
-+      <column type="gchararray"/>
-+    </columns>
-+  </object>
-   <object class="GtkListStore" id="tab_pos_list">
-     <columns>
-       <!-- column-name item -->
-@@ -4798,10 +4804,13 @@
+@@ -4798,7 +4798,7 @@
                                <object class="GtkTable" id="table1">
                                  <property name="visible">True</property>
                                  <property name="can_focus">False</property>
@@ -76,13 +56,7 @@ index 3864a0ad1..5fef5c4b0 100644
                                  <property name="n_columns">3</property>
                                  <property name="column_spacing">6</property>
                                  <property name="row_spacing">3</property>
-+                                <child>
-+                                  <placeholder/>
-+                                </child>
-                                 <child>
-                                   <object class="GtkLabel" id="label97">
-                                     <property name="visible">True</property>
-@@ -4960,6 +4969,39 @@
+@@ -4960,6 +4960,63 @@
                                      <property name="y_options"/>
                                    </packing>
                                  </child>
@@ -92,6 +66,7 @@ index 3864a0ad1..5fef5c4b0 100644
 +                                    <property name="can_focus">False</property>
 +                                    <property name="xalign">0</property>
 +                                    <property name="label" translatable="yes">Shell:</property>
++                                    <property name="mnemonic_widget">entry_grep</property>
 +                                  </object>
 +                                  <packing>
 +                                    <property name="top_attach">3</property>
@@ -101,278 +76,179 @@ index 3864a0ad1..5fef5c4b0 100644
 +                                  </packing>
 +                                </child>
 +                                <child>
-+                                  <object class="GtkComboBox" id="combo_shell">
++                                  <object class="GtkEntry" id="entry_shell1">
 +                                    <property name="visible">True</property>
 +                                    <property name="can_focus">True</property>
-+                                    <property name="model">shell_list</property>
-+                                    <child>
-+                                      <object class="GtkCellRendererText" id="cellrenderertext6"/>
-+                                      <attributes>
-+                                        <attribute name="text">0</attribute>
-+                                      </attributes>
-+                                    </child>
++                                    <property name="tooltip_text" translatable="yes">Shell used for build commands (useful to get environment set up from the shell's config files)</property>
++                                    <property name="invisible_char">•</property>
++                                    <property name="invisible_char_set">True</property>
++                                    <property name="primary_icon_activatable">False</property>
++                                    <property name="secondary_icon_activatable">False</property>
++                                    <property name="primary_icon_sensitive">True</property>
++                                    <property name="secondary_icon_sensitive">True</property>
 +                                  </object>
 +                                  <packing>
 +                                    <property name="left_attach">1</property>
 +                                    <property name="right_attach">2</property>
 +                                    <property name="top_attach">3</property>
 +                                    <property name="bottom_attach">4</property>
++                                    <property name="y_options"/>
++                                  </packing>
++                                </child>
++                                <child>
++                                  <object class="GtkButton" id="button_shell">
++                                    <property name="visible">True</property>
++                                    <property name="can_focus">True</property>
++                                    <property name="receives_default">False</property>
++                                    <child>
++                                      <object class="GtkImage" id="image7">
++                                        <property name="visible">True</property>
++                                        <property name="can_focus">False</property>
++                                        <property name="stock">gtk-open</property>
++                                      </object>
++                                    </child>
++                                  </object>
++                                  <packing>
++                                    <property name="left_attach">2</property>
++                                    <property name="right_attach">3</property>
++                                    <property name="top_attach">3</property>
++                                    <property name="bottom_attach">4</property>
++                                    <property name="x_options">GTK_FILL</property>
++                                    <property name="y_options"/>
 +                                  </packing>
 +                                </child>
                                </object>
                                <packing>
                                  <property name="expand">False</property>
 diff --git a/src/build.c b/src/build.c
-index 4c9f4ebb2..aa811fc60 100644
+index 4c9f4ebb2..996758d80 100644
 --- a/src/build.c
 +++ b/src/build.c
-@@ -772,7 +772,13 @@ static gchar *build_replace_placeholder(const GeanyDocument *doc, const gchar *s
+@@ -772,10 +772,11 @@ static gchar *build_replace_placeholder(const GeanyDocument *doc, const gchar *s
  static void build_spawn_cmd(GeanyDocument *doc, const gchar *cmd, const gchar *dir)
  {
  	GError *error = NULL;
 -	gchar *argv[] = { "/bin/sh", "-c", NULL, NULL };
-+	gchar *argv[] = { (gchar *)utils_get_shell_path(tool_prefs.shell),
-+#ifdef __APPLE__
-+		/* run as a login shell as the macOS terminal app does this and users
-+		 * typically update their login shell configuration file */
-+		"-l",
-+#endif
-+		"-c", NULL, NULL };
++	gchar *argv[] = { tool_prefs.shell_cmd, "-l", "-c", NULL, NULL };
  	gchar *working_dir;
  	gchar *utf8_working_dir;
  	gchar *cmd_string;
-@@ -799,8 +805,12 @@ static void build_spawn_cmd(GeanyDocument *doc, const gchar *cmd, const gchar *d
++	gchar *shell = NULL;
+ 
+ 	g_return_if_fail(doc == NULL || doc->is_valid);
+ 
+@@ -799,8 +800,16 @@ static void build_spawn_cmd(GeanyDocument *doc, const gchar *cmd, const gchar *d
  
  #ifdef G_OS_UNIX
  	cmd_string = utils_get_locale_from_utf8(cmd);
 -	argv[2] = cmd_string;
  	cmd = NULL;  /* under Unix, use argv to start cmd via sh for compatibility */
-+# ifdef __APPLE__
-+	argv[3] = cmd_string;  /* because of the extra -l argument */
-+# else
-+	argv[2] = cmd_string;
-+# endif
++	shell = g_path_get_basename(tool_prefs.shell_cmd);
++	if (g_strcmp0(shell, "csh") == 0 || g_strcmp0(shell, "tcsh") == 0)
++	{
++		/* csh and tcsh don't support -l together with -c so don't use it */
++		argv[1] = "-c";
++		argv[2] = cmd_string;
++	}
++	else
++		argv[3] = cmd_string;
  #else
  	/* Expand environment variables like %blah%. */
  	cmd_string = win32_expand_environment_variables(cmd);
-@@ -1160,10 +1170,14 @@ static gchar *build_create_shellscript(const gchar *working_dir, const gchar *cm
+@@ -825,6 +834,7 @@ static void build_spawn_cmd(GeanyDocument *doc, const gchar *cmd, const gchar *d
+ 
+ 	g_free(working_dir);
+ 	g_free(cmd_string);
++	g_free(shell);
+ }
  
- 	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");
-+		"rm $0\n\n"
-+		"cd %s\n\n"
-+		"%s\n\n"
-+		"echo \"\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))
 diff --git a/src/keyfile.c b/src/keyfile.c
-index a5f6e9dfd..09b0f7414 100644
+index a5f6e9dfd..d4daa0b2f 100644
 --- a/src/keyfile.c
 +++ b/src/keyfile.c
-@@ -98,6 +98,11 @@
- #define GEANY_MAX_AUTOCOMPLETE_WORDS	30
- #define GEANY_MAX_SYMBOLS_UPDATE_FREQ	250
- #define GEANY_DEFAULT_FILETYPE_REGEX    "-\\*-\\s*([^\\s]+)\\s*-\\*-"
+@@ -93,6 +93,11 @@
+ #endif
+ #define GEANY_DEFAULT_TOOLS_PRINTCMD	"lpr"
+ #define GEANY_DEFAULT_TOOLS_GREP		"grep"
 +#ifdef __APPLE__
-+# define GEANY_DEFAULT_SHELL GEANY_SHELL_BASH
++# define GEANY_DEFAULT_TOOLS_SHELL "/bin/bash"
 +#else
-+# define GEANY_DEFAULT_SHELL GEANY_SHELL_SH
++# define GEANY_DEFAULT_TOOLS_SHELL "/bin/sh"
 +#endif
- 
- 
- static gchar *scribble_text = NULL;
+ #define GEANY_DEFAULT_MRU_LENGTH		10
+ #define GEANY_TOGGLE_MARK				"~ "
+ #define GEANY_MAX_AUTOCOMPLETE_WORDS	30
 @@ -523,6 +528,7 @@ static void save_dialog_prefs(GKeyFile *config)
  	g_key_file_set_string(config, "tools", "terminal_cmd", tool_prefs.term_cmd ? tool_prefs.term_cmd : "");
  	g_key_file_set_string(config, "tools", "browser_cmd", tool_prefs.browser_cmd ? tool_prefs.browser_cmd : "");
  	g_key_file_set_string(config, "tools", "grep_cmd", tool_prefs.grep_cmd ? tool_prefs.grep_cmd : "");
-+	g_key_file_set_integer(config, "tools", "shell", tool_prefs.shell);
++	g_key_file_set_string(config, "tools", "shell_cmd", tool_prefs.shell_cmd ? tool_prefs.shell_cmd : "");
  	g_key_file_set_string(config, PACKAGE, "context_action_cmd", tool_prefs.context_action_cmd);
  
  	/* build menu */
-@@ -883,14 +889,7 @@ static void load_dialog_prefs(GKeyFile *config)
- 	{
- 		StashGroup *group;
- 		struct passwd *pw = getpwuid(getuid());
--		const gchar *shell = (pw != NULL) ? pw->pw_shell : "/bin/sh";
--
--#ifdef __APPLE__
--		/* Geany is started using launchd on OS X and we don't get any environment variables
--		 * so PS1 isn't defined. Start as a login shell to read the corresponding config files. */
--		if (strcmp(shell, "/bin/bash") == 0)
--			shell = "/bin/bash -l";
--#endif
-+		const gchar *shell = (pw != NULL) ? pw->pw_shell : utils_get_shell_path(tool_prefs.shell);
- 
- 		vc = g_new0(VteConfig, 1);
- 		vte_info.dir = utils_get_setting_string(config, "VTE", "last_dir", NULL);
-@@ -902,6 +901,12 @@ static void load_dialog_prefs(GKeyFile *config)
- 			vte_info.dir = g_strdup("/");
- 
- 		vc->shell = utils_get_setting_string(config, "VTE", "shell", shell);
-+#ifdef __APPLE__
-+		/* run as a login shell as the macOS terminal app does this and users
-+		 * typically update their login shell configuration file */
-+		if (strstr(shell, "-l") == NULL)
-+			SETPTR(vc->shell, g_strconcat(shell, " -l", NULL));
-+#endif
- 		vc->font = utils_get_setting_string(config, "VTE", "font", GEANY_DEFAULT_FONT_EDITOR);
- 		vc->scroll_on_key = utils_get_setting_boolean(config, "VTE", "scroll_on_key", TRUE);
- 		vc->scroll_on_out = utils_get_setting_boolean(config, "VTE", "scroll_on_out", TRUE);
-@@ -965,6 +970,7 @@ static void load_dialog_prefs(GKeyFile *config)
+@@ -965,6 +971,7 @@ static void load_dialog_prefs(GKeyFile *config)
  	tool_prefs.term_cmd = cmd;
  	tool_prefs.browser_cmd = utils_get_setting_string(config, "tools", "browser_cmd", GEANY_DEFAULT_TOOLS_BROWSER);
  	tool_prefs.grep_cmd = utils_get_setting_string(config, "tools", "grep_cmd", GEANY_DEFAULT_TOOLS_GREP);
-+	tool_prefs.shell = utils_get_setting_integer(config, "tools", "shell", GEANY_DEFAULT_SHELL);
++	tool_prefs.shell_cmd = utils_get_setting_string(config, "tools", "shell_cmd", GEANY_DEFAULT_TOOLS_SHELL);
  
  	tool_prefs.context_action_cmd = utils_get_setting_string(config, PACKAGE, "context_action_cmd", "");
  
 diff --git a/src/prefs.c b/src/prefs.c
-index 5d1b5fc97..b2cd1ee4c 100644
+index 5d1b5fc97..f43f83619 100644
 --- a/src/prefs.c
 +++ b/src/prefs.c
-@@ -683,6 +683,9 @@ static void prefs_init_dialog(void)
+@@ -683,6 +683,8 @@ static void prefs_init_dialog(void)
  	if (tool_prefs.grep_cmd)
  		gtk_entry_set_text(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_grep")), tool_prefs.grep_cmd);
  
-+	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_shell");
-+	gtk_widget_set_tooltip_text(widget, _("Shell used at various places, e.g. to run compilers, execute commands, etc."));
-+	gtk_combo_box_set_active(GTK_COMBO_BOX(widget), tool_prefs.shell);
++	if (tool_prefs.shell_cmd)
++		gtk_entry_set_text(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_shell1")), tool_prefs.shell_cmd);
  
  	/* Template settings */
  	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_developer");
-@@ -1160,6 +1163,8 @@ on_prefs_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
+@@ -1160,6 +1162,9 @@ on_prefs_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
  		g_free(tool_prefs.grep_cmd);
  		tool_prefs.grep_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
  
-+		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_shell");
-+		tool_prefs.shell = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
++		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_shell1");
++		g_free(tool_prefs.shell_cmd);
++		tool_prefs.shell_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
  
  		/* Template settings */
  		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_developer");
-@@ -1655,7 +1660,7 @@ void prefs_show_dialog(void)
- {
- 	if (ui_widgets.prefs_dialog == NULL)
- 	{
--		GtkListStore *eol_list;
-+		GtkListStore *eol_list, *shell_list;
- 		GtkWidget *label;
- 
- 		ui_widgets.prefs_dialog = create_prefs_dialog();
-@@ -1788,6 +1793,12 @@ void prefs_show_dialog(void)
+@@ -1727,6 +1732,7 @@ void prefs_show_dialog(void)
+ 				"entry_com_term",
+ 				"entry_browser",
+ 				"entry_grep",
++				"entry_shell1",
+ 				"entry_contextaction",
+ 				"entry_template_developer",
+ 				"entry_template_initial",
+@@ -1787,6 +1793,10 @@ void prefs_show_dialog(void)
+ 			NULL,
  			GTK_FILE_CHOOSER_ACTION_OPEN,
  			GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_grep")));
++		ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "button_shell"),
++			NULL,
++			GTK_FILE_CHOOSER_ACTION_OPEN,
++			GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_shell1")));
  
-+		/* init the shell combo box */
-+		shell_list = ui_builder_get_object("shell_list");
-+		list_store_append_text(shell_list, utils_get_shell_path(GEANY_SHELL_SH));
-+		list_store_append_text(shell_list, utils_get_shell_path(GEANY_SHELL_BASH));
-+		list_store_append_text(shell_list, utils_get_shell_path(GEANY_SHELL_ZSH));
-+
  		/* tools commands */
  		ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "button_contextaction"),
- 			NULL,
 diff --git a/src/prefs.h b/src/prefs.h
-index dcf33a502..049c04478 100644
+index dcf33a502..aedfcb0f8 100644
 --- a/src/prefs.h
 +++ b/src/prefs.h
-@@ -42,6 +42,15 @@ typedef struct GeanyPrefs
- }
- GeanyPrefs;
- 
-+/** Shell types used for running commands */
-+typedef enum
-+{
-+	GEANY_SHELL_SH = 0,	/**< /bin/sh */
-+	GEANY_SHELL_BASH,   /**< /bin/bash */
-+	GEANY_SHELL_ZSH,    /**< /bin/zsh */
-+}
-+GeanyShell;
-+
- /** Tools preferences */
- typedef struct GeanyToolPrefs
- {
-@@ -49,6 +58,7 @@ typedef struct GeanyToolPrefs
+@@ -49,6 +49,7 @@ typedef struct GeanyToolPrefs
  	gchar			*term_cmd;				/**< terminal emulator command */
  	gchar			*grep_cmd;				/**< grep command */
  	gchar			*context_action_cmd;	/**< context action command */
-+	GeanyShell		shell;					/**< shell used for running commands */
++	gchar			*shell_cmd;				/**< shell used for running commands */
  }
  GeanyToolPrefs;
  
-diff --git a/src/printing.c b/src/printing.c
-index e974c6a85..c229f45ef 100644
---- a/src/printing.c
-+++ b/src/printing.c
-@@ -41,6 +41,7 @@
- #include "support.h"
- #include "utils.h"
- #include "ui_utils.h"
-+#include "prefs.h"
- 
- #include <math.h>
- #include <time.h>
-@@ -599,10 +600,16 @@ static void print_external(GeanyDocument *doc)
- 			doc->file_name, cmdline))
- 	{
- 		GError *error = NULL;
--		/* /bin/sh -c emulates the system() call and makes complex commands possible
-+		/* $SHELL -c emulates the system() call and makes complex commands possible
- 		 * but only on non-win32 systems due to the lack of win32's shell capabilities */
- 	#ifdef G_OS_UNIX
--		gchar *argv[] = { "/bin/sh", "-c", cmdline, NULL };
-+		gchar *argv[] = { (gchar *)utils_get_shell_path(tool_prefs.shell),
-+	# ifdef __APPLE__
-+		/* run as a login shell as the macOS terminal app does this and users
-+		 * typically update their login shell configuration file */
-+			"-l",
-+	# endif
-+			"-c", cmdline, NULL };
- 
- 		if (!spawn_async(NULL, NULL, argv, NULL, NULL, &error))
- 	#else
-diff --git a/src/utils.c b/src/utils.c
-index 4e3788ad6..a1c84b6a4 100644
---- a/src/utils.c
-+++ b/src/utils.c
-@@ -400,6 +400,16 @@ const gchar *utils_get_eol_char(gint eol_mode)
- 	}
- }
- 
-+const gchar *utils_get_shell_path(gint shell_type)
-+{
-+	switch (shell_type)
-+	{
-+		case GEANY_SHELL_BASH: return "/bin/bash"; break;
-+		case GEANY_SHELL_ZSH: return "/bin/zsh"; break;
-+		default: return "/bin/sh"; break;
-+	}
-+}
-+
- 
- /* Converts line endings to @a target_eol_mode. */
- void utils_ensure_same_eol_characters(GString *string, gint target_eol_mode)
-diff --git a/src/utils.h b/src/utils.h
-index bdbe7bb27..2246a1995 100644
---- a/src/utils.h
-+++ b/src/utils.h
-@@ -245,6 +245,8 @@ const gchar *utils_get_eol_name(gint eol_mode);
- 
- const gchar *utils_get_eol_short_name(gint eol_mode);
- 
-+const gchar *utils_get_shell_path(gint shell_type);
-+
- gboolean utils_atob(const gchar *str);
- 
- void utils_tidy_path(gchar *filename);
 -- 
 2.17.1
 


Modified: patches/03-geany_vte_login_shell.patch
70 lines changed, 70 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,70 @@
+From 11ae19d0df6bf5715c1a92f9b1f5f5fe07621174 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= <techet at gmail.com>
+Date: Sat, 9 Nov 2019 11:07:19 -0800
+Subject: [PATCH 2/2] Make sure any shell used in VTE is run as login shell on
+ macOS
+
+Previously we did this for bash only but we should do it for arbitrary
+shell. The -l option seems to be supported by all major shells.
+
+Previously we used to add -l to the settings value itself which probably
+isn't the cleanest way as the entry should contain path. Let's add
+it invisibly to user but make sure we don't add it when settings already
+contains -l.
+---
+ src/keyfile.c |  7 -------
+ src/vte.c     | 12 +++++++++++-
+ 2 files changed, 11 insertions(+), 8 deletions(-)
+
+diff --git a/src/keyfile.c b/src/keyfile.c
+index d4daa0b2f..92d3ac93c 100644
+--- a/src/keyfile.c
++++ b/src/keyfile.c
+@@ -891,13 +891,6 @@ static void load_dialog_prefs(GKeyFile *config)
+ 		struct passwd *pw = getpwuid(getuid());
+ 		const gchar *shell = (pw != NULL) ? pw->pw_shell : "/bin/sh";
+ 
+-#ifdef __APPLE__
+-		/* Geany is started using launchd on OS X and we don't get any environment variables
+-		 * so PS1 isn't defined. Start as a login shell to read the corresponding config files. */
+-		if (strcmp(shell, "/bin/bash") == 0)
+-			shell = "/bin/bash -l";
+-#endif
+-
+ 		vc = g_new0(VteConfig, 1);
+ 		vte_info.dir = utils_get_setting_string(config, "VTE", "last_dir", NULL);
+ 		if ((vte_info.dir == NULL || utils_str_equal(vte_info.dir, "")) && pw != NULL)
+diff --git a/src/vte.c b/src/vte.c
+index ec8c5df37..3b798de40 100644
+--- a/src/vte.c
++++ b/src/vte.c
+@@ -485,8 +485,17 @@ static void vte_commit_cb(VteTerminal *vte, gchar *arg1, guint arg2, gpointer us
+ 
+ static void vte_start(GtkWidget *widget)
+ {
++	gchar *shell = g_strdup(vc->shell);
++
++#ifdef __APPLE__
++	/* run as a login shell as macOS doesn't load any configuration when
++	 * user is logged in and this is the only way to load config files */
++	if (strstr(shell, " -l") == NULL)
++		SETPTR(shell, g_strconcat(shell, " -l", NULL));
++#endif
++
+ 	/* split the shell command line, so arguments will work too */
+-	gchar **argv = g_strsplit(vc->shell, " ", -1);
++	gchar **argv = g_strsplit(shell, " ", -1);
+ 
+ 	if (argv != NULL)
+ 	{
+@@ -513,6 +522,7 @@ static void vte_start(GtkWidget *widget)
+ 		pid = 0; /* use 0 as invalid pid */
+ 
+ 	set_clean(TRUE);
++	g_free(shell);
+ }
+ 
+ 
+-- 
+2.17.1
+



--------------
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