diff --git a/app/flatpak-builtins-build-finish.c b/app/flatpak-builtins-build-finish.c index 5801af60a..a15424349 100644 --- a/app/flatpak-builtins-build-finish.c +++ b/app/flatpak-builtins-build-finish.c @@ -35,11 +35,13 @@ #include "flatpak-run.h" static char *opt_command; +static char *opt_require_version; static char **opt_extra_data; static gboolean opt_no_exports; static GOptionEntry options[] = { { "command", 0, 0, G_OPTION_ARG_STRING, &opt_command, N_("Command to set"), N_("COMMAND") }, + { "require-version", 0, 0, G_OPTION_ARG_STRING, &opt_require_version, N_("Flatpak version to require"), N_("MAJOR.MINOR.MICRO") }, { "no-exports", 0, 0, G_OPTION_ARG_NONE, &opt_no_exports, N_("Don't process exports"), NULL }, { "extra-data", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_extra_data, N_("Extra data info"), N_("NAME:SHA256:DOWNLOAD-SIZE:INSTALL-SIZE:URL") }, @@ -320,6 +322,9 @@ update_metadata (GFile *base, FlatpakContext *arg_context, GCancellable *cancell } } + if (opt_require_version) + g_key_file_set_string (keyfile, "Application", "required-flatpak", opt_require_version); + app_context = flatpak_context_new (); if (!flatpak_context_load_metadata (app_context, keyfile, error)) goto out; diff --git a/app/flatpak-transaction.c b/app/flatpak-transaction.c index c76ff87ef..1dc9d9155 100644 --- a/app/flatpak-transaction.c +++ b/app/flatpak-transaction.c @@ -92,29 +92,6 @@ dir_ref_is_installed (FlatpakDir *dir, const char *ref, char **remote_out) return TRUE; } -static char * -transaction_fetch_runtime_ref (FlatpakDir *dir, const char *remote, const char *ref) -{ - g_autofree char *metadata = NULL; - g_autoptr(GKeyFile) metakey = NULL; - g_autofree char *runtime_ref = NULL; - - if (!g_str_has_prefix (ref, "app/")) - return NULL; - - if (!flatpak_dir_fetch_ref_cache (dir, remote, ref, NULL, NULL, &metadata, NULL, NULL)) - return NULL; - - metakey = g_key_file_new (); - if (!g_key_file_load_from_data (metakey, metadata, -1, 0, NULL)) - return NULL; - - runtime_ref = g_key_file_get_string (metakey, "Application", "runtime", NULL); - - return g_steal_pointer (&runtime_ref); -} - - static FlatpakTransactionOp * flatpak_transaction_operation_new (const char *remote, const char *ref, @@ -338,6 +315,7 @@ add_related (FlatpakTransaction *self, static gboolean add_deps (FlatpakTransaction *self, + GKeyFile *metakey, const char *remote, const char *ref, GError **error) @@ -347,7 +325,11 @@ add_deps (FlatpakTransaction *self, g_autofree char *runtime_remote = NULL; const char *pref; - runtime_ref = transaction_fetch_runtime_ref (self->dir, remote, ref); + if (!g_str_has_prefix (ref, "app/")) + return TRUE; + + if (metakey) + runtime_ref = g_key_file_get_string (metakey, "Application", "runtime", NULL); if (runtime_ref == NULL) return TRUE; @@ -410,6 +392,8 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, { g_autofree char *origin = NULL; const char *pref; + g_autofree char *metadata = NULL; + g_autoptr(GKeyFile) metakey = NULL; pref = strchr (ref, '/') + 1; @@ -440,8 +424,33 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, } } + if (flatpak_dir_fetch_ref_cache (self->dir, remote, ref, NULL, NULL, &metadata, NULL, NULL)) + { + metakey = g_key_file_new (); + if (!g_key_file_load_from_data (metakey, metadata, -1, 0, NULL)) + g_clear_object (&metakey); + } + + if (metakey) + { + g_autofree char *required_version = g_key_file_get_string (metakey, "Application", "required-flatpak", NULL); + int required_major, required_minor, required_micro; + if (required_version) + { + if (sscanf (required_version, "%d.%d.%d", &required_major, &required_minor, &required_micro) != 3) + g_print ("Invalid require-flatpak argument %s\n", required_version); + else + { + if (required_major > PACKAGE_MAJOR_VERSION || + (required_major == PACKAGE_MAJOR_VERSION && required_minor > PACKAGE_MINOR_VERSION) || + (required_major == PACKAGE_MAJOR_VERSION && required_minor == PACKAGE_MINOR_VERSION && required_micro > PACKAGE_MICRO_VERSION)) + return flatpak_fail (error, _("%s needs a later flatpak version (%s)"), ref, required_version); + } + } + } + if (self->add_deps) - add_deps (self, remote, ref, error); + add_deps (self, metakey, remote, ref, error); flatpak_transaction_add_op (self, remote, ref, subpaths, commit, !is_update, is_update); diff --git a/configure.ac b/configure.ac index 8b925a698..d9eb5698a 100644 --- a/configure.ac +++ b/configure.ac @@ -372,6 +372,9 @@ AC_SUBST(FLATPAK_MINOR_VERSION) AC_SUBST(FLATPAK_MICRO_VERSION) AC_SUBST(FLATPAK_INTERFACE_AGE) AC_SUBST(FLATPAK_VERSION) +AC_DEFINE_UNQUOTED([PACKAGE_MAJOR_VERSION], $FLATPAK_MAJOR_VERSION, [Major version]) +AC_DEFINE_UNQUOTED([PACKAGE_MINOR_VERSION], $FLATPAK_MINOR_VERSION, [Minor version]) +AC_DEFINE_UNQUOTED([PACKAGE_MICRO_VERSION], $FLATPAK_MICRO_VERSION, [Micro version]) # libtool versioning #LT_RELEASE=$FLATPAK_MAJOR_VERSION.$FLATPAK_MINOR_VERSION diff --git a/doc/flatpak-build-finish.xml b/doc/flatpak-build-finish.xml index 049c0e1e7..4314cd297 100644 --- a/doc/flatpak-build-finish.xml +++ b/doc/flatpak-build-finish.xml @@ -86,6 +86,14 @@ + + + + + Require this version of later of flatpak to install/update to this build. + + + diff --git a/tests/test-run.sh b/tests/test-run.sh index 951288b68..8910dfbac 100755 --- a/tests/test-run.sh +++ b/tests/test-run.sh @@ -24,7 +24,7 @@ set -euo pipefail skip_without_bwrap skip_without_user_xattrs -echo "1..8" +echo "1..9" setup_repo install_repo @@ -287,5 +287,41 @@ assert_has_file $FL_DIR/app/org.test.Split/$ARCH/master/active/files/e/data assert_not_has_file $FL_DIR/app/org.test.Split/$ARCH/master/active/files/f assert_not_has_file $FL_DIR/app/org.test.Split/$ARCH/master/active/files/nope - echo "ok subpaths" + +VERSION=`cat "$test_builddir/package_version.txt"` + +DIR=`mktemp -d` +${FLATPAK} build-init ${DIR} org.test.CurrentVersion org.test.Platform org.test.Platform +${FLATPAK} build-finish --require-version=${VERSION} --command=hello.sh ${DIR} +${FLATPAK} build-export ${FL_GPGARGS} repo ${DIR} +DIR=`mktemp -d` +${FLATPAK} build-init ${DIR} org.test.OldVersion org.test.Platform org.test.Platform +${FLATPAK} build-finish --require-version=0.6.10 --command=hello.sh ${DIR} +${FLATPAK} build-export ${FL_GPGARGS} repo ${DIR} +DIR=`mktemp -d` +${FLATPAK} build-init ${DIR} org.test.NewVersion org.test.Platform org.test.Platform +${FLATPAK} build-finish --require-version=${VERSION}9 --command=hello.sh ${DIR} +${FLATPAK} build-export ${FL_GPGARGS} repo ${DIR} + +update_repo + +${FLATPAK} ${U} install test-repo org.test.OldVersion master +${FLATPAK} ${U} install test-repo org.test.CurrentVersion master +(! ${FLATPAK} ${U} install test-repo org.test.NewVersion master) + +DIR=`mktemp -d` +${FLATPAK} build-init ${DIR} org.test.OldVersion org.test.Platform org.test.Platform +${FLATPAK} build-finish --require-version=99.0.0 --command=hello.sh ${DIR} +${FLATPAK} build-export ${FL_GPGARGS} repo ${DIR} + +(! ${FLATPAK} ${U} update org.test.OldVersion) + +DIR=`mktemp -d` +${FLATPAK} build-init ${DIR} org.test.OldVersion org.test.Platform org.test.Platform +${FLATPAK} build-finish --require-version=0.1.1 --command=hello.sh ${DIR} +${FLATPAK} build-export ${FL_GPGARGS} repo ${DIR} + +${FLATPAK} ${U} update org.test.OldVersion + +echo "ok version checks"