/** * as_merge_components: * * Merge selected data from two components. */ static void as_merge_components (AsComponent *dest_cpt, AsComponent *src_cpt) { guint i; AsMergeKind merge_kind; merge_kind = as_component_get_merge_kind (src_cpt); g_return_if_fail (merge_kind != AS_MERGE_KIND_NONE); /* FIXME: We need to merge more attributes */ /* merge stuff in append mode */ if (merge_kind == AS_MERGE_KIND_APPEND) { GPtrArray *suggestions; GPtrArray *cats; /* merge categories */ cats = as_component_get_categories (src_cpt); if (cats->len > 0) { g_autoptr(GHashTable) cat_table = NULL; GPtrArray *dest_categories; cat_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); for (i = 0; i < cats->len; i++) { const gchar *cat = (const gchar*) g_ptr_array_index (cats, i); g_hash_table_add (cat_table, g_strdup (cat)); } dest_categories = as_component_get_categories (dest_cpt); if (dest_categories->len > 0) { for (i = 0; i < dest_categories->len; i++) { const gchar *cat = (const gchar*) g_ptr_array_index (dest_categories, i); g_hash_table_add (cat_table, g_strdup (cat)); } } g_ptr_array_set_size (dest_categories, 0); as_hash_table_string_keys_to_array (cat_table, dest_categories); } /* merge suggestions */ suggestions = as_component_get_suggested (src_cpt); if (suggestions != NULL) { for (i = 0; i < suggestions->len; i++) { as_component_add_suggested (dest_cpt, AS_SUGGESTED (g_ptr_array_index (suggestions, i))); } } } /* merge stuff in replace mode */ if (merge_kind == AS_MERGE_KIND_REPLACE) { gchar **pkgnames; /* merge names */ if (as_component_get_name (src_cpt) != NULL) as_component_set_name (dest_cpt, as_component_get_name (src_cpt), as_component_get_active_locale (src_cpt)); /* merge package names */ pkgnames = as_component_get_pkgnames (src_cpt); if ((pkgnames != NULL) && (pkgnames[0] != '\0')) as_component_set_pkgnames (dest_cpt, as_component_get_pkgnames (src_cpt)); /* merge bundles */ if (as_component_has_bundle (src_cpt)) as_component_set_bundles_array (dest_cpt, as_component_get_bundles (src_cpt)); } g_debug ("Merged data for '%s'", as_component_get_data_id (dest_cpt)); }
/** * pkgen_make_template: */ static gint pkgen_make_template (const gchar *dir) { gint res = 0; gchar *res_dir = NULL; gchar *tmp; gchar *fname; gboolean appstream_linked = FALSE; GError *error = NULL; if (dir == NULL) { tmp = g_get_current_dir (); res_dir = g_build_filename (tmp, "pkginstall", NULL); g_free (tmp); } else { res_dir = g_strdup (dir); } g_mkdir_with_parents (res_dir, 0755); g_print (_("Do you have an AppStream XML file for your software? [y/N]")); tmp = li_get_stdin (); if (tmp != NULL) { gchar *str; str = g_utf8_strdown (tmp, -1); g_free (tmp); g_strstrip (str); if (g_strcmp0 (str, "y") == 0) { g_print ("%s ", _("Please specify a path to the AppStream XML data:")); tmp = li_get_stdin (); if (tmp != NULL) { gchar *asfile; asfile = g_build_filename (res_dir, "metainfo.xml", NULL); /* TODO: create relative symlink */ symlink (tmp, asfile); g_free (tmp); appstream_linked = TRUE; } else { res = 1; g_print ("%s\n", _("No path given. Exiting.")); g_free (str); goto out; } } g_free (str); } if (!appstream_linked) { AsComponent *cpt; gchar *asfile; cpt = as_component_new (); while (TRUE) { g_print ("%s ", _("Your software needs a unique name.\nIn case of a GUI application, this is its .desktop filename.\nUnique software name:")); tmp = li_get_stdin (); if (tmp != NULL) { as_component_set_id (cpt, tmp); g_free (tmp); break; } } while (TRUE) { g_print ("%s ", _("Define a software name (human readable):")); tmp = li_get_stdin (); if (tmp != NULL) { as_component_set_name (cpt, tmp); g_free (tmp); break; } } while (TRUE) { g_print ("%s ", _("Define a software version:")); tmp = li_get_stdin (); if (tmp != NULL) { AsRelease *rel; rel = as_release_new (); as_release_set_version (rel, tmp); as_component_add_release (cpt, rel); g_object_unref (rel); g_free (tmp); break; } } while (TRUE) { g_print ("%s ", _("Write a short summary (one sentence) about your software:")); tmp = li_get_stdin (); if (tmp != NULL) { as_component_set_summary (cpt, tmp); g_free (tmp); break; } } asfile = g_build_filename (res_dir, "metainfo.xml", NULL); tmp = as_component_to_xml (cpt); g_file_set_contents (asfile, tmp, -1, &error); g_free (tmp); if (error != NULL) { li_print_stderr (_("Unable to write AppStream data. %s"), error->message); g_error_free (error); res = 2; g_free (asfile); goto out; } if (g_file_test ("/usr/bin/xmllint", G_FILE_TEST_EXISTS)) { gchar *cmd; /* we can try to pretty-print our XML file. Using xmllint from the environment should * not be a security risk here */ cmd = g_strdup_printf ("xmllint --format %s -o %s", asfile, asfile); /* any error / exit-code isn't relevant here - a failed attempt to format the XML will do no harm */ g_spawn_command_line_sync (cmd, NULL, NULL, NULL, NULL); g_free (cmd); } g_free (asfile); } fname = g_build_filename (res_dir, "control", NULL); g_file_set_contents (fname, "Format-Version: 1.0\n\nRequires:\n", -1, &error); g_free (fname); if (error != NULL) { li_print_stderr (_("Unable to write 'control' file. %s"), error->message); g_error_free (error); res = 2; goto out; } li_print_stdout ("\n========");\ li_print_stdout (_("Created project template in '%s'.\n\n" \ "Please edit the files in that directory, e.g. add a long description to your\n" \ "application and specify its run-time dependencies.\n" \ "When you are done with this, build your software with --prefix=%s\n" \ "and install it into the inst_target subdirectory of your 'pkginstall' directory.\n" \ "Then run 'lipkgen build pkginstall/' to create your package. \n" \ "If you want to embed dependencies, place their IPK packages in the 'repo/'\n" \ "subdirectory of 'pkginstall/'"), res_dir, LI_SW_ROOT_PREFIX); li_print_stdout ("========\n"); out: g_free (res_dir); return res; }