diff --git a/Makefile-src.am b/Makefile-src.am index bdc10484..9990ecdc 100644 --- a/Makefile-src.am +++ b/Makefile-src.am @@ -54,6 +54,7 @@ ostree_SOURCES = src/main.c \ src/ot-builtin-link-file.c \ src/ot-builtin-log.c \ src/ot-builtin-run-triggers.c \ + src/ot-builtin-remote.c \ src/ot-builtin-rev-parse.c \ src/ot-builtin-show.c \ $(NULL) diff --git a/src/main.c b/src/main.c index 3bf9824c..f32e741b 100644 --- a/src/main.c +++ b/src/main.c @@ -34,7 +34,9 @@ static OstreeBuiltin builtins[] = { { "link-file", ostree_builtin_link_file, 0 }, { "log", ostree_builtin_log, 0 }, { "fsck", ostree_builtin_fsck, 0 }, + { "remote", ostree_builtin_remote, 0 }, { "rev-parse", ostree_builtin_rev_parse, 0 }, + { "remote", ostree_builtin_remote, 0 }, { "run-triggers", ostree_builtin_run_triggers, 0 }, { "show", ostree_builtin_show, 0 }, { NULL } diff --git a/src/ot-builtin-remote.c b/src/ot-builtin-remote.c new file mode 100644 index 00000000..f26d683a --- /dev/null +++ b/src/ot-builtin-remote.c @@ -0,0 +1,117 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2011 Colin Walters + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Author: Colin Walters + */ + +#include "config.h" + +#include "ot-builtins.h" +#include "ostree.h" + +#include + +static char *repo_path; + +static GOptionEntry options[] = { + { "repo", 0, 0, G_OPTION_ARG_FILENAME, &repo_path, "Repository path", "repo" }, + { NULL } +}; + +static void +usage_error (GOptionContext *context, const char *message, GError **error) +{ + gchar *help = g_option_context_get_help (context, TRUE, NULL); + g_printerr ("%s\n", help); + g_free (help); + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + message); +} + +gboolean +ostree_builtin_remote (int argc, char **argv, const char *prefix, GError **error) +{ + GOptionContext *context; + gboolean ret = FALSE; + OstreeRepo *repo = NULL; + OstreeCheckout *checkout = NULL; + const char *op; + gsize len; + char *config_path = NULL; + char *data = NULL; + GKeyFile *config = NULL; + + context = g_option_context_new ("OPERATION [args] - Control remote repository configuration"); + g_option_context_add_main_entries (context, options, NULL); + + if (!g_option_context_parse (context, &argc, &argv, error)) + goto out; + + if (repo_path == NULL) + repo_path = "."; + + repo = ostree_repo_new (repo_path); + if (!ostree_repo_check (repo, error)) + goto out; + + if (argc < 2) + { + usage_error (context, "OPERATION must be specified", error); + goto out; + } + + op = argv[1]; + + config = g_key_file_new (); + config_path = g_build_filename (repo_path, "config", NULL); + if (!g_key_file_load_from_file (config, config_path, 0, error)) + goto out; + + if (!strcmp (op, "add")) + { + char *key; + if (argc < 4) + { + usage_error (context, "NAME and URL must be specified", error); + goto out; + } + key = g_strdup_printf ("remote \"%s\"", argv[2]); + g_key_file_set_string (config, key, "url", argv[3]); + } + else + { + usage_error (context, "Unknown operation", error); + goto out; + } + + data = g_key_file_to_data (config, &len, error); + if (!g_file_set_contents (config_path, data, len, error)) + goto out; + + ret = TRUE; + out: + if (context) + g_option_context_free (context); + if (config) + g_key_file_unref (config); + g_free (data); + g_free (config_path); + g_clear_object (&repo); + g_clear_object (&checkout); + return ret; +} diff --git a/src/ot-builtins.h b/src/ot-builtins.h index e4d6d911..1da3db9b 100644 --- a/src/ot-builtins.h +++ b/src/ot-builtins.h @@ -45,6 +45,7 @@ gboolean ostree_builtin_run_triggers (int argc, char **argv, const char *prefix, gboolean ostree_builtin_fsck (int argc, char **argv, const char *prefix, GError **error); gboolean ostree_builtin_show (int argc, char **argv, const char *prefix, GError **error); gboolean ostree_builtin_rev_parse (int argc, char **argv, const char *prefix, GError **error); +gboolean ostree_builtin_remote (int argc, char **argv, const char *prefix, GError **error); G_END_DECLS diff --git a/tests/t0011-remote-add.sh b/tests/t0011-remote-add.sh new file mode 100755 index 00000000..491b2b75 --- /dev/null +++ b/tests/t0011-remote-add.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# Copyright (C) 2011 Colin Walters +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Author: Colin Walters + +set -e + +. libtest.sh + +echo '1..2' + +setup_test_repository2 +ostree remote add $ot_repo origin http://example.com/ostree/gnome +echo "ok remote add" +assert_file_has_content $test_tmpdir/repo/config "example.com" +echo "ok config"