[gimp/gimp-2-10] issue #2221: gimptool should install plug-ins into subfolders



commit 6789a4350c642d0d13fbc7012cdcc667cc4a5794
Author: Sergio Jiménez Herena <sergio jimenez herena gmail com>
Date:   Wed Oct 3 10:30:13 2018 +0200

    issue #2221: gimptool should install plug-ins into subfolders
    
    (cherry picked from commit 283ec1da0f62216f694316bea307f6a26e2efe1e)

 tools/gimptool.c | 133 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 103 insertions(+), 30 deletions(-)
---
diff --git a/tools/gimptool.c b/tools/gimptool.c
index 5705cabf35..05c310fd8f 100644
--- a/tools/gimptool.c
+++ b/tools/gimptool.c
@@ -61,9 +61,11 @@ static const gchar *env_libs;
 #ifdef G_OS_WIN32
 #define COPY win32_command ("copy")
 #define REMOVE win32_command ("del")
+#define REMOVE_DIR win32_command ("rd /s /q")
 #else
 #define COPY "cp"
 #define REMOVE "rm -f"
+#define REMOVE_DIR "rm -Rf"
 #endif
 
 static struct {
@@ -563,13 +565,22 @@ do_build_2 (const gchar *cflags,
   else
     q++;
 
-  tmp      = dest_exe;
-  dest_exe = g_strconcat (dest_dir, q, EXEEXT, NULL);
+  if (install_dir)
+  {
+    tmp = dest_dir;
+    dest_dir = g_strconcat (dest_dir, q, G_DIR_SEPARATOR_S, NULL);
+    g_free (tmp);
+
+    g_mkdir_with_parents (dest_dir,
+                          S_IRUSR | S_IXUSR | S_IWUSR |
+                          S_IRGRP | S_IXGRP |
+                          S_IROTH | S_IXOTH);
+  }
+
+  tmp = g_strconcat (dest_dir, q, NULL);
   g_free (dest_dir);
-  g_free (tmp);
 
-  tmp      = dest_exe;
-  dest_exe = g_shell_quote (dest_exe);
+  dest_exe = g_shell_quote (tmp);
   g_free (tmp);
 
   if (msvc_syntax)
@@ -644,6 +655,44 @@ get_user_plugin_dir (void)
                            NULL);
 }
 
