int main (int argc, char **argv) { AsProfile *profile = NULL; GOptionContext *context; gboolean prefer_local = FALSE; gboolean ret; gboolean show_results = FALSE; gboolean verbose = FALSE; guint64 refine_flags = GS_PLUGIN_REFINE_FLAGS_DEFAULT; gint i; guint cache_age = 0; gint repeat = 1; int status = 0; g_auto(GStrv) plugin_blacklist = NULL; g_auto(GStrv) plugin_whitelist = NULL; g_autoptr(GError) error = NULL; g_autoptr(GsAppList) list = NULL; g_autoptr(GPtrArray) categories = NULL; g_autoptr(GsDebug) debug = gs_debug_new (); g_autofree gchar *plugin_blacklist_str = NULL; g_autofree gchar *plugin_whitelist_str = NULL; g_autofree gchar *refine_flags_str = NULL; g_autoptr(GsApp) app = NULL; g_autoptr(GFile) file = NULL; g_autoptr(GsPluginLoader) plugin_loader = NULL; g_autoptr(AsProfileTask) ptask = NULL; const GOptionEntry options[] = { { "show-results", '\0', 0, G_OPTION_ARG_NONE, &show_results, "Show the results for the action", NULL }, { "refine-flags", '\0', 0, G_OPTION_ARG_STRING, &refine_flags_str, "Set any refine flags required for the action", NULL }, { "repeat", '\0', 0, G_OPTION_ARG_INT, &repeat, "Repeat the action this number of times", NULL }, { "cache-age", '\0', 0, G_OPTION_ARG_INT, &cache_age, "Use this maximum cache age in seconds", NULL }, { "prefer-local", '\0', 0, G_OPTION_ARG_NONE, &prefer_local, "Prefer local file sources to AppStream", NULL }, { "plugin-blacklist", '\0', 0, G_OPTION_ARG_STRING, &plugin_blacklist_str, "Do not load specific plugins", NULL }, { "plugin-whitelist", '\0', 0, G_OPTION_ARG_STRING, &plugin_whitelist_str, "Only load specific plugins", NULL }, { "verbose", '\0', 0, G_OPTION_ARG_NONE, &verbose, "Show verbose debugging information", NULL }, { NULL} }; setlocale (LC_ALL, ""); g_setenv ("G_MESSAGES_DEBUG", "all", TRUE); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); gtk_init (&argc, &argv); context = g_option_context_new (NULL); g_option_context_set_summary (context, "GNOME Software Test Program"); g_option_context_add_main_entries (context, options, NULL); g_option_context_add_group (context, gtk_get_option_group (TRUE)); ret = g_option_context_parse (context, &argc, &argv, &error); if (!ret) { g_print ("Failed to parse options: %s\n", error->message); goto out; } if (verbose) g_setenv ("GS_DEBUG", "1", TRUE); /* prefer local sources */ if (prefer_local) g_setenv ("GNOME_SOFTWARE_PREFER_LOCAL", "true", TRUE); /* parse any refine flags */ refine_flags = gs_cmd_parse_refine_flags (refine_flags_str, &error); if (refine_flags == G_MAXUINT64) { g_print ("Flag unknown: %s\n", error->message); goto out; } /* load plugins */ plugin_loader = gs_plugin_loader_new (); profile = gs_plugin_loader_get_profile (plugin_loader); ptask = as_profile_start_literal (profile, "GsCmd"); g_assert (ptask != NULL); if (g_file_test (LOCALPLUGINDIR, G_FILE_TEST_EXISTS)) gs_plugin_loader_set_location (plugin_loader, LOCALPLUGINDIR); if (plugin_whitelist_str != NULL) plugin_whitelist = g_strsplit (plugin_whitelist_str, ",", -1); if (plugin_blacklist_str != NULL) plugin_blacklist = g_strsplit (plugin_blacklist_str, ",", -1); ret = gs_plugin_loader_setup (plugin_loader, plugin_whitelist, plugin_blacklist, GS_PLUGIN_FAILURE_FLAGS_NONE, NULL, &error); if (!ret) { g_print ("Failed to setup plugins: %s\n", error->message); goto out; } gs_plugin_loader_dump_state (plugin_loader); /* do action */ if (argc == 2 && g_strcmp0 (argv[1], "installed") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) g_object_unref (list); list = gs_plugin_loader_get_installed (plugin_loader, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 3 && g_strcmp0 (argv[1], "search") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) g_object_unref (list); list = gs_plugin_loader_search (plugin_loader, argv[2], refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 3 && g_strcmp0 (argv[1], "action-upgrade-download") == 0) { app = gs_app_new (argv[2]); gs_app_set_kind (app, AS_APP_KIND_OS_UPGRADE); ret = gs_plugin_loader_app_action (plugin_loader, app, GS_PLUGIN_ACTION_UPGRADE_DOWNLOAD, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (ret) gs_app_list_add (list, app); } else if (argc == 3 && g_strcmp0 (argv[1], "refine") == 0) { app = gs_app_new (argv[2]); for (i = 0; i < repeat; i++) { ret = gs_plugin_loader_app_refine (plugin_loader, app, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (!ret) break; } list = gs_app_list_new (); gs_app_list_add (list, app); } else if (argc == 3 && g_strcmp0 (argv[1], "launch") == 0) { app = gs_app_new (argv[2]); for (i = 0; i < repeat; i++) { ret = gs_plugin_loader_app_action (plugin_loader, app, GS_PLUGIN_ACTION_LAUNCH, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (!ret) break; } } else if (argc == 3 && g_strcmp0 (argv[1], "filename-to-app") == 0) { file = g_file_new_for_path (argv[2]); app = gs_plugin_loader_file_to_app (plugin_loader, file, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (app == NULL) { ret = FALSE; } else { list = gs_app_list_new (); gs_app_list_add (list, app); } } else if (argc == 2 && g_strcmp0 (argv[1], "updates") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) g_object_unref (list); list = gs_plugin_loader_get_updates (plugin_loader, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 2 && g_strcmp0 (argv[1], "upgrades") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) g_object_unref (list); list = gs_plugin_loader_get_distro_upgrades (plugin_loader, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 2 && g_strcmp0 (argv[1], "sources") == 0) { list = gs_plugin_loader_get_sources (plugin_loader, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (list == NULL) ret = FALSE; } else if (argc == 2 && g_strcmp0 (argv[1], "popular") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) g_object_unref (list); list = gs_plugin_loader_get_popular (plugin_loader, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 2 && g_strcmp0 (argv[1], "featured") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) g_object_unref (list); list = gs_plugin_loader_get_featured (plugin_loader, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 2 && g_strcmp0 (argv[1], "get-categories") == 0) { for (i = 0; i < repeat; i++) { if (categories != NULL) g_ptr_array_unref (categories); categories = gs_plugin_loader_get_categories (plugin_loader, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (categories == NULL) { ret = FALSE; break; } } } else if (argc == 3 && g_strcmp0 (argv[1], "get-category-apps") == 0) { g_autoptr(GsCategory) category = NULL; g_autoptr(GsCategory) parent = NULL; g_auto(GStrv) split = NULL; split = g_strsplit (argv[2], "/", 2); if (g_strv_length (split) == 1) { category = gs_category_new (split[0]); } else { parent = gs_category_new (split[0]); category = gs_category_new (split[1]); gs_category_add_child (parent, category); } for (i = 0; i < repeat; i++) { if (list != NULL) g_object_unref (list); list = gs_plugin_loader_get_category_apps (plugin_loader, category, refine_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc >= 2 && g_strcmp0 (argv[1], "refresh") == 0) { GsPluginRefreshFlags refresh_flags; refresh_flags = gs_cmd_refresh_flag_from_string (argv[2]); ret = gs_plugin_loader_refresh (plugin_loader, cache_age, refresh_flags, GS_PLUGIN_FAILURE_FLAGS_FATAL_ANY, NULL, &error); } else { ret = FALSE; g_set_error_literal (&error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "Did not recognise option, use 'installed', " "'updates', 'popular', 'get-categories', " "'get-category-apps', 'filename-to-app', " "'sources', 'refresh', 'launch' or 'search'"); } if (!ret) { g_print ("Failed: %s\n", error->message); goto out; } if (show_results) { if (list != NULL) gs_cmd_show_results_apps (list); if (categories != NULL) gs_cmd_show_results_categories (categories); } out: if (profile != NULL) as_profile_dump (profile); g_option_context_free (context); return status; }
int main (int argc, char **argv) { GList *list = NULL; GList *categories = NULL; GOptionContext *context; gboolean prefer_local = FALSE; gboolean ret; gboolean show_results = FALSE; guint64 refine_flags = GS_PLUGIN_REFINE_FLAGS_DEFAULT; gint i; gint repeat = 1; int status = 0; _cleanup_error_free_ GError *error = NULL; _cleanup_free_ gchar *refine_flags_str = NULL; _cleanup_object_unref_ GsApp *app = NULL; _cleanup_object_unref_ GsPluginLoader *plugin_loader = NULL; _cleanup_object_unref_ GsProfile *profile = NULL; const GOptionEntry options[] = { { "show-results", '\0', 0, G_OPTION_ARG_NONE, &show_results, "Show the results for the action", NULL }, { "refine-flags", '\0', 0, G_OPTION_ARG_STRING, &refine_flags_str, "Set any refine flags required for the action", NULL }, { "repeat", '\0', 0, G_OPTION_ARG_INT, &repeat, "Repeat the action this number of times", NULL }, { "prefer-local", '\0', 0, G_OPTION_ARG_NONE, &prefer_local, "Prefer local file sources to AppStream", NULL }, { NULL} }; setlocale (LC_ALL, ""); g_setenv ("G_MESSAGES_DEBUG", "all", TRUE); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); gtk_init (&argc, &argv); context = g_option_context_new (NULL); g_option_context_set_summary (context, "GNOME Software Test Program"); g_option_context_add_main_entries (context, options, NULL); g_option_context_add_group (context, gtk_get_option_group (TRUE)); ret = g_option_context_parse (context, &argc, &argv, &error); if (!ret) { g_print ("Failed to parse options: %s\n", error->message); goto out; } /* prefer local sources */ if (prefer_local) g_setenv ("GNOME_SOFTWARE_PREFER_LOCAL", "true", TRUE); /* parse any refine flags */ refine_flags = gs_cmd_parse_refine_flags (refine_flags_str, &error); if (refine_flags == G_MAXUINT64) { g_print ("Flag unknown: %s\n", error->message); goto out; } profile = gs_profile_new (); gs_profile_start (profile, "GsCmd"); /* load plugins */ plugin_loader = gs_plugin_loader_new (); gs_plugin_loader_set_location (plugin_loader, "./plugins/.libs"); ret = gs_plugin_loader_setup (plugin_loader, &error); if (!ret) { g_print ("Failed to setup plugins: %s\n", error->message); goto out; } gs_plugin_loader_dump_state (plugin_loader); /* do action */ if (argc == 2 && g_strcmp0 (argv[1], "installed") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) gs_plugin_list_free (list); list = gs_plugin_loader_get_installed (plugin_loader, refine_flags, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 3 && g_strcmp0 (argv[1], "search") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) gs_plugin_list_free (list); list = gs_plugin_loader_search (plugin_loader, argv[2], refine_flags, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 3 && g_strcmp0 (argv[1], "refine") == 0) { app = gs_app_new (argv[2]); for (i = 0; i < repeat; i++) { ret = gs_plugin_loader_app_refine (plugin_loader, app, refine_flags, NULL, &error); if (!ret) break; } } else if (argc == 3 && g_strcmp0 (argv[1], "filename-to-app") == 0) { app = gs_plugin_loader_filename_to_app (plugin_loader, argv[2], refine_flags, NULL, &error); if (app == NULL) { ret = FALSE; } else { gs_plugin_add_app (&list, app); } } else if (argc == 2 && g_strcmp0 (argv[1], "updates") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) gs_plugin_list_free (list); list = gs_plugin_loader_get_updates (plugin_loader, refine_flags, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 2 && g_strcmp0 (argv[1], "sources") == 0) { list = gs_plugin_loader_get_sources (plugin_loader, refine_flags, NULL, &error); if (list == NULL) ret = FALSE; } else if (argc == 2 && g_strcmp0 (argv[1], "popular") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) gs_plugin_list_free (list); list = gs_plugin_loader_get_popular (plugin_loader, refine_flags, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 2 && g_strcmp0 (argv[1], "featured") == 0) { for (i = 0; i < repeat; i++) { if (list != NULL) gs_plugin_list_free (list); list = gs_plugin_loader_get_featured (plugin_loader, refine_flags, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 2 && g_strcmp0 (argv[1], "get-categories") == 0) { for (i = 0; i < repeat; i++) { if (categories != NULL) gs_plugin_list_free (categories); categories = gs_plugin_loader_get_categories (plugin_loader, refine_flags, NULL, &error); if (categories == NULL) { ret = FALSE; break; } } } else if (argc == 3 && g_strcmp0 (argv[1], "get-category-apps") == 0) { _cleanup_object_unref_ GsCategory *category = NULL; _cleanup_strv_free_ gchar **split = NULL; split = g_strsplit (argv[2], "/", 2); if (g_strv_length (split) == 1) { category = gs_category_new (NULL, split[0], NULL); } else { _cleanup_object_unref_ GsCategory *parent = NULL; parent = gs_category_new (NULL, split[0], NULL); category = gs_category_new (parent, split[1], NULL); } for (i = 0; i < repeat; i++) { if (list != NULL) gs_plugin_list_free (list); list = gs_plugin_loader_get_category_apps (plugin_loader, category, refine_flags, NULL, &error); if (list == NULL) { ret = FALSE; break; } } } else if (argc == 2 && g_strcmp0 (argv[1], "refresh") == 0) { ret = gs_plugin_loader_refresh (plugin_loader, 0, GS_PLUGIN_REFRESH_FLAGS_UPDATES, NULL, &error); } else { ret = FALSE; g_set_error_literal (&error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "Did not recognise option, use 'installed', " "'updates', 'popular', 'get-categories', " "'get-category-apps', 'filename-to-app', " "'sources', 'refresh' or 'search'"); } if (!ret) { g_print ("Failed: %s\n", error->message); goto out; } if (show_results) { gs_cmd_show_results_apps (list); gs_cmd_show_results_categories (categories); } out: gs_profile_stop (profile, "GsCmd"); gs_profile_dump (profile); g_option_context_free (context); gs_plugin_list_free (list); gs_plugin_list_free (categories); return status; }