From 594d0345fa997446b4c2dcfbccf3f83257bb55a3 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 31 Dec 2025 00:42:17 +0000 Subject: [PATCH] sysupdate: Add partial/pending flags to UpdateSet This commit adds the flags and some basic formatting/printing of them. Following commits will integrate them into the update/acquire/install logic. `UPDATE_PARTIAL` is set if any of the instances in the `UpdateSet` are partial, i.e. have been partially downloaded. `UPDATE_PENDING` is set if any of the instances in the `UpdateSet` are pending, i.e. have been acquired (downloaded) but not yet installed. Signed-off-by: Philip Withnall Helps: https://github.com/systemd/systemd/issues/34814 --- src/sysupdate/sysupdate-update-set-flags.c | 18 ++++++++++++++++++ src/sysupdate/sysupdate-update-set-flags.h | 2 ++ src/sysupdate/sysupdate.c | 15 +++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/sysupdate/sysupdate-update-set-flags.c b/src/sysupdate/sysupdate-update-set-flags.c index 394e3907918..36801938f65 100644 --- a/src/sysupdate/sysupdate-update-set-flags.c +++ b/src/sysupdate/sysupdate-update-set-flags.c @@ -9,6 +9,9 @@ const char* update_set_flags_to_color(UpdateSetFlags flags) { if (flags == 0 || (flags & UPDATE_OBSOLETE)) return (flags & UPDATE_NEWEST) ? ansi_highlight_grey() : ansi_grey(); + if (flags & (UPDATE_PARTIAL|UPDATE_PENDING)) + return ansi_highlight_cyan(); + if (FLAGS_SET(flags, UPDATE_INSTALLED|UPDATE_INCOMPLETE)) return ansi_highlight_yellow(); @@ -29,6 +32,9 @@ const char* update_set_flags_to_glyph(UpdateSetFlags flags) { if (flags == 0 || (flags & UPDATE_OBSOLETE)) return glyph(GLYPH_MULTIPLICATION_SIGN); + if (flags & (UPDATE_PARTIAL|UPDATE_PENDING)) + return glyph(GLYPH_DOWNLOAD); + if (FLAGS_SET(flags, UPDATE_INSTALLED|UPDATE_NEWEST)) return glyph(GLYPH_BLACK_CIRCLE); @@ -54,6 +60,18 @@ const char* update_set_flags_to_string(UpdateSetFlags flags) { case UPDATE_INSTALLED|UPDATE_AVAILABLE|UPDATE_NEWEST|UPDATE_PROTECTED: return "current"; + case UPDATE_INSTALLED|UPDATE_PENDING|UPDATE_NEWEST: + case UPDATE_INSTALLED|UPDATE_PENDING|UPDATE_NEWEST|UPDATE_PROTECTED: + case UPDATE_INSTALLED|UPDATE_AVAILABLE|UPDATE_PENDING|UPDATE_NEWEST: + case UPDATE_INSTALLED|UPDATE_AVAILABLE|UPDATE_PENDING|UPDATE_NEWEST|UPDATE_PROTECTED: + return "current+pending"; + + case UPDATE_INSTALLED|UPDATE_PARTIAL|UPDATE_NEWEST: + case UPDATE_INSTALLED|UPDATE_PARTIAL|UPDATE_NEWEST|UPDATE_PROTECTED: + case UPDATE_INSTALLED|UPDATE_AVAILABLE|UPDATE_PARTIAL|UPDATE_NEWEST: + case UPDATE_INSTALLED|UPDATE_AVAILABLE|UPDATE_PARTIAL|UPDATE_NEWEST|UPDATE_PROTECTED: + return "current+partial"; + case UPDATE_AVAILABLE|UPDATE_NEWEST: case UPDATE_AVAILABLE|UPDATE_NEWEST|UPDATE_PROTECTED: return "candidate"; diff --git a/src/sysupdate/sysupdate-update-set-flags.h b/src/sysupdate/sysupdate-update-set-flags.h index 27cfab8c7c9..fd4e77e1176 100644 --- a/src/sysupdate/sysupdate-update-set-flags.h +++ b/src/sysupdate/sysupdate-update-set-flags.h @@ -10,6 +10,8 @@ typedef enum UpdateSetFlags { UPDATE_OBSOLETE = 1 << 3, UPDATE_PROTECTED = 1 << 4, UPDATE_INCOMPLETE = 1 << 5, + UPDATE_PARTIAL = 1 << 6, + UPDATE_PENDING = 1 << 7, } UpdateSetFlags; const char* update_set_flags_to_color(UpdateSetFlags flags); diff --git a/src/sysupdate/sysupdate.c b/src/sysupdate/sysupdate.c index e1143ad4ce4..a40e94da6c8 100644 --- a/src/sysupdate/sysupdate.c +++ b/src/sysupdate/sysupdate.c @@ -595,13 +595,14 @@ static int context_show_version(Context *c, const char *version) { if (!sd_json_format_enabled(arg_json_format_flags)) printf("%s%s%s Version: %s\n" " State: %s%s%s\n" - "Installed: %s%s\n" + "Installed: %s%s%s%s\n" "Available: %s%s\n" "Protected: %s%s%s\n" " Obsolete: %s%s%s\n\n", strempty(update_set_flags_to_color(us->flags)), update_set_flags_to_glyph(us->flags), ansi_normal(), us->version, strempty(update_set_flags_to_color(us->flags)), update_set_flags_to_string(us->flags), ansi_normal(), yes_no(us->flags & UPDATE_INSTALLED), FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_NEWEST) ? " (newest)" : "", + FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_PENDING) ? " (pending)" : "", FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_PARTIAL) ? " (partial)" : "", yes_no(us->flags & UPDATE_AVAILABLE), (us->flags & (UPDATE_INSTALLED|UPDATE_AVAILABLE|UPDATE_NEWEST)) == (UPDATE_AVAILABLE|UPDATE_NEWEST) ? " (newest)" : "", FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_PROTECTED) ? ansi_highlight() : "", yes_no(FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_PROTECTED)), ansi_normal(), us->flags & UPDATE_OBSOLETE ? ansi_highlight_red() : "", yes_no(us->flags & UPDATE_OBSOLETE), ansi_normal()); @@ -794,7 +795,7 @@ static int context_show_version(Context *c, const char *version) { if (!sd_json_format_enabled(arg_json_format_flags)) { printf("%s%s%s Version: %s\n" " State: %s%s%s\n" - "Installed: %s%s%s%s%s\n" + "Installed: %s%s%s%s%s%s%s\n" "Available: %s%s\n" "Protected: %s%s%s\n" " Obsolete: %s%s%s\n", @@ -802,6 +803,7 @@ static int context_show_version(Context *c, const char *version) { strempty(update_set_flags_to_color(us->flags)), update_set_flags_to_string(us->flags), ansi_normal(), yes_no(us->flags & UPDATE_INSTALLED), FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_NEWEST) ? " (newest)" : "", FLAGS_SET(us->flags, UPDATE_INCOMPLETE) ? ansi_highlight_yellow() : "", FLAGS_SET(us->flags, UPDATE_INCOMPLETE) ? " (incomplete)" : "", ansi_normal(), + FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_PENDING) ? " (pending)" : "", FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_PARTIAL) ? " (partial)" : "", yes_no(us->flags & UPDATE_AVAILABLE), (us->flags & (UPDATE_INSTALLED|UPDATE_AVAILABLE|UPDATE_NEWEST)) == (UPDATE_AVAILABLE|UPDATE_NEWEST) ? " (newest)" : "", FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_PROTECTED) ? ansi_highlight() : "", yes_no(FLAGS_SET(us->flags, UPDATE_INSTALLED|UPDATE_PROTECTED)), ansi_normal(), us->flags & UPDATE_OBSOLETE ? ansi_highlight_red() : "", yes_no(us->flags & UPDATE_OBSOLETE), ansi_normal()); @@ -827,6 +829,8 @@ static int context_show_version(Context *c, const char *version) { SD_JSON_BUILD_PAIR_BOOLEAN("newest", FLAGS_SET(us->flags, UPDATE_NEWEST)), SD_JSON_BUILD_PAIR_BOOLEAN("available", FLAGS_SET(us->flags, UPDATE_AVAILABLE)), SD_JSON_BUILD_PAIR_BOOLEAN("installed", FLAGS_SET(us->flags, UPDATE_INSTALLED)), + SD_JSON_BUILD_PAIR_BOOLEAN("partial", FLAGS_SET(us->flags, UPDATE_PARTIAL)), + SD_JSON_BUILD_PAIR_BOOLEAN("pending", FLAGS_SET(us->flags, UPDATE_PENDING)), SD_JSON_BUILD_PAIR_BOOLEAN("obsolete", FLAGS_SET(us->flags, UPDATE_OBSOLETE)), SD_JSON_BUILD_PAIR_BOOLEAN("protected", FLAGS_SET(us->flags, UPDATE_PROTECTED)), SD_JSON_BUILD_PAIR_BOOLEAN("incomplete", FLAGS_SET(us->flags, UPDATE_INCOMPLETE)), @@ -1193,13 +1197,16 @@ static int verb_list(int argc, char **argv, void *userdata) { _cleanup_(sd_json_variant_unrefp) sd_json_variant *json = NULL; _cleanup_strv_free_ char **versions = NULL; const char *current = NULL; + bool current_is_pending = false; FOREACH_ARRAY(update_set, context->update_sets, context->n_update_sets) { UpdateSet *us = *update_set; if (FLAGS_SET(us->flags, UPDATE_INSTALLED) && - FLAGS_SET(us->flags, UPDATE_NEWEST)) + FLAGS_SET(us->flags, UPDATE_NEWEST)) { current = us->version; + current_is_pending = FLAGS_SET(us->flags, UPDATE_PENDING); + } r = strv_extend(&versions, us->version); if (r < 0) @@ -1217,7 +1224,7 @@ static int verb_list(int argc, char **argv, void *userdata) { return log_oom(); } - r = sd_json_buildo(&json, SD_JSON_BUILD_PAIR_STRING("current", current), + r = sd_json_buildo(&json, SD_JSON_BUILD_PAIR_STRING(current_is_pending ? "current+pending" : "current", current), SD_JSON_BUILD_PAIR_STRV("all", versions), SD_JSON_BUILD_PAIR_STRV("appstreamUrls", appstream_urls)); if (r < 0) -- 2.47.3