]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: add -L to colorize output
authorKarel Zak <kzak@redhat.com>
Mon, 2 Sep 2013 08:54:30 +0000 (10:54 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 16 Sep 2013 14:47:09 +0000 (16:47 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisks/fdisk-ask.c
fdisks/fdisk-menu.c
fdisks/fdisk.8
fdisks/fdisk.c
fdisks/fdisk.h
include/colors.h
lib/colors.c

index 6c10a48c3461cb77d5d170cd481a2043a62b487b..2d689e558502133c8275ca3a59e8441060be0737 100644 (file)
@@ -192,11 +192,31 @@ static int ask_offset(struct fdisk_context *cxt,
        return -1;
 }
 
-static void fputs_info(const char *msg, FILE *out)
+static void fputs_info(const char *msg, FILE *out, char *buf, size_t bufsz)
 {
        if (info_count == 1)
                fputc('\n', out);
+
+       if (msg && colors_wanted()) {
+               char *sep = _(": ");
+               char *p = strstr(msg, sep);
+
+               if (p) {
+                       size_t sz = strlen(sep);
+
+                       strncpy(buf, msg, bufsz);
+                       buf[p - msg + sz] = '\0';
+
+                       color_enable(UL_COLOR_BROWN);
+                       fputs(buf, out);
+                       color_disable();
+                       fputs(p + sz, out);
+                       goto done;
+               }
+       }
+
        fputs(msg, out);
+done:
        fputc('\n', out);
 }
 
@@ -219,16 +239,20 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask,
                return ask_offset(cxt, ask, buf, sizeof(buf));
        case FDISK_ASKTYPE_INFO:
                info_count++;
-               fputs_info(fdisk_ask_print_get_mesg(ask), stdout);
+               fputs_info(fdisk_ask_print_get_mesg(ask), stdout, buf, sizeof(buf));
                break;
        case FDISK_ASKTYPE_WARNX:
+               color_fenable(UL_COLOR_RED, stderr);
                fputs(fdisk_ask_print_get_mesg(ask), stderr);
+               color_fdisable(stderr);
                fputc('\n', stderr);
                break;
        case FDISK_ASKTYPE_WARN:
+               color_fenable(UL_COLOR_RED, stderr);
                fputs(fdisk_ask_print_get_mesg(ask), stderr);
                errno = fdisk_ask_print_get_errno(ask);
                fprintf(stderr, ": %m\n");
+               color_fdisable(stderr);
                break;
        case FDISK_ASKTYPE_YESNO:
                fputc('\n', stdout);
index 3a5a57434752124935b21e4883e85242c976ab57..0ead2e4779d3ce4a0134712aa06a8034316dc4c0 100644 (file)
@@ -326,9 +326,11 @@ int print_fdisk_menu(struct fdisk_context *cxt)
        while ((e = next_menu_entry(cxt, &mc))) {
                if (IS_MENU_HID(e))
                        continue;       /* hidden entry */
-               if (IS_MENU_SEP(e))
+               if (IS_MENU_SEP(e)) {
+                       color_enable(UL_COLOR_BOLD);
                        printf("\n  %s\n", _(e->title));
-               else
+                       color_disable();
+               } else
                        printf("   %c   %s\n", e->key, _(e->title));
        }
        fputc('\n', stdout);
index 439f0f62f4a0decac11ed5875fe96317e93bd481..a7555847679d2aad84fe1c2a0825e6e302e5cbdc 100644 (file)
@@ -218,6 +218,10 @@ A reasonable value is 63.  This option is DEPRECATED.
 .BI \-h
 Display a help text and exit.
 .TP
+.BI \-L[=\fIwhen\fR]
+Colorize output in interactive mode.  The optional argument \fIwhen\fP can
+be \fBauto\fR, \fBnever\fR or \fBalways\fR. The default is \fBauto\fR.
+.TP
 .B \-l
 List the partition tables for the specified devices and then exit.
 If no devices are given, those mentioned in
index 05f4ccb584ef5249879db70fd40fc8588f3de3f7..ec0c5447f9e9e46ec40b68133a2465f5d9416980 100644 (file)
@@ -60,6 +60,8 @@ static void __attribute__ ((__noreturn__)) usage(FILE *out)
        fputs(_(" -b <size>         sector size (512, 1024, 2048 or 4096)\n"), out);
        fputs(_(" -c[=<mode>]       compatible mode: 'dos' or 'nondos' (default)\n"), out);
        fputs(_(" -h                print this help text\n"), out);
+       fputs(_(" -c[=<mode>]       compatible mode: 'dos' or 'nondos' (default)\n"), out);
+       fputs(_(" -L[=<when>]       colorize output (auto, always or never)\n"), out);
        fputs(_(" -u[=<unit>]       display units: 'cylinders' or 'sectors' (default)\n"), out);
        fputs(_(" -v                print program version\n"), out);
        fputs(_(" -C <number>       specify the number of cylinders\n"), out);
@@ -341,6 +343,7 @@ enum {
 int main(int argc, char **argv)
 {
        int i, c, act = ACT_FDISK;
+       int colormode = UL_COLORMODE_AUTO;
        struct fdisk_context *cxt;
 
        setlocale(LC_ALL, "");
@@ -355,7 +358,7 @@ int main(int argc, char **argv)
 
        fdisk_context_set_ask(cxt, ask_callback, NULL);
 
-       while ((c = getopt(argc, argv, "b:c::C:hH:lsS:u::vV")) != -1) {
+       while ((c = getopt(argc, argv, "b:c::C:hH:lL::sS:u::vV")) != -1) {
                switch (c) {
                case 'b':
                {
@@ -402,6 +405,11 @@ int main(int argc, char **argv)
                case 'l':
                        act = ACT_LIST;
                        break;
+               case 'L':
+                       if (optarg)
+                               colormode = colormode_or_err(optarg,
+                                               _("unsupported color mode"));
+                       break;
                case 's':
                        act = ACT_SHOWSIZE;
                        break;
@@ -454,13 +462,17 @@ int main(int argc, char **argv)
                if (argc-optind != 1)
                        usage(stderr);
 
+               colors_init(colormode);
+
                if (fdisk_context_assign_device(cxt, argv[optind], 0) != 0)
                        err(EXIT_FAILURE, _("cannot open %s"), argv[optind]);
 
                /* Here starts interactive mode, use fdisk_{warn,info,..} functions */
-               fdisk_info(cxt, _("Welcome to fdisk (%s).\n\n"
-                        "Changes will remain in memory only, until you decide to write them.\n"
-                        "Be careful before using the write command.\n"), PACKAGE_STRING);
+               color_enable(UL_COLOR_GREEN);
+               fdisk_info(cxt, _("Welcome to fdisk (%s).\n"), PACKAGE_STRING);
+               color_disable();
+               fdisk_info(cxt, _("Changes will remain in memory only, until you decide to write them.\n"
+                                 "Be careful before using the write command.\n"));
                fflush(stdout);
 
                if (!fdisk_dev_has_disklabel(cxt)) {
index a416f2c2533273d44cee4d5dee50c7326e833aba..0f427e29e83e39911c2451961c0510783b14b23d 100644 (file)
@@ -11,7 +11,7 @@
  */
 #include "fdiskP.h"
 #include "blkdev.h"
-
+#include "colors.h"
 
 extern void toggle_units(struct fdisk_context *cxt);
 
index b6c99171a8994dca08cbd9ce6798ca2380daa40d..d2bd7b2aa56318e482c4721c882971cef6c57430 100644 (file)
@@ -53,10 +53,25 @@ extern int colormode_or_err(const char *str, const char *errmsg);
 /* Initialize the global variable OUT_IS_TERM */
 extern int colors_init(int mode);
 
+/* Returns 1 or 0 */
+extern int colors_wanted(void);
+
 /* Set the color to CLR_SCHEME */
-extern void color_enable(const char *clr_scheme);
+extern void color_fenable(const char *clr_scheme, FILE *f);
+
+static inline void color_enable(const char *clr_scheme)
+{
+       color_fenable(clr_scheme, stdout);
+}
 
 /* Reset colors to default */
-extern void color_disable(void);
+extern void color_fdisable(FILE *f);
+
+static inline void color_disable(void)
+{
+       color_fdisable(stdout);
+}
+
+
 
 #endif /* UTIL_LINUX_COLORS_H */
index c8075cc1eb6dbdce2636efbd1965d12c06287c60..51faa010ad88bfa3ade4bc8b3e182c5e79649307 100644 (file)
@@ -27,16 +27,21 @@ int colors_init(int mode)
        return ul_color_term_ok;
 }
 
-void color_enable(const char *color_scheme)
+int colors_wanted(void)
+{
+       return ul_color_term_ok;
+}
+
+void color_fenable(const char *color_scheme, FILE *f)
 {
        if (ul_color_term_ok && color_scheme)
-               fputs(color_scheme, stdout);
+               fputs(color_scheme, f);
 }
 
-void color_disable(void)
+void color_fdisable(FILE *f)
 {
        if (ul_color_term_ok)
-               fputs(UL_COLOR_RESET, stdout);
+               fputs(UL_COLOR_RESET, f);
 }
 
 int colormode_from_string(const char *str)