static gboolean as_app_validate_releases (AsApp *app, AsAppValidateHelper *helper, GError **error) { GPtrArray *releases; AsFormat *format; gboolean require_release = FALSE; /* only for AppData */ format = as_app_get_format_default (app); if (as_format_get_kind (format) != AS_FORMAT_KIND_APPDATA && as_format_get_kind (format) != AS_FORMAT_KIND_METAINFO) return TRUE; /* make the requirements more strict */ if ((helper->flags & AS_APP_VALIDATE_FLAG_RELAX) == 0) { /* only for desktop and console apps */ if (as_app_get_kind (app) == AS_APP_KIND_DESKTOP || as_app_get_kind (app) == AS_APP_KIND_CONSOLE) { require_release = TRUE; } } /* require releases */ releases = as_app_get_releases (app); if (require_release && releases->len == 0) { ai_app_validate_add (helper, AS_PROBLEM_KIND_TAG_MISSING, "<release> required"); return TRUE; } for (guint i = 0; i < releases->len; i++) { AsRelease *release = g_ptr_array_index (releases, i); if (!as_app_validate_release (app, release, helper, error)) return FALSE; } /* check the version numbers go down each time */ if (releases->len > 1) { AsRelease *release_old = g_ptr_array_index (releases, 0); for (guint i = 1; i < releases->len; i++) { AsRelease *release = g_ptr_array_index (releases, i); const gchar *version = as_release_get_version (release); const gchar *version_old = as_release_get_version (release_old); if (version == NULL || version_old == NULL) continue; if (as_utils_vercmp_full (version, version_old, AS_VERSION_COMPARE_FLAG_NONE) > 0) { ai_app_validate_add (helper, AS_PROBLEM_KIND_TAG_INVALID, "<release> versions are not in order " "[%s before %s]", version_old, version); } release_old = release; } } return TRUE; }
/** * as_app_validate_releases: **/ static gboolean as_app_validate_releases (AsApp *app, AsAppValidateHelper *helper, GError **error) { AsRelease *release; GPtrArray *releases; guint i; /* only for AppData */ if (as_app_get_source_kind (app) != AS_APP_SOURCE_KIND_APPDATA) return TRUE; releases = as_app_get_releases (app); if (releases->len > 10) { ai_app_validate_add (helper->probs, AS_PROBLEM_KIND_STYLE_INCORRECT, "Too many <release> tags"); } for (i = 0; i < releases->len; i++) { release = g_ptr_array_index (releases, i); if (!as_app_validate_release (release, helper, error)) return FALSE; } return TRUE; }