diff --git a/src/ostree/ot-admin-deploy.c b/src/ostree/ot-admin-deploy.c index 21db4834..deda4eb2 100644 --- a/src/ostree/ot-admin-deploy.c +++ b/src/ostree/ot-admin-deploy.c @@ -791,10 +791,16 @@ parse_os_release (const char *contents, return ret; } +/* + * install_deployment_kernel: + * + * Write out an entry in /boot/loader/entries for @deployment. + */ static gboolean install_deployment_kernel (GFile *sysroot, int new_bootversion, OtDeployment *deployment, + guint n_deployments, GCancellable *cancellable, GError **error) @@ -901,7 +907,7 @@ install_deployment_kernel (GFile *sysroot, val); ot_config_parser_set (bootconfig, "title", title_key); - version_key = g_strdup_printf ("%d", ot_deployment_get_bootserial (deployment)); + version_key = g_strdup_printf ("%d", n_deployments - ot_deployment_get_index (deployment)); ot_config_parser_set (bootconfig, "version", version_key); linux_relpath = g_file_get_relative_path (bootdir, dest_kernel_path); @@ -1000,7 +1006,8 @@ ot_admin_write_deployments (GFile *sysroot, for (i = 0; i < new_deployments->len; i++) { OtDeployment *deployment = new_deployments->pdata[i]; - if (!install_deployment_kernel (sysroot, new_bootversion, deployment, + if (!install_deployment_kernel (sysroot, new_bootversion, + deployment, new_deployments->len, cancellable, error)) { g_prefix_error (error, "Installing kernel: "); diff --git a/src/ostree/ot-admin-functions.c b/src/ostree/ot-admin-functions.c index 7dfc30f1..397aed25 100644 --- a/src/ostree/ot-admin-functions.c +++ b/src/ostree/ot-admin-functions.c @@ -717,8 +717,8 @@ list_deployments_process_one_boot_entry (GFile *sysroot, } static gint -compare_deployments_by_boot_loader_version (gconstpointer a_pp, - gconstpointer b_pp) +compare_deployments_by_boot_loader_version_reversed (gconstpointer a_pp, + gconstpointer b_pp) { OtDeployment *a = *((OtDeployment**)a_pp); OtDeployment *b = *((OtDeployment**)b_pp); @@ -728,11 +728,15 @@ compare_deployments_by_boot_loader_version (gconstpointer a_pp, const char *b_version = ot_config_parser_get (b_bootconfig, "version"); if (a_version && b_version) - return strverscmp (a_version, b_version); + { + int r = strverscmp (a_version, b_version); + /* Reverse */ + return -r; + } else if (a_version) - return 1; - else return -1; + else + return 1; } gboolean @@ -766,7 +770,7 @@ ot_admin_list_deployments (GFile *sysroot, goto out; } - g_ptr_array_sort (ret_deployments, compare_deployments_by_boot_loader_version); + g_ptr_array_sort (ret_deployments, compare_deployments_by_boot_loader_version_reversed); for (i = 0; i < ret_deployments->len; i++) { OtDeployment *deployment = ret_deployments->pdata[i]; diff --git a/tests/test-admin-deploy-1.sh b/tests/test-admin-deploy-1.sh index 0119586b..fbf9fc27 100755 --- a/tests/test-admin-deploy-1.sh +++ b/tests/test-admin-deploy-1.sh @@ -62,6 +62,8 @@ assert_file_has_content sysroot/boot/loader/entries/ostree-testos-${rev}-0.conf assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.1/etc/os-release 'NAME=TestOS' assert_file_has_content sysroot/ostree/boot.0/testos/${bootcsum}/0/etc/os-release 'NAME=TestOS' +ostree admin --sysroot=sysroot status + echo "ok second deploy" ostree admin --sysroot=sysroot deploy --os=testos testos:testos/buildmaster/x86_64-runtime @@ -123,6 +125,8 @@ assert_not_has_file sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/aconfigfile echo "ok upgrade bare" +ostree admin --sysroot=sysroot status + os_repository_new_commit ostree --repo=sysroot/ostree/repo remote add testos file://$(pwd)/testos-repo testos/buildmaster/x86_64-runtime ostree admin --sysroot=sysroot upgrade --os=testos @@ -134,14 +138,16 @@ assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/os-r echo "ok upgrade" +ostree admin --sysroot=sysroot status + assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/os-release 'NAME=TestOS' assert_file_has_content sysroot/ostree/deploy/testos/deploy/${origrev}.4/etc/os-release 'NAME=TestOS' -ostree admin --sysroot=sysroot undeploy 1 +ostree admin --sysroot=sysroot undeploy 2 assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/os-release 'NAME=TestOS' assert_not_has_dir sysroot/ostree/deploy/testos/deploy/${origrev}.4 assert_file_has_content sysroot/ostree/deploy/testos/deploy/${origrev}.3/etc/os-release 'NAME=TestOS' -ostree admin --sysroot=sysroot undeploy 3 +ostree admin --sysroot=sysroot undeploy 2 assert_not_has_dir sysroot/ostree/deploy/testos/deploy/${origrev}.3 assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/os-release 'NAME=TestOS'