From f8fd49a9aefffdaa24f6d4b24268ac3cd5f3d090 Mon Sep 17 00:00:00 2001 From: Stephen Gallagher Date: Mon, 7 Jan 2019 10:22:30 -0500 Subject: [PATCH 2/3] Always sort the dependencies This will make sure that the output is always consistent. This patch fixes both the ordering of the module names as well as the stream names. Signed-off-by: Stephen Gallagher --- .../modulemd-2.0/private/modulemd-yaml.h | 30 ++++--- modulemd/v2/modulemd-dependencies.c | 85 ++----------------- .../v2/tests/test-modulemd-modulestream.c | 14 +-- 3 files changed, 36 insertions(+), 93 deletions(-) diff --git a/modulemd/v2/include/modulemd-2.0/private/modulemd-yaml.h b/modulemd/v2/include/modulemd-2.0/private/modulemd-yaml.h index e426fe6f1d9c43c7ad13420edc481eba46ae3fda..cca84590d6b29fe2f7d20fb91e7205fa21a38533 100644 --- a/modulemd/v2/include/modulemd-2.0/private/modulemd-yaml.h +++ b/modulemd/v2/include/modulemd-2.0/private/modulemd-yaml.h @@ -655,12 +655,30 @@ skip_unknown_yaml (yaml_parser_t *parser, GError **error); MODULEMD_YAML_ERROR_EMIT, \ "String set for key %s was empty on emit", \ key); \ return FALSE; \ } \ + EMIT_STRING_SET_FULL ( \ + emitter, error, key, table, YAML_BLOCK_SEQUENCE_STYLE); \ + } \ + while (0) + +#define EMIT_STRING_SET_IF_NON_EMPTY(emitter, error, key, table) \ + do \ + { \ + if (NON_EMPTY_TABLE (table)) \ + { \ + EMIT_STRING_SET (emitter, error, key, table); \ + } \ + } \ + while (0) + +#define EMIT_STRING_SET_FULL(emitter, error, key, table, sequence_style) \ + do \ + { \ EMIT_SCALAR (emitter, error, key); \ - EMIT_SEQUENCE_START (emitter, error); \ + EMIT_SEQUENCE_START_WITH_STYLE (emitter, error, sequence_style); \ gsize i; \ g_autoptr (GPtrArray) keys = \ modulemd_ordered_str_keys (table, modulemd_strcmp_sort); \ for (i = 0; i < keys->len; i++) \ { \ @@ -668,20 +686,10 @@ skip_unknown_yaml (yaml_parser_t *parser, GError **error); } \ EMIT_SEQUENCE_END (emitter, error); \ } \ while (0) -#define EMIT_STRING_SET_IF_NON_EMPTY(emitter, error, key, table) \ - do \ - { \ - if (NON_EMPTY_TABLE (table)) \ - { \ - EMIT_STRING_SET (emitter, error, key, table); \ - } \ - } \ - while (0) - #define EMIT_ARRAY_VALUES(emitter, error, key, array, emitfn) \ do \ { \ if (!NON_EMPTY_ARRAY (array)) \ { \ diff --git a/modulemd/v2/modulemd-dependencies.c b/modulemd/v2/modulemd-dependencies.c index f71bebe9fbc852fa6df729ce80bd0e0375e023bd..ee918e02a87dfdee04a5a6af7dc96e949159a046 100644 --- a/modulemd/v2/modulemd-dependencies.c +++ b/modulemd/v2/modulemd-dependencies.c @@ -470,73 +470,22 @@ modulemd_dependencies_parse_yaml (yaml_parser_t *parser, } return g_steal_pointer (&d); } -static gboolean -modulemd_dependencies_emit_yaml_nested_set_value (GHashTable *values, - yaml_emitter_t *emitter, - yaml_sequence_style_t style, - GError **error) -{ - MODULEMD_INIT_TRACE (); - int ret; - g_autoptr (GError) nested_error = NULL; - MMD_INIT_YAML_EVENT (event); - GHashTableIter iter; - gpointer key; - - ret = mmd_emitter_start_sequence (emitter, style, &nested_error); - if (!ret) - { - g_propagate_prefixed_error ( - error, - g_steal_pointer (&nested_error), - "Failed to start dependencies nested mapping values: "); - return FALSE; - } - - g_hash_table_iter_init (&iter, values); - while (g_hash_table_iter_next (&iter, &key, NULL)) - { - ret = mmd_emitter_scalar ( - emitter, (const gchar *)key, YAML_PLAIN_SCALAR_STYLE, &nested_error); - if (!ret) - { - g_propagate_prefixed_error ( - error, - g_steal_pointer (&nested_error), - "Failed to start dependencies nested mapping entry: "); - return FALSE; - } - } - - ret = mmd_emitter_end_sequence (emitter, &nested_error); - if (!ret) - { - g_propagate_prefixed_error ( - error, - g_steal_pointer (&nested_error), - "Failed to end dependencies nested mapping values: "); - return FALSE; - } - - return TRUE; -} - - static gboolean modulemd_dependencies_emit_yaml_nested_set (GHashTable *table, yaml_emitter_t *emitter, GError **error) { MODULEMD_INIT_TRACE (); int ret; g_autoptr (GError) nested_error = NULL; MMD_INIT_YAML_EVENT (event); - GHashTableIter iter; - gpointer key, value; + g_autoptr (GPtrArray) keys = NULL; + GHashTable *dep = NULL; + gchar *key = NULL; ret = mmd_emitter_start_mapping ( emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error); if (!ret) { @@ -545,34 +494,18 @@ modulemd_dependencies_emit_yaml_nested_set (GHashTable *table, g_steal_pointer (&nested_error), "Failed to start dependencies nested mapping: "); return FALSE; } - g_hash_table_iter_init (&iter, table); - while (g_hash_table_iter_next (&iter, &key, &value)) + keys = modulemd_ordered_str_keys (table, modulemd_strcmp_sort); + for (gint i = 0; i < keys->len; i++) { - ret = mmd_emitter_scalar ( - emitter, (const gchar *)key, YAML_PLAIN_SCALAR_STYLE, &nested_error); - if (!ret) - { - g_propagate_prefixed_error ( - error, - g_steal_pointer (&nested_error), - "Failed to emit dependencies nested key: "); - return FALSE; - } + key = g_ptr_array_index (keys, i); + dep = g_hash_table_lookup (table, key); - ret = modulemd_dependencies_emit_yaml_nested_set_value ( - (GHashTable *)value, emitter, YAML_FLOW_SEQUENCE_STYLE, &nested_error); - if (!ret) - { - g_propagate_prefixed_error ( - error, - g_steal_pointer (&nested_error), - "Failed to emit dependencies nested sequence: "); - return FALSE; - } + EMIT_STRING_SET_FULL ( + emitter, error, key, dep, YAML_FLOW_SEQUENCE_STYLE); } ret = mmd_emitter_end_mapping (emitter, &nested_error); if (!ret) { diff --git a/modulemd/v2/tests/test-modulemd-modulestream.c b/modulemd/v2/tests/test-modulemd-modulestream.c index 8136b6ec626b3648339840c7cd667423c3ea1cc9..b68f4a650e15535d606aae031afc90a41bb4bcec 100644 --- a/modulemd/v2/tests/test-modulemd-modulestream.c +++ b/modulemd/v2/tests/test-modulemd-modulestream.c @@ -308,19 +308,21 @@ module_stream_v2_test_parse_dump (ModuleStreamFixture *fixture, "Beerware\n - GPLv2+\n - zlib\n xmd:\n some_key: some_data\n " "dependencies:\n - buildrequires:\n platform: [-epel7, -f27, " "-f28]\n " " requires:\n platform: [-epel7, -f27, -f28]\n - buildrequires:\n " " " - "compatible: [v3]\n platform: [f27]\n buildtools: [v1, v2]\n " + "buildtools: [v1, v2]\n compatible: [v3]\n platform: [f27]\n " "requires:\n compatible: [v3, v4]\n " "platform: [f27]\n - buildrequires:\n platform: [f28]\n " "requires:\n platform: [f28]\n runtime: [a, b]\n - " - "buildrequires:\n extras: []\n platform: [epel7]\n " - "moreextras: [foo, bar]\n " - "requires:\n extras: []\n platform: [epel7]\n " - "moreextras: [foo, bar]\n references:\n community: " - "http://www.example.com/\n documentation: http://www.example.com/\n " + "buildrequires:\n extras: []\n moreextras: [bar, foo]\n " + "platform: [epel7]\n " + "requires:\n extras: []\n " + "moreextras: [bar, foo]\n platform: [epel7]\n references:\n " + "community: " + "http://www.example.com/\n documentation: " + "http://www.example.com/\n " "tracker: http://www.example.com/\n profiles:\n buildroot:\n " "rpms:\n - bar-devel\n container:\n rpms:\n - bar\n " " - bar-devel\n default:\n rpms:\n - bar\n - " "bar-extras\n - baz\n minimal:\n description: Minimal " "profile installing only the bar package.\n rpms:\n - bar\n " -- 2.20.1