diff --git a/Makefile-ostree.am b/Makefile-ostree.am index 10171c44..1f7ab0eb 100644 --- a/Makefile-ostree.am +++ b/Makefile-ostree.am @@ -38,6 +38,7 @@ ostree_SOURCES = src/ostree/main.c \ src/ostree/ot-builtin-unpack.c \ src/ostree/ot-builtin-rev-parse.c \ src/ostree/ot-builtin-show.c \ + src/ostree/ot-builtin-write-refs.c \ src/ostree/ot-main.h \ src/ostree/ot-main.c \ $(NULL) diff --git a/src/ostree/main.c b/src/ostree/main.c index 365ae770..e1218f0e 100644 --- a/src/ostree/main.c +++ b/src/ostree/main.c @@ -48,6 +48,7 @@ static OstreeBuiltin builtins[] = { { "remote", ostree_builtin_remote, 0 }, { "show", ostree_builtin_show, 0 }, { "unpack", ostree_builtin_unpack, 0 }, + { "write-refs", ostree_builtin_write_refs, 0 }, { NULL } }; diff --git a/src/ostree/ot-builtin-show.c b/src/ostree/ot-builtin-show.c index ea85cc1a..a6fe3f43 100644 --- a/src/ostree/ot-builtin-show.c +++ b/src/ostree/ot-builtin-show.c @@ -27,12 +27,12 @@ #include -static gboolean print_compose; +static gboolean print_related; static char* print_variant_type; static char* print_metadata_key; static GOptionEntry options[] = { - { "print-compose", 0, 0, G_OPTION_ARG_NONE, &print_compose, "If given, show the branches which make up the given compose commit", NULL }, + { "print-related", 0, 0, G_OPTION_ARG_NONE, &print_related, "If given, show the \"related\" commits", NULL }, { "print-variant-type", 0, 0, G_OPTION_ARG_STRING, &print_variant_type, "If given, argument should be a filename and it will be interpreted as this type", NULL }, { "print-metadata-key", 0, 0, G_OPTION_ARG_STRING, &print_metadata_key, "Print string value of metadata key KEY for given commit", "KEY" }, { NULL } @@ -132,18 +132,16 @@ show_repo_meta (OstreeRepo *repo, } static gboolean -do_print_compose (OstreeRepo *repo, +do_print_related (OstreeRepo *repo, const char *rev, const char *resolved_rev, GError **error) { gboolean ret = FALSE; - const char *branch; - const char *branchrev; + const char *name; + ot_lvariant GVariant *csum_v = NULL; ot_lvariant GVariant *variant = NULL; - ot_lvariant GVariant *metadata = NULL; - ot_lvariant GVariant *compose_contents = NULL; - ot_lhash GHashTable *metadata_hash = NULL; + ot_lvariant GVariant *related = NULL; GVariantIter *viter = NULL; if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT, @@ -151,22 +149,16 @@ do_print_compose (OstreeRepo *repo, goto out; /* PARSE OSTREE_SERIALIZED_COMMIT_VARIANT */ - metadata = g_variant_get_child_value (variant, 1); - metadata_hash = ot_util_variant_asv_to_hash_table (metadata); + related = g_variant_get_child_value (variant, 2); - compose_contents = g_hash_table_lookup (metadata_hash, "ostree-compose"); - if (!compose_contents) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Commit %s does not have compose metadata key \"ostree-compose\"", resolved_rev); - goto out; - } + viter = g_variant_iter_new (related); - g_variant_get_child (compose_contents, 0, "a(ss)", &viter); - while (g_variant_iter_next (viter, "(&s&s)", &branch, &branchrev)) + while (g_variant_iter_loop (viter, "(&s@ay)", &name, &csum_v)) { - g_print ("%s %s\n", branch, branchrev); + ot_lfree char *checksum = ostree_checksum_from_bytes_v (csum_v); + g_print ("%s %s\n", name, checksum); } + csum_v = NULL; ret = TRUE; out: @@ -237,12 +229,12 @@ ostree_builtin_show (int argc, char **argv, GFile *repo_path, GError **error) if (!do_print_metadata_key (repo, resolved_rev, print_metadata_key, error)) goto out; } - else if (print_compose) + else if (print_related) { if (!ostree_repo_resolve_rev (repo, rev, FALSE, &resolved_rev, error)) goto out; - if (!do_print_compose (repo, rev, resolved_rev, error)) + if (!do_print_related (repo, rev, resolved_rev, error)) goto out; } else if (print_variant_type) diff --git a/src/ostree/ot-builtin-write-refs.c b/src/ostree/ot-builtin-write-refs.c new file mode 100644 index 00000000..d76d847e --- /dev/null +++ b/src/ostree/ot-builtin-write-refs.c @@ -0,0 +1,97 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2011 Colin Walters + * + * 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. + * + * Author: Colin Walters + */ + +#include "config.h" + +#include "ot-builtins.h" +#include "ostree.h" + +#include +#include + +#include + +static GOptionEntry options[] = { + { NULL } +}; + +gboolean +ostree_builtin_write_refs (int argc, char **argv, GFile *repo_path, GError **error) +{ + GOptionContext *context; + gboolean ret = FALSE; + GCancellable *cancellable = NULL; + GError *temp_error = NULL; + gsize len; + ot_lobj OstreeRepo *repo = NULL; + ot_lobj GInputStream *instream = NULL; + ot_lobj GDataInputStream *datastream = NULL; + ot_lfree char *line = NULL; + + context = g_option_context_new ("Import newline-separated pairs of REF REVISION"); + g_option_context_add_main_entries (context, options, NULL); + + if (!g_option_context_parse (context, &argc, &argv, error)) + goto out; + + repo = ostree_repo_new (repo_path); + if (!ostree_repo_check (repo, error)) + goto out; + + instream = (GInputStream*)g_unix_input_stream_new (0, FALSE); + datastream = g_data_input_stream_new (instream); + + while ((line = g_data_input_stream_read_line (datastream, &len, + cancellable, &temp_error)) != NULL) + { + const char *spc = strchr (line, ' '); + ot_lfree char *ref = NULL; + ot_lfree guchar *rev = NULL; + + if (!spc || spc == line) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Invalid ref input"); + goto out; + } + + ref = g_strndup (line, spc - line); + if (!ostree_validate_structureof_checksum_string (spc + 1, error)) + goto out; + + if (!ostree_repo_write_ref (repo, NULL, ref, spc + 1, error)) + goto out; + + g_free (line); + } + if (temp_error) + { + g_propagate_error (error, temp_error); + goto out; + } + + ret = TRUE; + out: + if (context) + g_option_context_free (context); + return ret; +} diff --git a/src/ostree/ot-builtins.h b/src/ostree/ot-builtins.h index 4d411241..b380190c 100644 --- a/src/ostree/ot-builtins.h +++ b/src/ostree/ot-builtins.h @@ -44,6 +44,7 @@ gboolean ostree_builtin_pack (int argc, char **argv, GFile *repo_path, GError ** gboolean ostree_builtin_rev_parse (int argc, char **argv, GFile *repo_path, GError **error); gboolean ostree_builtin_remote (int argc, char **argv, GFile *repo_path, GError **error); gboolean ostree_builtin_unpack (int argc, char **argv, GFile *repo_path, GError **error); +gboolean ostree_builtin_write_refs (int argc, char **argv, GFile *repo_path, GError **error); G_END_DECLS