ostree: Split up "remote" subcommands

To make room for "remote gpg-import", which will be non-trivial.
ot-builtin-remote.c was already a little too crowded anyway.

Also while we're at it, port this bit of code away from libgsystem.
This commit is contained in:
Matthew Barnes 2015-04-29 11:09:40 -04:00
parent ca63fab6b1
commit e7246e6d64
7 changed files with 382 additions and 240 deletions

View File

@ -72,6 +72,15 @@ ostree_SOURCES += \
src/ostree/ot-admin-functions.c \
$(NULL)
# Remote subcommand
ostree_SOURCES += \
src/ostree/ot-remote-builtins.h \
src/ostree/ot-remote-builtin-add.c \
src/ostree/ot-remote-builtin-delete.c \
src/ostree/ot-remote-builtin-list.c \
src/ostree/ot-remote-builtin-show-url.c \
$(NULL)
ostree_bin_shared_cflags = $(AM_CFLAGS) -I$(srcdir)/src/libotutil -I$(srcdir)/src/libostree -I$(srcdir)/src/ostree \
$(NULL)
ostree_bin_shared_ldadd = libglnx.la libbsdiff.la libotutil.la libostree-kernel-args.la libostree-1.la

View File

@ -24,240 +24,7 @@
#include "ot-main.h"
#include "ot-builtins.h"
#include "ostree.h"
#include "ot-tool-util.h"
#include "otutil.h"
static void
usage_error (GOptionContext *context, const char *message, GError **error)
{
gs_free gchar *help = g_option_context_get_help (context, TRUE, NULL);
g_printerr ("%s", help);
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, message);
}
static char **opt_set;
static gboolean opt_no_gpg_verify;
static gboolean opt_if_not_exists;
static GOptionEntry add_option_entries[] = {
{ "set", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_set, "Set config option KEY=VALUE for remote", "KEY=VALUE" },
{ "no-gpg-verify", 0, 0, G_OPTION_ARG_NONE, &opt_no_gpg_verify, "Disable GPG verification", NULL },
{ "if-not-exists", 0, 0, G_OPTION_ARG_NONE, &opt_if_not_exists, "Do nothing if the provided remote exists", NULL },
{ NULL }
};
static gboolean
ostree_remote_builtin_add (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gs_unref_object OstreeRepo *repo = NULL;
const char *remote_name;
const char *remote_url;
char **iter;
gs_free char *target_name = NULL;
gs_unref_object GFile *target_conf = NULL;
gs_unref_variant_builder GVariantBuilder *optbuilder = NULL;
gboolean ret = FALSE;
context = g_option_context_new ("NAME URL [BRANCH...] - Add a remote repository");
if (!ostree_option_context_parse (context, add_option_entries, &argc, &argv,
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
goto out;
if (argc < 3)
{
usage_error (context, "NAME and URL must be specified", error);
goto out;
}
remote_name = argv[1];
remote_url = argv[2];
optbuilder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
if (argc > 3)
{
gs_unref_ptrarray GPtrArray *branchesp = g_ptr_array_new ();
int i;
for (i = 3; i < argc; i++)
g_ptr_array_add (branchesp, argv[i]);
g_ptr_array_add (branchesp, NULL);
g_variant_builder_add (optbuilder, "{s@v}",
"branches",
g_variant_new_variant (g_variant_new_strv ((const char*const*)branchesp->pdata, -1)));
}
for (iter = opt_set; iter && *iter; iter++)
{
const char *keyvalue = *iter;
gs_free char *subkey = NULL;
gs_free char *subvalue = NULL;
if (!ot_parse_keyvalue (keyvalue, &subkey, &subvalue, error))
goto out;
g_variant_builder_add (optbuilder, "{s@v}",
subkey, g_variant_new_variant (g_variant_new_string (subvalue)));
}
if (opt_no_gpg_verify)
g_variant_builder_add (optbuilder, "{s@v}",
"gpg-verify",
g_variant_new_variant (g_variant_new_boolean (FALSE)));
if (!ostree_repo_remote_change (repo, NULL,
opt_if_not_exists ? OSTREE_REPO_REMOTE_CHANGE_ADD_IF_NOT_EXISTS :
OSTREE_REPO_REMOTE_CHANGE_ADD,
remote_name, remote_url,
g_variant_builder_end (optbuilder),
cancellable, error))
goto out;
ret = TRUE;
out:
g_option_context_free (context);
return ret;
}
gboolean opt_if_exists = FALSE;
static GOptionEntry delete_option_entries[] = {
{ "if-exists", 0, 0, G_OPTION_ARG_NONE, &opt_if_exists, "Do nothing if the provided remote does not exist", NULL },
{ NULL }
};
static gboolean
ostree_remote_builtin_delete (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gs_unref_object OstreeRepo *repo = NULL;
const char *remote_name;
gboolean ret = FALSE;
context = g_option_context_new ("NAME - Delete a remote repository");
if (!ostree_option_context_parse (context, delete_option_entries, &argc, &argv,
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
goto out;
if (argc < 2)
{
usage_error (context, "NAME must be specified", error);
goto out;
}
remote_name = argv[1];
if (!ostree_repo_remote_change (repo, NULL,
opt_if_exists ? OSTREE_REPO_REMOTE_CHANGE_DELETE_IF_EXISTS :
OSTREE_REPO_REMOTE_CHANGE_DELETE,
remote_name, NULL, NULL,
cancellable, error))
goto out;
ret = TRUE;
out:
g_option_context_free (context);
return ret;
}
static GOptionEntry show_url_option_entries[] = {
{ NULL }
};
static gboolean
ostree_remote_builtin_show_url (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gs_unref_object OstreeRepo *repo = NULL;
const char *remote_name;
gs_free char *remote_url = NULL;
gboolean ret = FALSE;
context = g_option_context_new ("NAME - Show remote repository URL");
if (!ostree_option_context_parse (context, show_url_option_entries, &argc, &argv,
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
goto out;
if (argc < 2)
{
usage_error (context, "NAME must be specified", error);
goto out;
}
remote_name = argv[1];
if (ostree_repo_remote_get_url (repo, remote_name, &remote_url, error))
{
g_print ("%s\n", remote_url);
ret = TRUE;
}
out:
return ret;
}
static gboolean opt_show_urls;
static GOptionEntry list_option_entries[] = {
{ "show-urls", 'u', 0, G_OPTION_ARG_NONE, &opt_show_urls, "Show remote URLs in list", NULL },
{ NULL }
};
static gboolean
ostree_remote_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gs_unref_object OstreeRepo *repo = NULL;
gs_strfreev char **remotes = NULL;
guint ii, n_remotes = 0;
gboolean ret = FALSE;
context = g_option_context_new ("- List remote repository names");
if (!ostree_option_context_parse (context, list_option_entries, &argc, &argv,
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
goto out;
remotes = ostree_repo_remote_list (repo, &n_remotes);
if (opt_show_urls)
{
int max_length = 0;
for (ii = 0; ii < n_remotes; ii++)
max_length = MAX (max_length, strlen (remotes[ii]));
for (ii = 0; ii < n_remotes; ii++)
{
gs_free char *remote_url = NULL;
if (!ostree_repo_remote_get_url (repo, remotes[ii], &remote_url, error))
goto out;
g_print ("%-*s %s\n", max_length, remotes[ii], remote_url);
}
}
else
{
for (ii = 0; ii < n_remotes; ii++)
g_print ("%s\n", remotes[ii]);
}
ret = TRUE;
out:
g_option_context_free (context);
return ret;
}
#include "ot-remote-builtins.h"
typedef struct {
const char *name;
@ -265,10 +32,10 @@ typedef struct {
} OstreeRemoteCommand;
static OstreeRemoteCommand remote_subcommands[] = {
{ "add", ostree_remote_builtin_add },
{ "delete", ostree_remote_builtin_delete },
{ "show-url", ostree_remote_builtin_show_url },
{ "list", ostree_remote_builtin_list },
{ "add", ot_remote_builtin_add },
{ "delete", ot_remote_builtin_delete },
{ "show-url", ot_remote_builtin_show_url },
{ "list", ot_remote_builtin_list },
{ NULL, NULL }
};
@ -301,7 +68,7 @@ ostree_builtin_remote (int argc, char **argv, GCancellable *cancellable, GError
{
OstreeRemoteCommand *subcommand;
const char *subcommand_name = NULL;
gs_free char *prgname = NULL;
g_autofree char *prgname = NULL;
gboolean ret = FALSE;
int in, out;
@ -339,7 +106,7 @@ ostree_builtin_remote (int argc, char **argv, GCancellable *cancellable, GError
if (!subcommand->name)
{
GOptionContext *context;
gs_free char *help;
g_autofree char *help;
context = remote_option_context_new_with_commands ();

View File

@ -0,0 +1,117 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <libglnx.h>
#include "otutil.h"
#include "ot-tool-util.h"
#include "ot-main.h"
#include "ot-remote-builtins.h"
static char **opt_set;
static gboolean opt_no_gpg_verify;
static gboolean opt_if_not_exists;
static GOptionEntry option_entries[] = {
{ "set", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_set, "Set config option KEY=VALUE for remote", "KEY=VALUE" },
{ "no-gpg-verify", 0, 0, G_OPTION_ARG_NONE, &opt_no_gpg_verify, "Disable GPG verification", NULL },
{ "if-not-exists", 0, 0, G_OPTION_ARG_NONE, &opt_if_not_exists, "Do nothing if the provided remote exists", NULL },
{ NULL }
};
gboolean
ot_remote_builtin_add (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
glnx_unref_object OstreeRepo *repo = NULL;
const char *remote_name;
const char *remote_url;
char **iter;
g_autofree char *target_name = NULL;
glnx_unref_object GFile *target_conf = NULL;
g_autoptr(GVariantBuilder) optbuilder = NULL;
gboolean ret = FALSE;
context = g_option_context_new ("NAME URL [BRANCH...] - Add a remote repository");
if (!ostree_option_context_parse (context, option_entries, &argc, &argv,
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
goto out;
if (argc < 3)
{
ot_util_usage_error (context, "NAME and URL must be specified", error);
goto out;
}
remote_name = argv[1];
remote_url = argv[2];
optbuilder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
if (argc > 3)
{
g_autoptr(GPtrArray) branchesp = g_ptr_array_new ();
int i;
for (i = 3; i < argc; i++)
g_ptr_array_add (branchesp, argv[i]);
g_ptr_array_add (branchesp, NULL);
g_variant_builder_add (optbuilder, "{s@v}",
"branches",
g_variant_new_variant (g_variant_new_strv ((const char*const*)branchesp->pdata, -1)));
}
for (iter = opt_set; iter && *iter; iter++)
{
const char *keyvalue = *iter;
g_autofree char *subkey = NULL;
g_autofree char *subvalue = NULL;
if (!ot_parse_keyvalue (keyvalue, &subkey, &subvalue, error))
goto out;
g_variant_builder_add (optbuilder, "{s@v}",
subkey, g_variant_new_variant (g_variant_new_string (subvalue)));
}
if (opt_no_gpg_verify)
g_variant_builder_add (optbuilder, "{s@v}",
"gpg-verify",
g_variant_new_variant (g_variant_new_boolean (FALSE)));
if (!ostree_repo_remote_change (repo, NULL,
opt_if_not_exists ? OSTREE_REPO_REMOTE_CHANGE_ADD_IF_NOT_EXISTS :
OSTREE_REPO_REMOTE_CHANGE_ADD,
remote_name, remote_url,
g_variant_builder_end (optbuilder),
cancellable, error))
goto out;
ret = TRUE;
out:
g_option_context_free (context);
return ret;
}

View File

@ -0,0 +1,71 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <libglnx.h>
#include "otutil.h"
#include "ot-main.h"
#include "ot-remote-builtins.h"
gboolean opt_if_exists = FALSE;
static GOptionEntry option_entries[] = {
{ "if-exists", 0, 0, G_OPTION_ARG_NONE, &opt_if_exists, "Do nothing if the provided remote does not exist", NULL },
{ NULL }
};
gboolean
ot_remote_builtin_delete (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
glnx_unref_object OstreeRepo *repo = NULL;
const char *remote_name;
gboolean ret = FALSE;
context = g_option_context_new ("NAME - Delete a remote repository");
if (!ostree_option_context_parse (context, option_entries, &argc, &argv,
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
goto out;
if (argc < 2)
{
ot_util_usage_error (context, "NAME must be specified", error);
goto out;
}
remote_name = argv[1];
if (!ostree_repo_remote_change (repo, NULL,
opt_if_exists ? OSTREE_REPO_REMOTE_CHANGE_DELETE_IF_EXISTS :
OSTREE_REPO_REMOTE_CHANGE_DELETE,
remote_name, NULL, NULL,
cancellable, error))
goto out;
ret = TRUE;
out:
g_option_context_free (context);
return ret;
}

View File

@ -0,0 +1,81 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <libglnx.h>
#include "ot-main.h"
#include "ot-remote-builtins.h"
static gboolean opt_show_urls;
static GOptionEntry option_entries[] = {
{ "show-urls", 'u', 0, G_OPTION_ARG_NONE, &opt_show_urls, "Show remote URLs in list", NULL },
{ NULL }
};
gboolean
ot_remote_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
glnx_unref_object OstreeRepo *repo = NULL;
g_auto(GStrv) remotes = NULL;
guint ii, n_remotes = 0;
gboolean ret = FALSE;
context = g_option_context_new ("- List remote repository names");
if (!ostree_option_context_parse (context, option_entries, &argc, &argv,
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
goto out;
remotes = ostree_repo_remote_list (repo, &n_remotes);
if (opt_show_urls)
{
int max_length = 0;
for (ii = 0; ii < n_remotes; ii++)
max_length = MAX (max_length, strlen (remotes[ii]));
for (ii = 0; ii < n_remotes; ii++)
{
g_autofree char *remote_url = NULL;
if (!ostree_repo_remote_get_url (repo, remotes[ii], &remote_url, error))
goto out;
g_print ("%-*s %s\n", max_length, remotes[ii], remote_url);
}
}
else
{
for (ii = 0; ii < n_remotes; ii++)
g_print ("%s\n", remotes[ii]);
}
ret = TRUE;
out:
g_option_context_free (context);
return ret;
}

View File

@ -0,0 +1,65 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <libglnx.h>
#include "otutil.h"
#include "ot-main.h"
#include "ot-remote-builtins.h"
static GOptionEntry option_entries[] = {
{ NULL }
};
gboolean
ot_remote_builtin_show_url (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
glnx_unref_object OstreeRepo *repo = NULL;
const char *remote_name;
g_autofree char *remote_url = NULL;
gboolean ret = FALSE;
context = g_option_context_new ("NAME - Show remote repository URL");
if (!ostree_option_context_parse (context, option_entries, &argc, &argv,
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
goto out;
if (argc < 2)
{
ot_util_usage_error (context, "NAME must be specified", error);
goto out;
}
remote_name = argv[1];
if (ostree_repo_remote_get_url (repo, remote_name, &remote_url, error))
{
g_print ("%s\n", remote_url);
ret = TRUE;
}
out:
return ret;
}

View File

@ -0,0 +1,32 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#pragma once
#include <ostree.h>
G_BEGIN_DECLS
gboolean ot_remote_builtin_add (int argc, char **argv, GCancellable *cancellable, GError **error);
gboolean ot_remote_builtin_delete (int argc, char **argv, GCancellable *cancellable, GError **error);
gboolean ot_remote_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error);
gboolean ot_remote_builtin_show_url (int argc, char **argv, GCancellable *cancellable, GError **error);
G_END_DECLS