diff --git a/libpkg/pkg_repo_meta.c b/libpkg/pkg_repo_meta.c index a4880a2bf..24ad2ee4e 100644 --- a/libpkg/pkg_repo_meta.c +++ b/libpkg/pkg_repo_meta.c @@ -67,6 +67,8 @@ pkg_repo_meta_set_default(struct pkg_repo_meta *meta) */ meta->digests = xstrdup("digests"); meta->digests_archive = xstrdup("digests"); + + meta->extra_fields = NULL; } void @@ -103,6 +105,7 @@ pkg_repo_meta_free(struct pkg_repo_meta *meta) free(k); } pkghash_destroy(meta->keys); + ucl_object_unref(meta->extra_fields); free(meta); } } @@ -188,6 +191,9 @@ pkg_repo_meta_open_schema_v2(void) " }" " required = [type, data, name];\n" "};\n" + "extra = {" + " type = object;\n" + "};\n" "}\n" "required = [version]\n" @@ -284,6 +290,11 @@ pkg_repo_meta_parse(ucl_object_t *top, struct pkg_repo_meta **target, int versio pkghash_safe_add(meta->keys, cert->name, cert, NULL); } + obj = ucl_object_find_key(top, "extra"); + if (obj != NULL && obj->type == UCL_OBJECT) { + meta->extra_fields = ucl_object_copy(obj); + } + *target = meta; ucl_object_unref(top); @@ -334,7 +345,7 @@ pkg_repo_meta_load(const int fd, struct pkg_repo_meta **target) parser = ucl_parser_new(UCL_PARSER_KEY_LOWERCASE); - if (!ucl_parser_add_fd(parser, fd)) { + if (!ucl_parser_add_fd_full(parser, fd, 0, UCL_DUPLICATE_MERGE, UCL_PARSE_UCL)) { pkg_emit_error("cannot parse repository meta: %s", ucl_parser_get_error(parser)); ucl_parser_free(parser); @@ -431,6 +442,12 @@ pkg_repo_meta_to_ucl(struct pkg_repo_meta *meta) META_EXPORT_FIELD(result, meta, revision, int); META_EXPORT_FIELD(result, meta, eol, int); + if (meta->extra_fields != NULL) { + ucl_object_insert_key(result, + ucl_object_copy(meta->extra_fields), + "extra", 5, false); + } + /* TODO: export keys */ return (result); diff --git a/libpkg/private/pkg.h b/libpkg/private/pkg.h index 45960073a..7eb37dcf0 100644 --- a/libpkg/private/pkg.h +++ b/libpkg/private/pkg.h @@ -491,6 +491,8 @@ struct pkg_repo_meta { char *repopath; bool hash; bool hash_symlink; + + ucl_object_t* extra_fields; }; struct pkg_repo_it_ops { diff --git a/tests/frontend/repo.sh b/tests/frontend/repo.sh index b6898d99b..dfd5f6574 100755 --- a/tests/frontend/repo.sh +++ b/tests/frontend/repo.sh @@ -7,7 +7,8 @@ tests_init \ repo_multiversion \ repo_multiformat \ repo_symlinks \ - repo_content + repo_content \ + repo_extra_fields repo_v2_body() { touch plop @@ -185,3 +186,29 @@ repo_content_body() { nb=$(tar -xf packagesite.pkg -O - packagesite.yaml | wc -l) [ $nb -eq 1 ] || atf_fail "packagesite has $nb entries instead of 1" } + +repo_extra_fields_body() { + atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg test test 1 "${TMPDIR}" + + atf_check \ + -s exit:0 \ + pkg create -M test.ucl + + cat > meta.ucl << EOF +version = 2; +extra = { foo = "yes"; }; +extra = { bar = 123; }; +EOF + + atf_check \ + -o ignore \ + -s exit:0 \ + pkg repo --meta-file meta.ucl . + + atf_check -s exit:0 \ + -o match:'extra \{' \ + -o match:'foo = "yes";' \ + -o match:'bar = 123;' \ + -o match:'\}' \ + cat meta.conf +}