[anjuta] Patch from Debarishi. Install required packages using packagekit during a new project creation.



commit c884e45f1d5e71d501660ee47be0185bbd32c160
Author: Naba Kumar <naba gnome org>
Date:   Sat Jan 23 21:46:09 2010 +0200

    Patch from Debarishi. Install required packages using packagekit during a
    new project creation.

 plugins/project-wizard/Makefile.am |    2 +
 plugins/project-wizard/druid.c     |   48 +++++++++++++++++++++++++++++++++---
 plugins/project-wizard/header.c    |   25 +++++-------------
 3 files changed, 53 insertions(+), 22 deletions(-)
---
diff --git a/plugins/project-wizard/Makefile.am b/plugins/project-wizard/Makefile.am
index 1f7c1bf..6ee5bff 100644
--- a/plugins/project-wizard/Makefile.am
+++ b/plugins/project-wizard/Makefile.am
@@ -31,6 +31,8 @@ AM_CPPFLAGS = \
 	$(WARN_CFLAGS) \
 	$(DEPRECATED_FLAGS) \
 	$(LIBANJUTA_CFLAGS) \
+	-DANJUTA_BINDIR=\"$(bindir)\" \
+	-DANJUTA_LIBDIR=\"$(libdir)\" \
 	-DG_LOG_DOMAIN=\"libanjuta-project-wizard\"
 
 libanjuta_project_wizard_la_LDFLAGS = $(ANJUTA_PLUGIN_LDFLAGS)
diff --git a/plugins/project-wizard/druid.c b/plugins/project-wizard/druid.c
index bc64e56..53bd4c9 100644
--- a/plugins/project-wizard/druid.c
+++ b/plugins/project-wizard/druid.c
@@ -761,15 +761,55 @@ on_druid_parse_page (const gchar* output, gpointer data)
 	npw_page_parser_parse (parser, output, strlen (output), NULL);
 }
 
+static void
+strip_package_version_info (gpointer data, gpointer user_data)
+{
+	gchar * const pkg = (gchar *) data;
+
+	if (!data)
+		return;
+	g_strdelimit (pkg, " ", '\0');
+}
+
 static gboolean
 check_and_warn_missing (NPWDruid *druid)
 {
 	GList *missing_programs, *missing_packages;
+	GList *missing_files = NULL;
 	GString *missing_message = NULL;
-	
+	gboolean installed = TRUE;
+
 	missing_programs = npw_header_check_required_programs (druid->header);
 	missing_packages = npw_header_check_required_packages (druid->header);
-	
+
+	anjuta_util_glist_strings_prefix (missing_programs, ANJUTA_BINDIR "/");
+
+	g_list_foreach (missing_packages, (GFunc *) strip_package_version_info,
+					NULL);
+	anjuta_util_glist_strings_prefix (missing_packages,
+									  ANJUTA_LIBDIR "/pkgconfig/");
+	anjuta_util_glist_strings_sufix (missing_packages, ".pc");
+
+	missing_files = g_list_concat (missing_programs, missing_packages);
+
+	if (missing_files)
+	{
+		gchar * missing_names = NULL;
+
+		missing_names = anjuta_util_glist_strings_join (missing_files, ", ");
+		installed = anjuta_util_install_files (missing_names);
+
+		if (missing_names)
+			g_free (missing_names);
+		anjuta_util_glist_strings_free (missing_files);
+	}
+
+	if (installed == TRUE)
+		return TRUE;
+
+	missing_programs = npw_header_check_required_programs (druid->header);
+	missing_packages = npw_header_check_required_packages (druid->header);
+
 	if (missing_programs || missing_packages)
 	{
 		missing_message = g_string_new (NULL);
@@ -783,7 +823,7 @@ check_and_warn_missing (NPWDruid *druid)
 		g_string_append_printf (missing_message,
 								_("\nMissing programs: %s."), missing_progs);
 		g_free (missing_progs);
-		g_list_free (missing_programs);
+		anjuta_util_glist_strings_free (missing_programs);
 	}
 	
 	if (missing_packages)
@@ -794,7 +834,7 @@ check_and_warn_missing (NPWDruid *druid)
 		g_string_append_printf (missing_message,
 								_("\nMissing packages: %s."), missing_pkgs);
 		g_free (missing_pkgs);
-		g_list_free (missing_packages);
+		anjuta_util_glist_strings_free (missing_packages);
 	}
 	
 	if (missing_message)
diff --git a/plugins/project-wizard/header.c b/plugins/project-wizard/header.c
index 6fa0cd7..9101101 100644
--- a/plugins/project-wizard/header.c
+++ b/plugins/project-wizard/header.c
@@ -155,27 +155,14 @@ npw_header_check_required_programs (NPWHeader* self)
 	{
 		if (!anjuta_util_prog_is_installed (node->data, FALSE))
 		{
-			failed_programs = g_list_prepend (failed_programs, node->data);
+			const gchar *const prog = (const gchar *) node->data;
+			failed_programs = g_list_prepend (failed_programs,
+											  g_strdup (prog));
 		}
 	}
 	return failed_programs;
 }
 
-static gboolean
-package_is_installed (const gchar *package)
-{
-	int status;
-	int exit_status;
-	pid_t pid;
-	if ((pid = fork()) == 0)
-	{
-		execlp ("pkg-config", "pkg-config", "--exists", package, NULL);
-	}
-	waitpid (pid, &status, 0);
-	exit_status = WEXITSTATUS (status);
-	return (exit_status == 0);
-}
-
 GList*
 npw_header_check_required_packages (NPWHeader* self)
 {
@@ -183,9 +170,11 @@ npw_header_check_required_packages (NPWHeader* self)
 	GList *failed_packages = NULL;
 	for (node = self->required_packages; node; node = g_list_next (node))
 	{
-		if (!package_is_installed (node->data))
+		if (!anjuta_util_package_is_installed (node->data, FALSE))
 		{
-			failed_packages = g_list_prepend (failed_packages, node->data);
+			const gchar *const pkg = (const gchar *) node->data;
+			failed_packages = g_list_prepend (failed_packages,
+											  g_strdup (pkg));
 		}
 	}
 	return failed_packages;



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