+static gchar *
+get_plugin_dir (const gchar *base_dir, const gchar *what)
+{
+  gchar *separator, *dot, *plugin_name, *plugin_dir;
+  gchar *tmp = g_strdup (what);
+
+  separator = strrchr (tmp, G_DIR_SEPARATOR);
+#ifdef G_OS_WIN32
+  {
+    gchar *alt_separator = strrchr (tmp, '/');
+    if (alt_separator != NULL &&
+        (separator == NULL || alt_separator > separator))
+    {
+      separator = alt_separator;
+    }
+  }
+#endif
+
+  dot = strrchr (tmp, '.');
+
+  if (separator)
+    plugin_name = separator + 1;
+  else
+    plugin_name = tmp;
+
+  if (dot)
+    *dot = '\0';
+
+  plugin_dir = g_strconcat (base_dir,
+                           G_DIR_SEPARATOR_S,
+                           plugin_name,
+                           NULL);
+
+  g_free (tmp);
+
+  return plugin_dir;
+}
+
 static void
 do_install (const gchar *what)
 {
@@ -757,16 +806,18 @@ do_install_bin_2 (const gchar *dir,
   gchar *quoted_src;
   gchar *quoted_dir;
 
-  g_mkdir_with_parents (dir,
+  gchar *dest_dir = g_strconcat (dir, G_DIR_SEPARATOR_S, NULL);
+  g_mkdir_with_parents (dest_dir,
                         S_IRUSR | S_IXUSR | S_IWUSR |
                         S_IRGRP | S_IXGRP |
                         S_IROTH | S_IXOTH);
 
   quoted_src = g_shell_quote (what);
-  quoted_dir = g_shell_quote (dir);
+  quoted_dir = g_shell_quote (dest_dir);
   cmd = g_strconcat (COPY, " ", quoted_src, " ", quoted_dir, NULL);
   maybe_run (cmd);
 
+  g_free (dest_dir);
   g_free (cmd);
   g_free (quoted_src);
   g_free (quoted_dir);
@@ -776,8 +827,11 @@ static void
 do_install_bin (const gchar *what)
 {
   gchar *dir = get_user_plugin_dir ();
+  gchar *plugin_dir = get_plugin_dir (dir, what);
 
-  do_install_bin_2 (dir, what);
+  do_install_bin_2 (plugin_dir, what);
+
+  g_free (plugin_dir);
   g_free (dir);
 }
 
@@ -785,14 +839,31 @@ static void
 do_install_admin_bin (const gchar *what)
 {
   gchar *dir = get_sys_plugin_dir (FALSE);
+  gchar *plugin_dir = get_plugin_dir (dir, what);
 
   do_install_bin_2 (dir, what);
+
+  g_free (plugin_dir);
   g_free (dir);
 }
 
 static void
-do_uninstall (const gchar *dir,
-              const gchar *what)
+do_uninstall (const gchar *dir)
+{
+  gchar *cmd;
+  gchar *quoted_src;
+  quoted_src = g_shell_quote (dir);
+
+  cmd = g_strconcat (REMOVE_DIR, " ", quoted_src, NULL);
+  maybe_run (cmd);
+
+  g_free (cmd);
+  g_free (quoted_src);
+}
+
+static void
+do_uninstall_script_2 (const gchar *dir,
+                       const gchar *what)
 {
   gchar *cmd;
   gchar *quoted_src;
@@ -800,13 +871,13 @@ do_uninstall (const gchar *dir,
 
   src = g_strconcat (dir, G_DIR_SEPARATOR_S, what, NULL);
   quoted_src = g_shell_quote (src);
-  g_free (src);
 
   cmd = g_strconcat (REMOVE, " ", quoted_src, NULL);
   maybe_run (cmd);
 
   g_free (cmd);
   g_free (quoted_src);
+  g_free (src);
 }
 
 static gchar *
@@ -825,11 +896,13 @@ maybe_append_exe (const gchar *what)
 static void
 do_uninstall_bin (const gchar *what)
 {
-  gchar *dir = get_user_plugin_dir ();
-  gchar *exe = maybe_append_exe (what);
+  gchar *dir        = get_user_plugin_dir ();
+  gchar *exe        = maybe_append_exe (what);
+  gchar *plugin_dir = get_plugin_dir (dir, what);
 
-  do_uninstall (dir, exe);
+  do_uninstall (plugin_dir);
 
+  g_free (plugin_dir);
   g_free (dir);
   g_free (exe);
 }
@@ -837,11 +910,13 @@ do_uninstall_bin (const gchar *what)
 static void
 do_uninstall_admin_bin (const gchar *what)
 {
-  gchar *dir = get_sys_plugin_dir (FALSE);
-  gchar *exe = maybe_append_exe (what);
+  gchar *dir        = get_sys_plugin_dir (FALSE);
+  gchar *exe        = maybe_append_exe (what);
+  gchar *plugin_dir = get_plugin_dir (dir, what);
 
-  do_uninstall (dir, exe);
+  do_uninstall (plugin_dir);
 
+  g_free (plugin_dir);
   g_free (dir);
   g_free (exe);
 }
@@ -891,7 +966,7 @@ do_uninstall_script (const gchar *what)
 {
   gchar *dir = get_user_script_dir ();
 
-  do_uninstall (dir, what);
+  do_uninstall_script_2 (dir, what);
   g_free (dir);
 }
 
@@ -900,7 +975,7 @@ do_uninstall_admin_script (const gchar *what)
 {
   gchar *dir = get_sys_script_dir ();
 
-  do_uninstall (dir, what);
+  do_uninstall_script_2 (dir, what);
   g_free (dir);
 }
 
@@ -941,18 +1016,14 @@ main (int    argc,
         }
       else if (strcmp (argv[argi], "--msvc-syntax") == 0)
         {
+#ifdef G_OS_WIN32
           msvc_syntax = TRUE;
+#else
+          g_printerr ("Ignoring --msvc-syntax\n");
+#endif
         }
     }
 
-#ifndef G_OS_WIN32
-  if (msvc_syntax)
-    {
-      g_printerr ("Ignoring --msvc-syntax\n");
-      msvc_syntax = FALSE;
-    }
-#endif
-
   find_out_env_flags ();
 
   /* Second pass, actually do something. */
@@ -963,13 +1034,15 @@ main (int    argc,
         {
           gchar *test = g_strconcat ("--", dirs[i].option, NULL);
 
-          if (strcmp (argv[argi],
-                      g_strconcat ("--", dirs[i].option, NULL)) == 0)
+          if (strcmp (argv[argi], test) == 0)
             {
               g_free (test);
               break;
             }
-          g_free (test);
+          else
+            {
+              g_free (test);
+            }
         }
 
       if (i < G_N_ELEMENTS (dirs))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]