int ostree_run (int argc, char **argv, OstreeCommand *commands, GError **res_error) { OstreeCommand *command; GError *error = NULL; GCancellable *cancellable = NULL; const char *command_name = NULL; gboolean success = FALSE; int in, out; /* avoid gvfs (http://bugzilla.gnome.org/show_bug.cgi?id=526454) */ g_setenv ("GIO_USE_VFS", "local", TRUE); g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, message_handler, NULL); /* * Parse the global options. We rearrange the options as * necessary, in order to pass relevant options through * to the commands, but also have them take effect globally. */ for (in = 1, out = 1; in < argc; in++, out++) { /* The non-option is the command, take it out of the arguments */ if (argv[in][0] != '-') { if (command_name == NULL) { command_name = argv[in]; out--; continue; } } else if (g_str_equal (argv[in], "--")) { break; } argv[out] = argv[in]; } argc = out; command = commands; while (command->name) { if (g_strcmp0 (command_name, command->name) == 0) break; command++; } if (!command->fn) { g_autoptr(GOptionContext) context = NULL; g_autofree char *help; context = ostree_option_context_new_with_commands (commands); /* This will not return for some options (e.g. --version). */ if (ostree_option_context_parse (context, NULL, &argc, &argv, OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, &error)) { if (command_name == NULL) { g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_FAILED, "No command specified"); } else { g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED, "Unknown command '%s'", command_name); ostree_usage (commands, TRUE); } } help = g_option_context_get_help (context, FALSE, NULL); g_printerr ("%s", help); goto out; } if (!command->fn (argc, argv, cancellable, &error)) goto out; success = TRUE; out: g_assert (success || error); if (error) { g_propagate_error (res_error, error); return 1; } return 0; }
gboolean ostree_builtin_static_delta (int argc, char **argv, GCancellable *cancellable, GError **error) { gboolean ret = FALSE; OstreeCommand *command = NULL; const char *cmdname = NULL; glnx_unref_object OstreeRepo *repo = NULL; int i; gboolean want_help = FALSE; for (i = 1; i < argc; i++) { if (argv[i][0] != '-') { cmdname = argv[i]; break; } else if (g_str_equal (argv[i], "--help") || g_str_equal (argv[i], "-h")) { want_help = TRUE; break; } } if (!cmdname && !want_help) { static_delta_usage (argv, TRUE); g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "No command specified"); goto out; } if (cmdname) { command = static_delta_subcommands; while (command->name) { if (g_strcmp0 (cmdname, command->name) == 0) break; command++; } } if (want_help && command == NULL) { static_delta_usage (argv, FALSE); ret = TRUE; goto out; } if (!command->fn) { g_autofree char *msg = g_strdup_printf ("Unknown command '%s'", cmdname); static_delta_usage (argv, TRUE); g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, msg); goto out; } if (!command->fn (argc, argv, cancellable, error)) goto out; ret = TRUE; out: return ret; }