main, status: Factor out deployment printing into helper

Prep for staged deployments; they won't be in the primary deployment
list, and we want to print them first.

Also pull in some code from rpm-ostree for the red/bold bits and use
that tree-wide.

Update submodule: libglnx

Closes: #1504
Approved by: jlebon
This commit is contained in:
Colin Walters 2018-03-19 09:46:20 -04:00 committed by Atomic Bot
parent d4d193495f
commit 01717d7dfc
5 changed files with 139 additions and 115 deletions

@ -1 +1 @@
Subproject commit 96b1fd9578b3d6ff2d8e0707068f5ef450eba98c
Subproject commit 0c82203cd459a35cc3f471e3205355e9fb79160f

View File

@ -141,15 +141,10 @@ main (int argc,
if (error != NULL)
{
int is_tty = isatty (1);
const char *prefix = "";
const char *suffix = "";
if (is_tty)
{
prefix = "\x1b[31m\x1b[1m"; /* red, bold */
suffix = "\x1b[22m\x1b[0m"; /* bold off, color reset */
}
g_printerr ("%serror: %s%s\n", prefix, suffix, error->message);
g_printerr ("%s%serror:%s%s %s\n",
ot_get_red_start (), ot_get_bold_start (),
ot_get_bold_end (), ot_get_red_end (),
error->message);
}
return ret;

View File

@ -680,15 +680,10 @@ main (int argc,
if (!run (argc, argv, cancellable, &error))
{
int is_tty = isatty (1);
const char *prefix = "";
const char *suffix = "";
if (is_tty)
{
prefix = "\x1b[31m\x1b[1m"; /* red, bold */
suffix = "\x1b[22m\x1b[0m"; /* bold off, color reset */
}
g_printerr ("%serror: %s%s\n", prefix, suffix, error->message);
g_printerr ("%s%serror:%s%s %s\n",
ot_get_red_start (), ot_get_bold_start (),
ot_get_bold_end (), ot_get_red_end (),
error->message);
return 1;
}

View File

@ -27,6 +27,7 @@
#include "ot-admin-builtins.h"
#include "ot-admin-functions.h"
#include "ostree.h"
#include "libglnx.h"
#include <glib/gi18n.h>
@ -61,43 +62,17 @@ deployment_get_gpg_verify (OstreeDeployment *deployment,
return gpg_verify;
}
gboolean
ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error)
static gboolean
deployment_print_status (OstreeSysroot *sysroot,
OstreeRepo *repo,
OstreeDeployment *deployment,
gboolean is_booted,
gboolean is_pending,
gboolean is_rollback,
GCancellable *cancellable,
GError **error)
{
const int is_tty = isatty (1);
const char *red_bold_prefix = is_tty ? "\x1b[31m\x1b[1m" : "";
const char *red_bold_suffix = is_tty ? "\x1b[22m\x1b[0m" : "";
g_autoptr(GOptionContext) context = g_option_context_new ("");
g_autoptr(OstreeSysroot) sysroot = NULL;
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED,
invocation, &sysroot, cancellable, error))
return FALSE;
g_autoptr(OstreeRepo) repo = NULL;
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
return FALSE;
g_autoptr(GPtrArray) deployments = ostree_sysroot_get_deployments (sysroot);
OstreeDeployment *booted_deployment = ostree_sysroot_get_booted_deployment (sysroot);
g_autoptr(OstreeDeployment) pending_deployment = NULL;
g_autoptr(OstreeDeployment) rollback_deployment = NULL;
if (booted_deployment)
ostree_sysroot_query_deployments_for (sysroot, NULL, &pending_deployment,
&rollback_deployment);
if (deployments->len == 0)
{
g_print ("No deployments.\n");
}
else
{
for (guint i = 0; i < deployments->len; i++)
{
OstreeDeployment *deployment = deployments->pdata[i];
const char *ref = ostree_deployment_get_csum (deployment);
/* Load the backing commit; shouldn't normally fail, but if it does,
@ -121,12 +96,12 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat
GKeyFile *origin = ostree_deployment_get_origin (deployment);
const char *deployment_status = "";
if (deployment == pending_deployment)
if (is_pending)
deployment_status = " (pending)";
else if (deployment == rollback_deployment)
else if (is_rollback)
deployment_status = " (rollback)";
g_print ("%c %s %s.%d%s\n",
deployment == booted_deployment ? '*' : ' ',
is_booted ? '*' : ' ',
ostree_deployment_get_osname (deployment),
ostree_deployment_get_csum (deployment),
ostree_deployment_get_deployserial (deployment),
@ -140,9 +115,9 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat
case OSTREE_DEPLOYMENT_UNLOCKED_NONE:
break;
default:
g_print (" %sUnlocked: %s%s\n", red_bold_prefix,
g_print (" %s%sUnlocked: %s%s%s\n", ot_get_red_start (), ot_get_bold_start (),
ostree_deployment_unlocked_state_to_string (unlocked),
red_bold_suffix);
ot_get_bold_end (), ot_get_red_end ());
}
if (ostree_deployment_is_pinned (deployment))
g_print (" Pinned: yes\n");
@ -173,7 +148,7 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat
if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
{
g_clear_error (&local_error);
continue;
return TRUE;
}
else if (local_error != NULL)
{
@ -190,6 +165,50 @@ ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocat
g_print ("%s", output_buffer->str);
}
return TRUE;
}
gboolean
ot_admin_builtin_status (int argc, char **argv, OstreeCommandInvocation *invocation, GCancellable *cancellable, GError **error)
{
g_autoptr(GOptionContext) context = g_option_context_new ("");
g_autoptr(OstreeSysroot) sysroot = NULL;
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED,
invocation, &sysroot, cancellable, error))
return FALSE;
g_autoptr(OstreeRepo) repo = NULL;
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
return FALSE;
g_autoptr(GPtrArray) deployments = ostree_sysroot_get_deployments (sysroot);
OstreeDeployment *booted_deployment = ostree_sysroot_get_booted_deployment (sysroot);
g_autoptr(OstreeDeployment) pending_deployment = NULL;
g_autoptr(OstreeDeployment) rollback_deployment = NULL;
if (booted_deployment)
ostree_sysroot_query_deployments_for (sysroot, NULL, &pending_deployment,
&rollback_deployment);
if (deployments->len == 0)
{
g_print ("No deployments.\n");
}
else
{
for (guint i = 0; i < deployments->len; i++)
{
OstreeDeployment *deployment = deployments->pdata[i];
if (!deployment_print_status (sysroot, repo, deployment,
deployment == booted_deployment,
deployment == pending_deployment,
deployment == rollback_deployment,
cancellable,
error))
return FALSE;
}
}

View File

@ -91,3 +91,18 @@ gboolean ostree_ensure_repo_writable (OstreeRepo *repo, GError **error);
void ostree_print_gpg_verify_result (OstreeGpgVerifyResult *result);
gboolean ot_enable_tombstone_commits (OstreeRepo *repo, GError **error);
/* Copied from rpm-ostree's rpmostree-libbuiltin.h */
#define TERM_ESCAPE_SEQUENCE(type,seq) \
static inline const char* ot_get_##type (void) { \
if (glnx_stdout_is_tty ()) \
return seq; \
return ""; \
}
TERM_ESCAPE_SEQUENCE(red_start, "\x1b[31m")
TERM_ESCAPE_SEQUENCE(red_end, "\x1b[22m")
TERM_ESCAPE_SEQUENCE(bold_start, "\x1b[1m")
TERM_ESCAPE_SEQUENCE(bold_end, "\x1b[0m")
#undef TERM_ESCAPE_SEQUENCE